使用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>

相關文章
相關標籤/搜索