2010-11-22 17 views
1

私は別の車を表示し、ユーザーが1つを選択する必要があるアプリで働いています。 。あなたは、次に押すと車画面の外に移動し、新しいものが入って来カーアニメーション回転ホイール

は私のリソースは次のとおりです。

  • 車のボディ
  • 車のホイール

(私はそれらを必要とします車が動いたときに車輪を回転させる必要があるので離すこと)

私はAbsoluteLayoutを避けたかったので、私のCarViewは `RelativeLayでる。コード:

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アンドロイドデベロッパーのスレッドを読んだ後、私はRotateAnimationがパッディングを含む全体像を回転させて、車輪を何か変な動きをさせることに気付きました。

これはどのように修正する必要がありますか? パディングを使用する代わりに、車輪を置くためのより良い方法を考えてもいいですか?ImageView

もう1つの問題は、特定の点でホイールの動きを止めたいのですが、のAnimationにあります。APIレベル8と1.5で動作するようにする必要があります。どのように回転を停止する必要がありますか?

+0

私はこれをテストしました。APIが言うように、余白が回転しないことを確認できます。「この領域はこのビューの範囲外です。」 ([ViewGroup.MarginLayoutParams](http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html)) – st4r0pr4m

答えて

1

パディングを使用する代わりにホイールImageViewを配置する方がよいでしょうか?

「正しい答え」は、自分のレイアウトマネージャを作成することだと思います。最悪のことは、私たちに言われたことです。私は一度それを試して、それを働かせることができませんでした。

パディングではなく余裕があるかもしれません - 私はViewに余白を付けてアニメーションを試していないので、マージンが回転するかどうかわかりません。パディングはウィジェットの「内側」と見なされるため、回転する必要があります。

偶然のない答えは、余白またはパディングではなく、透明のViewをシムとして使用することです。あなたのImageViewをシムに対して相対的に調整し、余白や詰め物をなくし、シムのサイズをImageViewに設定します。

答えがわかるのは、ウィジェットを完全にダンプし、Canvasと2DグラフィックスAPIを使用してすべてを描画することです。たとえば、Angry BirdsはImageViewsを使用していない可能性があります。

+0

各ホイールを「RelativeLayout」に配置し、代わりにパディングを適用して固定しました車輪のありがとう! – Macarse

関連する問題