Конец анимации не плавно переходит на новое изображение - PullRequest
0 голосов
/ 21 октября 2019

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

вот мой код

private val bottomSheetCallback = object:BottomSheetBehavior.BottomSheetCallback(){
        override fun onSlide(p0: View, p1: Float) {}

        /**
         * Listen to state changes of the bottom sheet
         */
        @SuppressLint("SwitchIntDef")
        override fun onStateChanged(p0: View, state: Int) {
            when(state){
                BottomSheetBehavior.STATE_COLLAPSED -> startRotateAnimation()
                BottomSheetBehavior.STATE_EXPANDED -> startRotateAnimation()
            }
        }

        private fun startRotateAnimation(){
            val rotateAnimation:RotateAnimation = RotateAnimation(0f,180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f)
            rotateAnimation.duration = 500
            rotateAnimation.setAnimationListener(object : Animation.AnimationListener {

                override fun onAnimationStart(animation: Animation?) {
                }

                override fun onAnimationRepeat(animation: Animation?) {
                }

                override fun onAnimationEnd(animation: Animation?) {
                    when(_scannedBarcodesList.state){
                        BottomSheetBehavior.STATE_COLLAPSED -> expand.setImageResource(R.drawable.ic_keyboard_arrow_up_24px)
                        BottomSheetBehavior.STATE_EXPANDED -> expand.setImageResource(R.drawable.ic_keyboard_arrow_down_24px)
                    }
                }
            })
            expand.startAnimation(rotateAnimation)
        }
    }

Я пытаюсь повернуть изображение на 180 градусов (поэтому стрелка вверх указываетвниз, например), а затем в конце анимации фактически переключите вид изображения на стрелку вниз, но, как я уже говорил, анимация, кажется, заканчивается до того, как изображение изменится, показывая стрелку вверх в течение миллисекунды, поэтому она выглядит плохо.

Как избавиться от окончания анимации до переключения изображения?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

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

попробуйте этот способ

public static void rotateView(ImageView iv, int stateOfBottomSheet){
        RotateAnimation rotateAnimation;
        if(stateOfBottomSheet == BottomSheetBehavior.STATE_COLLAPSED){
            rotateAnimation = new RotateAnimation(180.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        }else {
            rotateAnimation = new RotateAnimation(0.0f,180.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        }
        rotateAnimation.setInterpolator(new DecelerateInterpolator());
        rotateAnimation.setRepeatCount(0);
        rotateAnimation.setDuration(300);
        rotateAnimation.setFillAfter(true);
        iv.startAnimation(rotateAnimation);
    }
0 голосов
/ 30 октября 2019

Я поместу стрелки (векторные рисунки) в верхнюю часть нижнего листа и попытаюсь повернуть их на 180 ° по часовой стрелке и против часовой стрелки.

BottomSheetBehavior bottomSheetBehavior = BottomSheetBehavior.from(mBottomSheet);

        // change the state of the bottom sheet
        bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);

        // set callback for changes
        bottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                // Called every time when the bottom sheet changes its state.
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                if (isAdded()) {
                    animateBottomSheetArrows(slideOffset);
                }
            }
        });

здесь используется метод animateBottomSheetArrows

  private void animateBottomSheetArrows(float slideOffset) {
            // Animate counter-clockwise
            mLeftArrow.setRotation(slideOffset * -180);
            // Animate clockwise
            mRightArrow.setRotation(slideOffset * 180);
        }

Эта анимация довольно проста. Мы просто передаем наше значение slideOffset в метод animateBottomSheetArrows и используем его для установки значения поворота наших изображений.

...