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 開発者のスレッドを読んだ後RotateAnimation、ホイールを奇妙な動きにするパディングを含むビュー全体を回転させることに気付きました。

これを修正するにはどうすればよいですか? パッドを使用する代わりに車輪を配置するより良い方法を考えられますImageViewか?

私が抱えているもう1つの問題は、特定の時点で車輪の動きを止めたいということですが、cancel()メソッドはAnimationSince: API Level 8であり、これを1.5で動作させる必要があります。回転を止めるにはどうすればよいですか?

4

1 に答える 1

1

パディングを使用する代わりに、ホイールをImageViewに配置するためのより良い方法を考えられますか?

「正しい答え」は、独自のレイアウトマネージャーを作成することだと思います。少なくとも、それは私たちが言われたことです。一度試してみましたが、うまくいきませんでした。

それほど正しくない答えは、パディングではなくマージンである可能性があります。マージンViewを使用してアニメーションを作成したことがないため、マージンが回転するかどうかはわかりません。パディングはウィジェットの「内部」と見なされるため、回転する必要があります。

正しくない答えは、余白パディングViewではなく、透明部分をシムとして使用することです。シムのサイズを希望の位置に設定して、余白やパディングなしでシムに対して相対的な位置を合わせます。ImageViewImageView

ノウハウがあれば、ウィジェットを完全にダンプし、Canvas2DグラフィックスAPIを使用してすべてを描画することをお勧めします。たとえば、AngryBirdsはおそらくを使用しませんImageViews

于 2010-11-22T12:55:18.987 に答える