首页 > 解决方案 > 按钮动画(带有 ClipDrawable 的 TimeAnimator)无法正常工作

问题描述

我想通过从左到右填充来为按钮背景设置动画。我用这个。当我把它放进去时它可以正常工作,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)
        }

    }

请帮忙

标签: androidanimationkotlinandroid-animation

解决方案


我已经调查过!那里的实现很好,只有你不应该使用

  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()
            }
        }

现在,因为这个选项有一个动画师,无论是正确还是不正确,它都会被播放。


推荐阅读