Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Jimkaaa
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 6
1

AsyncTask ObjectAnimator

10.09.2017, 23:04. Просмотров 232. Ответов 2
Метки нет (Все метки)

Добрый вечер. Прошу помочь мне. Пытаюсь написать карточную игру. В игре игрок выбирает две карты, а после они разворачиваются и увеличиваются до новых областей. Саму анимацию я реализовал и она работает в главном потоке с одной картой, но мне надо сразу две. Создал AnimatorSet в котором несколько ObjectAnimator, пытаюсь завернуть их в AsyncTask. При таком раскладе сам код работает и карта увеличивается, но это происходит мгновенно, как будто не работает setDuration(5000);

Подскажите почему так происходит и как правильно реализуется применение анимации к множеству объектов?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2017, 23:04
Ответы с готовыми решениями:

Ошибка с ObjectAnimator
Здравствуйте! Подскажите пожалуйста почему возникла эта ошибка и как с ней бороться:...

Сохранение и восстановление позиции фото при перемещении через ObjectAnimator до и после паузы
Дано - ObjectAnimator, imageView. ImageView с фотографией должен переместится с левого края до...

AsyncTask
Использую AsyncTasc class MyT extends AsyncTask<Void, Void, Void> { @Override...

AsyncTask
Здравствуйте, при использовании двух одинаковых методов получается разный результат. AsyncTask в...

AsyncTask и get()
Создаю асинхронный процесс, где в onPreExecute() запускаю анимированный ProgressDialog. После...

2
Pablito
2844 / 2262 / 762
Регистрация: 12.05.2014
Сообщений: 7,919
Завершенные тесты: 1
11.09.2017, 10:13 2
где вас берут таких....

код где?
0
Jimkaaa
0 / 0 / 0
Регистрация: 30.01.2014
Сообщений: 6
11.09.2017, 17:24  [ТС] 3
Прошу прощения. Проблему с setDuration(1000) я решил. Но запуск одновременно двух анимаций так и не получается. Самое интересное, что перед увеличением карты происходить анимация поворота карты (код я не стал вставлять) и она происходит одновременно.

Во id/frame происходят все действия.
В id/cardsField раскладываются все карты из которых происходит выбор
id/llForTwoCards лейаут в который я хотел бы зумировать.



Вот разметка поля
XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id ="@+id/container">
    <ScrollView
        android:id ="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 
        <RelativeLayout
            android:id ="@+id/board"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:layout_gravity="center_horizontal">
 
            <RelativeLayout
                android:id="@+id/frame"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
 
                    <LinearLayout
                        android:id="@+id/cardsField"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        android:layout_gravity="center_vertical">
                    </LinearLayout>
 
                    <LinearLayout
                        android:id="@+id/llForTwoCards"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="horizontal"
                        android:visibility="invisible">
                        <ImageView
                            android:id="@+id/ivLeftCard"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:layout_gravity="left"
                            android:visibility="invisible"/>
                        <ImageView
                            android:id="@+id/ivRightCard"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:layout_gravity="right"
                            android:visibility="invisible"/>
                    </LinearLayout>
 
                    <ImageView
                        android:id="@+id/expanded_image"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:visibility="invisible" />
            </RelativeLayout>
 
        </RelativeLayout>
 
    </ScrollView>
</RelativeLayout>
Вот часть кода активити
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class EngineActivity extends Activity {
 
//тут я упущу весь код инициализации программы
                   
 
                        //находим все элементы и запускаем анимацию
                        //в массиве choosenCards хранятся карты с их ImageView и остальными данными
                        // от куда зумить choosenCards[0] и куда зумить ivLeftCard и ivRightCard
 
                        LinearLayout.LayoutParams paramForTwoCards = new LinearLayout.LayoutParams(widthScreen/2, widthScreen);
                        ImageView ivLeftCard = (ImageView)findViewById(R.id.ivLeftCard);
                        ImageView ivRightCard = (ImageView)findViewById(R.id.ivRightCard);
                        ivLeftCard.setLayoutParams(paramForTwoCards);
                        ivRightCard.setLayoutParams(paramForTwoCards);
                        LinearLayout layoutForTwoCards = (LinearLayout) findViewById(R.id.llForTwoCards);
                        layoutForTwoCards.setVisibility(View.VISIBLE);
 
                        ZoomingImages zi01 = new ZoomingImages(context, choosenCards[0], ivLeftCard);
                        zi01.execute();
                        ZoomingImages zi02 = new ZoomingImages(context, choosenCards[1], ivRightCard);
                        zi02.execute();

Это класс который занимается зумированием.
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
package ru.joyforfun.taropinkelephants;
 
import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.AsyncTask;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ImageView;
 
import com.bumptech.glide.Glide;
 
 
public class ZoomingImages extends AsyncTask{
 
    private ImageView thumbView;
    private ImageView expView;
    private DataCard dataCard;
    private Context context;
    private AnimatorSet set;
    private Rect startBounds;
    private Rect finalBounds;
    private Point globalOffset;
 
    public ZoomingImages (Context cont, DataCard dCard, ImageView expImageView){
        dataCard = dCard;
        thumbView = dataCard.getIvCard();
        expView = expImageView;
        context = cont;
    }
 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
 
        //if reversed
        if (dataCard.getState()){
            Glide
                    .with(context)
                    .load(dataCard.getResId())
                    .transform( new RotateTransformation( context, 180f ))
                    .into(expView);
        }else{
            Glide
                    .with(context)
                    .load(dataCard.getResId())
                    .into(expView);
        }
 
        startBounds = new Rect();
        finalBounds = new Rect();
        globalOffset = new Point();
 
        thumbView.getGlobalVisibleRect(startBounds);
        expView.getGlobalVisibleRect(finalBounds, globalOffset);
        startBounds.offset(-globalOffset.x, -globalOffset.y);
        finalBounds.offset(-globalOffset.x, -globalOffset.y);
 
        thumbView.setAlpha(0f);
        expView.setVisibility(View.VISIBLE);
 
        expView.setPivotX(0f);
        expView.setPivotY(0f);
    }
 
    @Override
    protected Object doInBackground(Object[] params) {
 
        float startScale = (float) startBounds.width() / finalBounds.width();
        float startHeight = startScale * finalBounds.height();
        float deltaHeight = (startHeight - startBounds.height()) / 2;
        startBounds.top -= deltaHeight;
        startBounds.bottom += deltaHeight;
 
        set = new AnimatorSet();
        set.play(ObjectAnimator.ofFloat(expView, View.X, startBounds.left, finalBounds.left))
                .with(ObjectAnimator.ofFloat(expView, View.Y, startBounds.top, finalBounds.top))
                .with(ObjectAnimator.ofFloat(expView, View.SCALE_X, startScale, 1f))
                .with(ObjectAnimator.ofFloat(expView, View.SCALE_Y, startScale, 1f));
 
        set.setDuration(1000);
        set.setInterpolator(new LinearInterpolator());
 
        return null;
    }
 
    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        set.start();
    }
 
 
}
Не могу понять почему анимация работает только с ivLeftCard, во вторую карту ivRightCard класс не работает. Он начинает работать в ivRightCard только тогда, когда удаляю полностью ivLeftCard.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2017, 17:24

AsyncTask
Привет. Знаю, что в AsyncTask doInBackground() обращатся к компонентам UI нельзя. Когда я пытаюсь...

Работа с AsyncTask
Попробовал использовать AsyncTask и возник вопрос. У меня есть несколько ф-й, которые парсят...

Не работает AsyncTask
Не работает AsyncTask , вот код: private void registerInBackground() { new...


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

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

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