Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121
#1

Как запустить анимацию - Android

10.12.2015, 12:16. Просмотров 238. Ответов 2
Метки нет (Все метки)

Мне необходимо запустить анимацию без вызова startAnimation. В чем суть. Есть кастомный вьюв, у которого есть свои анимируемые элементы, они анимируются одновременно, соответственно используется кастомная анимация. Приводит ее код тут не буду, так как она ничем не отличается от ScaleAnimation, кроме нескольких вспомогательных интерфейсов. Запускает она следующим кодом.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private class Animate extends AsyncTask<Void, Void, Void> {
 
        @Override
        protected Void doInBackground(Void... params) {
            while (animationBlock) {}
            publishProgress();
 
            return null;
        }
 
        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
 
            for (int i = 0; i < images.size(); i++) {
                ScaleCustomAnimation animation = new ScaleCustomAnimation(ANIMATION_MIN_SCALE, 1f, ANIMATION_MIN_SCALE, 1f);
                animation.setFillEnabled(true);
                animation.setFillEnabled(true);
                animation.setFillEnabled(true);
                animation.setDuration(animationShowDuration);
                animation.setPosition(i);
                animation.setOnTransformationListener(new ScaleCustomAnimation.OnTransfoirmationListener() {
                    @Override
                    public void onTransform(float sx, float sy, int position) {
                        matrixes.get(position).setScale(sx, sy);
                        invalidate();
                    }
                });
                startAnimation(animation);
            }
        }
    }
Проблема данного кода, заключена в том, что startAnimation, заменяет уже установленную анимацию, и получается что анимируется только последний объект в массиве. Попытки содрать код метода startAnimation из View ни к чему не привели, анимация не стартует. Делал вот так.
Java
1
2
animation.setStartTime(Animation.START_ON_FIRST_FRAME);
invalidate();
Так вот вопрос - как запустить анимацию?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2015, 12:16     Как запустить анимацию
Посмотрите здесь:

Android Как крутить анимацию по кругу
Как создать анимацию при переходе между экранами? Android
Как сделать анимацию при загрузки приложения Android
Как запустить приложение? Android
Android Как убрать анимацию?
Как реализовать анимацию в андроид? Android
Android Как перенести из 3d max анимацию в приложении на андроиде?
Frame animation или как сделать анимацию Android
Android Как установить Gif анимацию в качестве фона?
Android Как из сервиса запустить fragment
Как сделать анимацию объемного поворота? Android
Как запустить метод из Service? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bastrakov
91 / 91 / 14
Регистрация: 10.10.2015
Сообщений: 307
Записей в блоге: 1
10.12.2015, 17:12     Как запустить анимацию #2
ниче не понял, но у меня работает так:
Java
1
myView.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.my_anim));
Serbis
3 / 3 / 2
Регистрация: 13.07.2012
Сообщений: 121
13.12.2015, 11:50  [ТС]     Как запустить анимацию #3
bastrakov, сам отвечу на свой вопрос. Существуют ситуации, когда нужно анимировать не сам вьюв, а отдельную его часть, например пишете вы некую особую галерею картинок. Вам нужно анимировать например появление картинки. Проблема в том, что эта картинка является не объектов класса View, а объектом Bitmap на канве которая рисуется в onDraw и к ней нельзя применить обычный аниматор. Т. е. что бы ее например сдвинуть, нужно получить от класса аниматора значение интерполяции, и на его основе произвести расчет нового положения картинки и провести частичную инвалидацию вьюва. Метод startAnimation вызывает анимацию к матрице всего вьюва, а не к его отдельной части, и исправить это никак нельзя. Т. е. если у вас три картинки которые нужно анимировать, нужно будет по логике три раза вызывать startAnimation. Но ничего не получится, так как каждый последующий вызов блокирует предыдущий. Класс Animation, который я так упорно пытался заставить работать, это базовый класс, с очень сложной инициализацие. Под простым вызовом startAnimation, находится как я понял не одна сотня строк по настройке объекта Animation и делать это в рамках кастномного вьюва просто нелогично. Для этого был придуман класс ValueAnimator, который ничего не делает, кроме того что считает интерполяцию, которая собственно и нужна для решения этой задачи. Вот собственно класс который мне был нужен, кастомная scale анимация, определяющая положение Bitmap от интреполятора. Может быть кому пригодится.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
public class ScaleCustomAnimation extends ValueAnimator {
    public interface OnTransfoirmationListener {
        public void onTransform(float sx, float sy, int position);
    }
 
