1

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

我的资源是:

  • 车体
  • 汽车的轮子

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

我想避免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);
    }
}

基本上我正在做的是放置汽车的车身,然后使用填充物将车轮放置在它们应该在的位置。

在阅读了这个android developer's thread 之后,我注意到RotateAnimation旋转了整个视图,包括填充使轮子做一些奇怪的运动。

我应该如何解决这个问题?你能想出一种更好的方法来放置轮子ImageView而不是使用填充物吗?

我遇到的另一个问题是,在某个时候我希望轮子停止移动,但方法cancel()Animation因为:API 级别 8,我需要它在 1.5 上工作。我应该如何停止旋转?

4

1 回答 1

1

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

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

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

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

如果你知道的话,最好的答案是完全转储小部件,然后使用Canvas2D 图形 API 将其全部绘制出来。例如,愤怒的小鸟可能不会使用ImageViews.

于 2010-11-22T12:55:18.987 回答