Подтвердить что ты не робот

Пользовательская анимация в Android

Я написал пользовательский View. Теперь я хочу сделать небольшую пользовательскую анимацию, когда пользователь ее коснется.

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

Каков правильный способ реализации этого?

4b9b3361

Ответ 1

Наиболее гибким (и довольно простым) способом создания пользовательской анимации является расширение класса Animation.

В общем:

  • Задайте продолжительность анимации с помощью метода setDuration().
  • Опционально установите интерполятор для вашей анимации с помощью setInterpolator() (для exapmle вы можете использовать LinearInterpolator или AccelerateInterpolator и т.д.).
  • Переопределить метод applyTransformation. Здесь нас интересует переменная interpolatedTime, которая изменяется от 0.0 до 1.0 и отражает прогресс вашей анимации.

Вот пример (я использую этот класс для изменения размера моего Bitmap. Bitmap сам рисуется в методе draw):

public class SlideAnimation extends Animation {

    private static final float SPEED = 0.5f;

    private float mStart;
    private float mEnd;

    public SlideAnimation(float fromX, float toX) {
        mStart = fromX;
        mEnd = toX;

        setInterpolator(new LinearInterpolator());

        float duration = Math.abs(mEnd - mStart) / SPEED;
        setDuration((long) duration);
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);

        float offset = (mEnd - mStart) * interpolatedTime + mStart;
        mOffset = (int) offset;
        postInvalidate();
    }

}

Также вы можете изменить View с помощью Transformation#getMatrix().

UPDATE

Если вы используете фреймворк Android Animator (или реализацию совместимости - NineOldAndroids), вы можете просто объявить setter и getter для своего пользовательского свойства View и анимировать его напрямую. Вот еще один пример:

public class MyView extends View {

    private int propertyName = 50;

    /* your code */

    public int getPropertyName() {
        return propertyName;
    }

    public void setPropertyName(int propertyName) {
        this.propertyName = propertyName;
    }

    /*
    There is no need to declare method for your animation, you 
    can, of course, freely do it outside of this class. I'm including code
    here just for simplicity of answer.
    */
    public void animateProperty() {
        ObjectAnimator.ofInt(this, "propertyName", 123).start();
    }

}

Ответ 2

Animation animation = new AnimationDrawable();
animation.addFrame(getResources().getDrawable(R.drawable.exp1), 50);
animation.addFrame(getResources().getDrawable(R.drawable.exp2), 50);
animation.addFrame(getResources().getDrawable(R.drawable.exp3), 50);
animation.addFrame(getResources().getDrawable(R.drawable.exp4), 50);
animation.addFrame(getResources().getDrawable(R.drawable.exp5), 50);
animation.addFrame(getResources().getDrawable(R.drawable.exp6), 50);

Это код, который я использую для создания пользовательской анимации по кадру в моем onCreate().

После этого мне нужно запустить анимацию, но нужно сделать это внутри потока пользовательского интерфейса. Поэтому я использую Runnable.

class Starter implements Runnable {
    public void run() {
        animation.stop();
        animation.start();
    }
}

Я запускаю Runnable из onClick(), используя метод .post() ImageView:

((ImageView) findViewById(R.id.ImageToAnimateOnClicking)).post(new Starter());

Ответ 3

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

Bitmap bm = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_888);
Canvas c = new Canvas(bm);
.... Draw to bitmap
animation.addFrame(bm,50)
.... repeat for all frames you wish to add.

Ответ 4

Существует четыре типа анимации, которые вы можете добавить к своему пользовательскому представлению.

  • alpha - анимированная прозрачность элемента
  • translate - анимированное положение элемента
  • масштаб - размер анимации
  • rotate - анимация вращения элемента

Вот сообщение в блоге, которое подробно объясняет каждую из них.

Как только вы закончите создание анимации, просто используйте приведенный ниже код, чтобы добавить эту пользовательскую анимацию в представление.

findById(R.id.element).startAnimation(AnimationUtils.loadAnimation(this, R.anim.custom_animation));

Ответ 5

В дополнение к определению анимации анимации в формате XML вы также можете определять покадровые анимации (хранящиеся в res/drawable).

<animation-list
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:oneshot="true"
>
    <item android:drawable="@drawable/frame1" android:duration="300" />
    <item android:drawable="@drawable/frame2" android:duration="300" />
    <item android:drawable="@drawable/frame3" android:duration="300" />
</animation-list>

Задайте анимацию как фон вида через setBackgroundResource.

Если вы хотите сделать что-то более сложное, ознакомьтесь с классом Canvas. См. Краткое введение о том, как рисовать с помощью Canvas.