Android ScaleAnimation работает только с перерывами - PullRequest
0 голосов
/ 15 апреля 2020

Эти последовательные анимации появляются в действии, которое запускается несколько раз в течение приложения, которое представляет собой игру викторины. До сих пор анимации работали без перебоев в эмуляторе Nexus One API 15, но в эмуляторе Nexus 5 API 25 или Nexus 5 API 27 чаще всего анимации работают только при первом запуске операции, а затем не выполняются в последующих запусках, хотя, по-видимому, в случайным образом они иногда работают должным образом в эмуляторах Nexus 5.

Причина, по которой существует анимация, которая ничего не делает (staticAnimation), за которой следует реальная анимация, та, которая фактически сжимает изображение (shrinkAnimation), потому что shrinkAnimation вообще не работала, когда запускалась обработчиком, и это было решением, которое я нашел для реализации 3-секундной задержки. Проблема сохраняется, когда staticAnimation удалена и shrinkAnimation настроен на запуск в одиночку.

Мое предпочтительное решение было бы для go с использованием ScaleAnimation в целом, так как это кажется ненадежной реализацией. Есть ли альтернатива, которая делает то же самое?

largeIv.post(new Runnable() {
    @Override
    public void run() {
        float largeHeight = largeIv.getHeight();
        float smallHeight = smallIv.getHeight();
        float heightRatio = smallHeight / largeHeight;

        if (heightRatio < 1) {
            final ScaleAnimation shrinkAnimation = new ScaleAnimation(
                    1.0f,
                    heightRatio,
                    1.0f,
                    heightRatio,
                    Animation.RELATIVE_TO_SELF,
                    0.5f,
                    Animation.RELATIVE_TO_SELF,
                    0.0f
            );

            shrinkAnimation.setDuration(500);

            final ScaleAnimation staticAnimation = new ScaleAnimation(
                    1.0f,
                    1.0f,
                    1.0f,
                    1.0f
            );

            staticAnimation.setDuration(3000);

            largeIv.setAnimation(staticAnimation);
            staticAnimation.start();

            staticAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    findViewById(R.id.imageAttrLarge).setVisibility(INVISIBLE);
                    largeIv.setAnimation(shrinkAnimation);
                    shrinkAnimation.start();
                }
            });

            shrinkAnimation.setAnimationListener(new Animation.AnimationListener() {
                @Override
                public void onAnimationStart(Animation animation) {
                    findViewById(R.id.imageAttrLarge).setVisibility(GONE);
                }

                @Override
                public void onAnimationRepeat(Animation animation) {
                }

                @Override
                public void onAnimationEnd(Animation animation) {
                    largeIv.setVisibility(GONE);
                    smallIv.setVisibility(VISIBLE);
                    imageAttrSmall.setVisibility(VISIBLE);

                    switch (question.get("qType")) {
                        case "3_CHOICE":
                            Log.d(LOG_TAG, "fStartThreeChoiceCountdown() should be called");
                            fStartThreeChoiceCountdown();
                            break;

                        case "4_CHOICE":
                            fStartFourChoiceCountdown();
                            break;

                        case "5_CHOICE":
                            fStartFiveChoiceCountdown();
                            break;

                        case "4_VANISH":
                            fStartFourVanishCountdown();
                            break;

                        case "5_VANISH":
                            fStartFiveVanishCountdown();
                            break;
                    }
                }
            });
        } else {
            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    imageLargeLl.setVisibility(GONE);
                    smallIv.setVisibility(VISIBLE);
                    imageAttrSmall.setVisibility(VISIBLE);

                    switch (question.get("qType")) {
                        case "3_CHOICE":
                            fStartThreeChoiceCountdown();
                            break;

                        case "4_CHOICE":
                            fStartFourChoiceCountdown();
                            break;

                        case "5_CHOICE":
                            fStartFiveChoiceCountdown();
                            break;

                        case "4_VANISH":
                            fStartFourVanishCountdown();
                            break;

                        case "5_VANISH":
                            fStartFiveVanishCountdown();
                            break;
                    }
                }
            }, 3500);
        }
    }
});
...