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

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

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

Как запустить анимацию - Программирование Android

10.12.2015, 12:16. Просмотров 282. Ответов 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
анимация прокручивается всего 1 раз, пробовал использовать метод setRepeatCount(); но не помогло( ImageView image = (ImageView)...

Как реализовать анимацию в андроид? - Программирование Android
Есть ли какие то хорошие уроке по анимации в андроид пло прорисовке графики хочу посмотреть разные варианты?? Чтоб анимация и графика была...

Как сделать анимацию объемного поворота? - Программирование Android
Что то типа этого: С помощью каких методов или что для этого используют?

Как перенести из 3d max анимацию в приложении на андроиде? - Программирование Android
Единственное что приходит на ум сохранять в формате stl каждый кадр, но макросом это сделать не возможно. Может кто то знает как это...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
Сообщений: 123
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;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2015, 11:50
Привет! Вот еще темы с ответами:

Как установить Gif анимацию в качестве фона? - Программирование Android
Слышал, что есть какие-то библиотеки, но там сильно муторно их прицеплять к проекту

Frame animation или как сделать анимацию - Программирование Android
Здравствуйте. Подскажите, пожалуйста, как сделать анимацию? У меня есть xml файл, создал под него папку anim и там создал этот...

Как сделать анимацию при загрузки приложения - Программирование Android
как сделать анимацию чтоб увеличивалась картинка и исчезала при параллельной загрузки головного меню!

Как создать анимацию при переходе между экранами? - Программирование Android
У меня прога состоит из нескольких экранов и я хочу сделать анимационный переход между ними, переход за принципом куба, на площадях куба,...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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