汽车动画旋转轮子

时间:2010-11-22 02:39:15

标签: android imageview rotateanimation

我正在一个显示不同汽车的应用程序中工作,用户需要选择一个。当您按下旁边的汽车时,汽车会移出屏幕,然后新的汽车进入。

我的资源是:

  • 车身
  • Car's wheel

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

我想避免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而不是使用填充吗?

我遇到的另一个问题是,在某一点上,我希望轮子停止移动,但Animation中的方法cancel()是:自动:API等级8,我需要在1.5上工作。我应该如何停止轮换?

1 个答案:

答案 0 :(得分:1)

  

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

我认为,“正确的答案”是创建自己的布局管理器。最少,这就是我们被告知的。我尝试了一次,无法让它发挥作用。

不太正确的答案可能是边距而不是填充 - 我没有尝试使用边距动画View,因此我不知道边距是否会旋转。填充应该旋转,因为它被视为小部件的“内部”。

更正确的答案是使用透明View作为垫片,而不是边距填充。将ImageView相对于垫片对齐,没有边距或填充,垫片的大小设置为将ImageView定位在您想要的位置。

如果你知道如何回答是完全转储小部件,只需使用Canvas和2D图形API绘制所有小部件。例如,“愤怒的小鸟”可能不会使用ImageViews