Анимация кнопок (TimeAnimator с ClipDrawable) не работает должным образом - PullRequest
0 голосов
/ 12 апреля 2020

Я хочу анимировать фон кнопки, заполняя его слева направо. Я использую это . Он работает правильно, когда я помещаю его в onCreate, но мне нужно анимировать кнопку, когда пользователь выбирает правильный ответ в моей викторине. Вот мой метод checkAnswer

fun checkAnswer(selectedAnswer: Button) {
        enableAnswersButton(false)
        if (selectedAnswer.text.toString() == listOfTests[currentQuestion].rightAnswer){
            val layerDrawable = selectedAnswer.background as LayerDrawable
            mClipDrawable =
                layerDrawable.findDrawableByLayerId(R.id.clip_drawable_false) as ClipDrawable

            mAnimator = TimeAnimator()
            mAnimator!!.setTimeListener(this)

            selectedAnswer.setOnClickListener {

                if (!mAnimator!!.isRunning) {
                    mCurrentLevel = 0;
                    mAnimator!!.start()
                }
            }
        } else {
            val layerDrawable = selectedAnswer.background as LayerDrawable
            mClipDrawable =
                layerDrawable.findDrawableByLayerId(R.id.clip_drawable_true) as ClipDrawable

            mAnimator = TimeAnimator()
            mAnimator!!.setTimeListener(this)


            selectedAnswer.setOnClickListener {

                if (!mAnimator!!.isRunning) {
                    mCurrentLevel = 0;
                    mAnimator!!.start()
                }
            }

Проблема в том, что анимация время от времени работает. Иногда onTimeUpdate метод не вызывается и анимация не работает.

  override fun onTimeUpdate(animation: TimeAnimator?, totalTime: Long, deltaTime: Long) {
        mClipDrawable!!.level = mCurrentLevel
        if (mCurrentLevel >= MAX_LEVEL) {
            mAnimator!!.cancel()
        } else {
            mCurrentLevel = min(MAX_LEVEL, mCurrentLevel + LEVEL_INCREMENT)
        }

    }

Пожалуйста, помогите

1 Ответ

1 голос
/ 13 апреля 2020

Я посмотрел на это !. реализация там хороша, только вы не должны использовать

  selectedAnswer.setOnClickListener {//<===this part need to be removed as its setting onClick which will work if next time same button is clicked 

            if (!mAnimator!!.isRunning) {
                mCurrentLevel = 0;
                mAnimator!!.start()
            }
        }

часть должна быть удалена как ее настройка onClick, которая будет работать, если в следующий раз та же кнопка нажмет

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

Ниже код может дать вам идею

   firstOptionTextView.setText(Put the Option here);

   if (firstOptionTextView.text.toString() == listOfTests[currentQuestion].rightAnswer){
        val layerDrawable = selectedAnswer.background as LayerDrawable
        mClipDrawable =
            layerDrawable.findDrawableByLayerId(R.id.clip_drawable_false) as ClipDrawable

        mAnimator = TimeAnimator()
        mAnimator!!.setTimeListener(this)

        firstOptionTextView.setOnClickListener {

            if (!mAnimator!!.isRunning) {
                mCurrentLevel = 0;
                mAnimator!!.start()
            }
        }
    } else {
        val layerDrawable = selectedAnswer.background as LayerDrawable
        mClipDrawable =
            layerDrawable.findDrawableByLayerId(R.id.clip_drawable_true) as ClipDrawable

        mAnimator = TimeAnimator()
        mAnimator!!.setTimeListener(this)


        firstOptionTextView.setOnClickListener {

            if (!mAnimator!!.isRunning) {
                mCurrentLevel = 0;
                mAnimator!!.start()
            }
        }

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

...