代码之家  ›  专栏  ›  技术社区  ›  Macarse

汽车动画旋转轮

  •  1
  • Macarse  · 技术社区  · 14 年前

    我正在一个显示不同汽车的应用程序中工作,用户需要选择一个。当你按下“下一步”时,汽车离开屏幕,新的进来了。

    我的资源是:

    • 车身
    • 汽车车轮

    (我需要它们分开,因为当汽车移动时,我需要转动车轮)

    我想避免 AbsoluteLayout 所以我的 CarView 扩展` relativelayout。代码如下:

    public class CarView extends RelativeLayout {
    
        private ImageView mBody;
        private ImageView mLeftWheel;
        private ImageView mRightWheel;
        private float mScale;
    
        public CarView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public CarView(Context context) {
            super(context);
        }
    
        public void initView(Car car) {
            mScale = getContext().getResources().getDisplayMetrics().density;
            Context ctx = getContext();
            RelativeLayout.LayoutParams params;
    
            params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            mBody = new ImageView(ctx);
            mBody.setLayoutParams(params);
            mBody.setImageResource(R.drawable.car_body);
            addView(mBody);
    
            params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            mLeftWheel = new ImageView(ctx);
            mLeftWheel.setLayoutParams(params);
            mLeftWheel.setImageResource(R.drawable.car_wheel);
            mLeftWheel.setPadding(0, dpToPx(79), dpToPx(188), 0);
            addView(mLeftWheel);
    
    
            params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT);
            params.addRule(RelativeLayout.CENTER_IN_PARENT);
            mRightWheel = new ImageView(ctx);
            mRightWheel.setLayoutParams(params);
            mRightWheel.setImageResource(R.drawable.car_wheel);
            mRightWheel.setPadding(dpToPx(203), dpToPx(75), 0, 0);
            addView(mRightWheel);
        }
    
        public void startMoving() {
    
            RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            rotateAnimation.setInterpolator(new LinearInterpolator());
            rotateAnimation.setDuration(900L);
            rotateAnimation.setRepeatCount(Animation.INFINITE);
    
            mLeftWheel.startAnimation(rotateAnimation);
            mRightWheel.startAnimation(rotateAnimation);
        }
    
        private int dpToPx(float dp) {
            return (int) (dp * mScale + 0.5f);
        }
    }
    

    基本上我要做的就是把车身放好,然后用衬垫把轮子放在应该放的地方。

    阅读后 this Android开发者的线程我注意到 RotateAnimation 旋转整个视图,包括填充,使轮子做一些奇怪的运动。

    我该怎么解决这个问题? 你能想出一个更好的方法放轮子吗 ImageView 而不是使用填充?

    另一个问题是,在某一点上,我希望车轮停止移动,但方法 cancel() 在里面 Animation 是因为:API级别8,我需要它在1.5上工作。如何停止旋转?

    1 回复  |  直到 13 年前
        1
  •  1
  •   CommonsWare    14 年前

    你能想出一个更好的方法来放置轮子图像视图而不是使用填充吗?

    我认为,“正确的答案”是创建自己的布局管理器。至少,这是我们被告知的。我试过一次,但没能成功。

    不太正确的答案可能是空白,而不是填充——我没有尝试设置动画 View 我不知道页边距是否旋转。填充应该旋转,因为它被认为是小部件的“内部”。

    更不正确的答案是使用透明的 视图 作为垫片,而不是边缘 衬垫。调整您的 ImageView 相对于没有边距或填充的垫片,将垫片的大小设置为 图片框 在你想要的地方。

    好吧,如果你知道答案是如何完全转储小部件并使用 Canvas 和二维图形API。例如,愤怒的小鸟可能不会使用 ImageViews .