Полный пример того, как программно сделать RotateAnimations? - PullRequest
12 голосов
/ 12 февраля 2011

Я хочу иметь анимацию с различными шагами, которые делают движения (переводы) и повороты, такие как "прямо, повернуть налево, прямо, ...." автомобиля.

Я могу сделать это за AnimationSet, но не могу вращаться вокруг центра изображения моего автомобиля с настройкой "RELATIVE_TO_SELF".Я знаю о

Animation a = new RotateAnimation(0,90,Animation.RELATIVE_TO_SELF,0.5f,... )

для этой цели.Тем не менее вращение происходит вокруг верхнего левого угла экрана (или холста?).

В настоящее время я решаю эту проблему, отслеживая положение вручную после каждого шага анимации, но это неоптимально.

Я подозреваю, что мои первоначальные настройки макета являются поддельными:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical"
>
    <FrameLayout
            android:layout_height="wrap_content"
            android:layout_width="fill_parent">

        <!-- view that draws some background -->
        <de.bsd.turtlecar.SampleView android:id="@+id/graph_view"
              android:layout_height="350px"
              android:layout_width="fill_parent"
              android:visibility="invisible"
              />

        <!-- the car -->
        <ImageView android:id="@+id/car_view"
                   android:src="@drawable/turtle_car"
                   android:layout_height="wrap_content"
                   android:layout_width="wrap_content"
                   android:visibility="invisible"/>


    </FrameLayout>

   <Button ... onClick="run" ... />
</LinearLayout>

Это показывает автомобиль в верхнем левом углу (должен отображаться в другом месте - в основном, где позже начинается анимация. И это должнопереместимся позже).

В моем коде, который запускается с помощью кнопки запуска, я делаю:

    ImageView carView = (ImageView) findViewById(R.id.car_view);
    print(carView);
    AnimationSet animationSet = new AnimationSet(true);

    TranslateAnimation a = new TranslateAnimation(
            Animation.ABSOLUTE,200, Animation.ABSOLUTE,200,
            Animation.ABSOLUTE,200, Animation.ABSOLUTE,200);
    a.setDuration(1000);
    animationSet.addAnimation(a);

    RotateAnimation r = new RotateAnimation(0f, -90f,200,200); // HERE 
    r.setStartOffset(1000);
    r.setDuration(1000);
    animationSet.addAnimation(r);
    ...

Так что в данный момент вращение работает, но я должен следить,если я поворачиваю RELATIVE_TO_SELF, вращение происходит вокруг (0,0) экрана.

Дополнительный вопрос: что я могу сделать, чтобы автомобиль оставался на экране после завершения анимации?

Или я совсем не на том пути?

1 Ответ

19 голосов
/ 30 августа 2011

Попробуйте добавить setFillAfter (true) к вашей анимации.Это, безусловно, удержит машину на своем последнем месте, и это также может решить ваши проблемы с точкой вращения

 TranslateAnimation a = new TranslateAnimation(
        Animation.ABSOLUTE,200, Animation.ABSOLUTE,200,
        Animation.ABSOLUTE,200, Animation.ABSOLUTE,200);
a.setDuration(1000);
a.setFillAfter(true); //HERE
animationSet.addAnimation(a);

RotateAnimation r = new RotateAnimation(0f, -90f,200,200); // HERE 
r.setStartOffset(1000);
r.setDuration(1000);
r.setFillAfter(true); //HERE
animationSet.addAnimation(r);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...