在完成一個需求時,存在一個在必定的時間內讓數字從一個值變化到另外一個值的需求,當時一想有兩種方式完成: 一、 使用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>