2010-11-22 104 views
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 android開發者的線程我注意到,RotateAnimation旋轉整個視圖,包括填充使輪子做一些奇怪的運動。

我該如何解決這個問題? 你能想到更好的方法來放置輪子ImageView而不是使用填充?

我的另一個問題是,在某個點我想輪子停止移動,但方法cancel()Animation是因爲:API級別8,我需要這個工作在1.5。我應該如何停止輪換?

+0

我已經測試過這個,我可以確認邊距不會旋轉,因爲API會說:「這個空間在這個視圖的邊界之外。」 ([ViewGroup.MarginLayoutParams](http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html)) – st4r0pr4m 2011-06-24 09:16:24

回答

1

你可以想到一個更好的方式來放置車輪ImageView,而不是使用填充?

我認爲,「正確答案」是創建您自己的佈局管理器。最低限度,這就是我們所知道的。我嘗試過一次,無法啓動它。

不太正確的答案可能是利潤而不是填充 - 我還沒有嘗試使用邊距動畫View,所以我不知道邊距是否旋轉。填充應該旋轉,因爲它被認爲是「內部」的部件。

甚至不太正確的答案是使用透明的View作爲墊片,而不是邊距填充。將您的ImageView相對於沒有邊距或填充的墊片對齊,並將墊片的大小設置爲將您的ImageView定位在您想要的位置。

好訣竅答案是完全轉儲小部件,並使用Canvas和2D圖形API將其全部繪製出來。例如,憤怒的小鳥大概不會使用ImageViews

+0

我修正了它將每個輪子放在一個'RelativeLayout'中,而填充應用到它上面的輪子。謝謝! – Macarse 2010-11-23 14:09:20