Авто анимация вращающихся колес - PullRequest
1 голос
/ 22 ноября 2010

Я работаю в приложении, которое показывает разные автомобили, и пользователь должен выбрать один.Когда вы нажимаете «Далее», автомобиль выходит за пределы экрана, и появляется новый.

Мои ресурсы:

  • Кузов автомобиля
  • Колесо автомобиля

(мне нужно, чтобы они были отделены, потому что когда машина движется, мне нужно вращать колеса)

Я хотел избежать 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 вместо использования прокладок?

Другая проблема, с которой я столкнулся, заключается в том, что в определенный момент я хочу, чтобы колеса перестали двигаться, но метод отменить() в Animation is Since: API Level 8, и мне нужно, чтобы это работало на 1.5.Как мне остановить вращение?

1 Ответ

1 голос
/ 22 ноября 2010

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

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

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

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

Ответ "хорошо, если вы знаете, как" - полностью сбросить виджеты и просто нарисовать их, используя Canvas и API для 2D-графики. Angry Birds, например, предположительно не использует ImageViews.

...