2010-11-22 5 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

ответ

1

Можете ли вы придумать лучший способ поместить колеса ImageView вместо использования прокладки?

«Правильный ответ», я думаю, заключается в том, чтобы создать свой собственный менеджер макетов. Наилучшим образом, это то, что нам сказали. Я попробовал один раз и не мог заставить его работать.

Ответ на не совсем правильный ответ может быть полем, а не дополнением - я не пробовал анимировать View с полями, и поэтому я не знаю, вращаются ли поля. Отступы должны вращаться, так как это считается «внутри» виджета.

Ответ на неправильный ответ заключается в использовании прозрачного View в качестве прокладки, а не поля или прокладка. Выровняйте свой ImageView относительно прокладки без полей или отступов, при этом размер прокладок установлен в положение ImageView, где вы этого хотите.

Ответ на вопрос о том, что вы должны знать, как это сделать, - полностью сбросить виджеты и просто нарисовать все это с помощью графических интерфейсов Canvas и 2D. Например, Angry Birds, по-видимому, не использует ImageViews.

+0

Я зафиксировал его, разместив каждое колесо в «RelativeLayout» с добавлением к нему дополнения колес. Благодаря! – Macarse

Смежные вопросы