2010-11-22 2 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일까요?

내가 가지고있는 또 다른 문제는 바퀴가 움직이기를 멈추고 싶지만 Animation의 메소드 cancel()은 API 레벨 8이고 1.5에서 작동해야합니다. 회전을 어떻게 멈추어야합니까?

+0

나는 이것을 테스트했으며, API가 말한 것처럼 여백이 회전하지 않는 것을 확인할 수 있습니다 : "이 공간은이보기의 경계 밖에 있습니다." ([ViewGroup.MarginLayoutParams] (http://developer.android.com/reference/android/view/ViewGroup.MarginLayoutParams.html)) – st4r0pr4m

답변

1

패딩을 사용하는 대신 휠 ImageView를 배치하는 더 좋은 방법을 생각할 수 있습니까?

"올바른 답변"은 내 생각에 독자적인 레이아웃 관리자를 만드는 것입니다. Leastways, 그것이 우리가 들었던 것입니다. 나는 그것을 한 번 시도하고 그것을 작동하게 만들 수 없었다.

별로 답이없는 대답은 패딩이 아닌 여백이 될 수 있습니다. View에 여백을 애니메이션으로 표시하지 않았으므로 여백 회전 여부를 알 수 없습니다. 패딩은 위젯의 "내부"로 간주되기 때문에 회전해야합니다.

맞지 않는 대답은 여백 또는 여백이 아닌 투명 View을 심으로 사용하는 것입니다. shim의 크기가 ImageView이되도록 원하는만큼 여백이나 패딩없이 ImageView을 shim에 맞게 조정하십시오.

노하우가 잘 맞으면 위젯을 완전히 덤프하고 Canvas 및 2D 그래픽 API를 사용하여 위젯을 모두 그립니다. Angry Birds는 예를 들어 ImageViews을 사용하지 않는 것으로 추정됩니다.

+0

각 휠을 패딩이 적용된 'RelativeLayout'에 배치하여 고정했습니다. 바퀴의. 감사! – Macarse