使用TextView实现相似于QQ钱包里面的余额数字的快速增长或减小效果

使用TextView实现相似于QQ钱包里面的余额数字的快速增长或减小效果

在完成一个需求时,存在一个在必定的时间内让数字从一个值变化到另外一个值的需求,当时一想有两种方式完成: 一、 使用timer在,给定的时间里面让数值加单位数值(1或者0.1等),并去改变view的text 二、 使用valueAnimator.ofFolat将初始值和终点值都放到里面,在动画改变的回调里面去是设置view的text 两种方式均可以实现,可是各有优缺点: 第一种方法:、 优势:能够实现每一单位数值的累加(好比:从1到100,每次加1.那么没次获得值就是一、二、3…100) 缺点:每一次增长的操做的时间都是必定的,致使数值过大会花很长的时间才能完成数值变化的过程。 第二种方法: 优势:经过设置动画的完成时间,能够保证数值变化的时间必定的。 缺点:理论上不能实现每一次设置给textview的值都是变化了单位数值,可是视觉上不影响。 本文采用了第二种方式实现,同时还考虑了到连续的设置不一样的数值(当第一调用是从0到100的变化,在第一次变化尚未作完时,又发生了第二次调用设置值(100到200)的状况),具体实现代码以下(kotlin):ide

/**动画

  • Created by Alan on 2018/4/14. */ class NumberFastAddFactory { private val TAG = "NumberFastAddFactory"code

    fun addNumber(textView: TextView, endNumber: Float, isDoAlphaAnim: Boolean) {orm

    if (isHasThisTextView(textView)) {
         textView.setTag(R.id.end_number, endNumber)
         startAddAnim(true, textView, isDoAlphaAnim)
     } else {
         textViewList.add(textView)
         textView.setTag(R.id.current_number, getCurrentNumber(textView))
         textView.setTag(R.id.end_number, endNumber)
         startAddAnim(false, textView, isDoAlphaAnim)
     }

    }xml

    private fun startAlphaAnim(textView: TextView) { var animSet = AnimatorSet() var disPlayAlphaAnim = ObjectAnimator.ofFloat(textView, "alpha", 0F, 1F) disPlayAlphaAnim.duration = ALPHA_ANIM_TIME var hideAlphaAnim = ObjectAnimator.ofFloat(textView, "alpha", 1F, 0F) hideAlphaAnim.duration = ALPHA_ANIM_TIME hideAlphaAnim.startDelay = ALPHA_ANIM_TIME animSet.play(disPlayAlphaAnim).before(hideAlphaAnim) animSet.start() }utf-8

    private fun getCurrentNumber(textView: TextView): Float { //若是为第一次作动画从0开始加 if (textView.getTag(R.id.current_number) == null) { return DEFAULT_NUMBER_TIME } return textView.getTag(R.id.current_number) as Float }ci

    private fun startAddAnim(isDoingAnim: Boolean, textView: TextView, isDoAlphaAnim: Boolean) { if (isDoingAnim) { (textView.getTag(R.id.current_anim) as ValueAnimator)?.cancel() } Log.d(TAG, "当前值是:${textView.getTag(R.id.current_number)}结尾值:${textView.getTag(R.id.end_number)}")rem

    var addAnim = ValueAnimator.ofFloat(textView.getTag(R.id.current_number) as Float, textView.getTag(R.id.end_number) as Float)
     addAnim.duration = ADD_NUMBER_TIME
     addAnim.addUpdateListener { animation ->
         textView.text = DecimalFormat("###,###,###.##").format(animation?.animatedValue)
         textView.setTag(R.id.current_number, animation?.animatedValue)
         Log.d(TAG, "当前的设置值是:${DecimalFormat("###,###,###.##").format(animation?.animatedValue)}")
    
     }
     addAnim.addListener(object : Animator.AnimatorListener {
         override fun onAnimationEnd(animation: Animator?) {
             textView.setTag(R.id.current_anim, null)
             textViewList.remove(textView)
         }
    
         override fun onAnimationRepeat(animation: Animator?) {
         }
    
         override fun onAnimationCancel(animation: Animator?) {
         }
    
         override fun onAnimationStart(animation: Animator?) {
             if (isDoAlphaAnim) {
                 startAlphaAnim(textView)
             }
         }
     })
     textView.setTag(R.id.current_anim, addAnim)
     addAnim.start()

    }get

    private fun isHasThisTextView(textView: TextView): Boolean { return textViewList.contains(textView) }animation

    companion object { var instance = NumberFastAddFactory() var textViewList = ArrayList<TextView>() val ADD_NUMBER_TIME = 150L val ALPHA_ANIM_TIME = 50L val DEFAULT_NUMBER_TIME: Float = 0F } } 有些人可能会有疑问R.id.end_number…这些是什么,这个是在给view setTag()的时候的id,因为不能在类里面定义变量,只能在res\values路径下建立ids.xm文件定义。

<?xml version="1.0" encoding="utf-8"?>

<resources> <!--NumberFastAddFactory中作动画所用id--> <item name="lg_value_text_value" type="id"></item> <item name="current_number" type="id"></item> <item name="start_number" type="id"></item> <item name="end_number" type="id"></item> <item name="current_anim" type="id"></item> </resources>

相关文章
相关标签/搜索