    private OnTransfoirmationListener onTransfoirmationListener;
 
    private final Resources mResources;
 
    private float mFromX;
    private float mToX;
    private float mFromY;
    private float mToY;
 
    private int mFromXType = TypedValue.TYPE_NULL;
    private int mToXType = TypedValue.TYPE_NULL;
    private int mFromYType = TypedValue.TYPE_NULL;
    private int mToYType = TypedValue.TYPE_NULL;
 
    private int mFromXData = 0;
    private int mToXData = 0;
    private int mFromYData = 0;
    private int mToYData = 0;
 
    private int mPosition  = 0;
 
 
    public ScaleCustomAnimation(float fromX, float toX, float fromY, float toY) {
        mResources = null;
        mFromX = fromX;
        mToX = toX;
        mFromY = fromY;
        mToY = toY;
    }
 
    public ScaleCustomAnimation(float fromX, float toX, float fromY, float toY,
                                float pivotX, float pivotY) {
        mResources = null;
        mFromX = fromX;
        mToX = toX;
        mFromY = fromY;
        mToY = toY;
    }
 
    public ScaleCustomAnimation(float fromX, float toX, float fromY, float toY,
                                int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
        mResources = null;
        mFromX = fromX;
        mToX = toX;
        mFromY = fromY;
        mToY = toY;
    }
 
    public int getPosition() {
        return mPosition;
    }
 
    public void setPosition(int mPosition) {
        this.mPosition = mPosition;
    }
 
    float resolveScale(float scale, int type, int data, int size, int psize) {
        float targetSize;
        if (type == TypedValue.TYPE_FRACTION) {
            targetSize = TypedValue.complexToFraction(data, size, psize);
        } else if (type == TypedValue.TYPE_DIMENSION) {
            targetSize = TypedValue.complexToDimension(data, mResources.getDisplayMetrics());
        } else {
            return scale;
        }
 
        if (size == 0) {
            return 1;
        }
 
        return targetSize/(float)size;
    }
 
    public void init(int width, int height, int parentWidth, int parentHeight) {
        mFromX = resolveScale(mFromX, mFromXType, mFromXData, width, parentWidth);
        mToX = resolveScale(mToX, mToXType, mToXData, width, parentWidth);
        mFromY = resolveScale(mFromY, mFromYType, mFromYData, height, parentHeight);
        mToY = resolveScale(mToY, mToYType, mToYData, height, parentHeight);
    }
 
    public void animate() {
        setFloatValues(0f, 1f);
        setInterpolator(new AccelerateDecelerateInterpolator());
        addUpdateListener(new AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float interpolatedTime = (Float) (animation.getAnimatedValue());
                float sx = 1.0f;
                float sy = 1.0f;
                if (mFromX != 1.0f || mToX != 1.0f) {
                    sx = mFromX + ((mToX - mFromX) * interpolatedTime);
                }
                if (mFromY != 1.0f || mToY != 1.0f) {
                    sy = mFromY + ((mToY - mFromY) * interpolatedTime);
                }
 
                onTransfoirmationListener.onTransform(sx, sy, mPosition);
 
            }
        });
        start();
    }
 
    public void setOnTransformationListener(OnTransfoirmationListener onTransfoirmationListener) {
        this.onTransfoirmationListener = onTransfoirmationListener;
    }
}
Yandex
Объявления
13.12.2015, 11:50     Как запустить анимацию
Ответ Создать тему
Опции темы

Текущее время: 20:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru