<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
點讚的數位增加和減少並不是整個替換,而是差異化替換。再加上動畫效果就看的很舒服。
下面用一張圖來展示我的思路:
現在只需要根據這張圖,寫出對應的動畫即可。 分為2種場景:
公共部分就是: 不變的文字不需要做任何處理,繪製在2號區域就行。繪製差異化文字時,需要加上不變的文字的寬度就行。
class LikeView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : View(context, attrs, defStyleAttr) { private val paint = Paint().also { it.isAntiAlias = true it.textSize = 200f } private val textRect0 = Rect(300, 100, 800, 300) private val textRect1 = Rect(300, 300, 800, 500) private val textRect2 = Rect(300, 500, 800, 700) private var nextNumberAlpha: Int = 0 set(value) { field = value invalidate() } private var currentNumberAlpha: Int = 255 set(value) { field = value invalidate() } private var offsetPercent = 0f set(value) { field = value invalidate() } private val fontMetrics: FontMetrics = paint.fontMetrics private var currentNumber = 99 private var nextNumber = 0 private var motionLess = currentNumber.toString() private var currentMotion = "" private var nextMotion = "" private val animator: ObjectAnimator by lazy { val nextNumberAlphaAnimator = PropertyValuesHolder.ofInt("nextNumberAlpha", 0, 255) val offsetPercentAnimator = PropertyValuesHolder.ofFloat("offsetPercent", 0f, 1f) val currentNumberAlphaAnimator = PropertyValuesHolder.ofInt("currentNumberAlpha", 255, 0) val animator = ObjectAnimator.ofPropertyValuesHolder( this, nextNumberAlphaAnimator, offsetPercentAnimator, currentNumberAlphaAnimator ) animator.duration = 200 animator.interpolator = DecelerateInterpolator() animator.addListener( onEnd = { currentNumber = nextNumber } ) animator } override fun onDraw(canvas: Canvas) { paint.alpha = 255 paint.color = Color.LTGRAY canvas.drawRect(textRect0, paint) paint.color = Color.RED canvas.drawRect(textRect1, paint) paint.color = Color.GREEN canvas.drawRect(textRect2, paint) paint.color = Color.BLACK if (motionLess.isNotEmpty()) { drawText(canvas, motionLess, textRect1, 0f) } if (nextMotion.isEmpty() || currentMotion.isEmpty()) { return } val textHorizontalOffset = if (motionLess.isNotEmpty()) paint.measureText(motionLess) else 0f if (nextNumber > currentNumber) { paint.alpha = currentNumberAlpha drawText(canvas, currentMotion, textRect1, textHorizontalOffset, -offsetPercent) paint.alpha = nextNumberAlpha drawText(canvas, nextMotion, textRect2, textHorizontalOffset, -offsetPercent) } else { paint.alpha = nextNumberAlpha drawText(canvas, nextMotion, textRect0, textHorizontalOffset, offsetPercent) paint.alpha = currentNumberAlpha drawText(canvas, currentMotion, textRect1, textHorizontalOffset, offsetPercent) } } private fun drawText( canvas: Canvas, text: String, rect: Rect, textHorizontalOffset: Float = 0f, offsetPercent: Float = 0f ) { canvas.drawText( text, rect.left.toFloat() + textHorizontalOffset, rect.top + (rect.bottom - rect.top) / 2f - (fontMetrics.bottom + fontMetrics.top) / 2f + offsetPercent * 200, paint ) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() animator.end() } fun plus() { if (currentNumber == Int.MAX_VALUE) { return } nextNumber = currentNumber + 1 processText(findEqualsStringIndex()) if (animator.isRunning) { return } animator.start() } fun minus() { if (currentNumber == 0) { return } nextNumber = currentNumber - 1 processText(findEqualsStringIndex()) if (animator.isRunning) { return } animator.start() } private fun findEqualsStringIndex(): Int { var equalIndex = -1 val nextNumberStr = nextNumber.toString() val currentNumberStr = currentNumber.toString() val endIndex = min(currentNumberStr.length, nextNumberStr.length) - 1 for (index in 0..endIndex) { if (nextNumberStr[index] != currentNumberStr[index]) { break } equalIndex = index } return equalIndex } private fun processText(index: Int) { val currentNumberStr = currentNumber.toString() val nextNumberStr = nextNumber.toString() if (index == -1) { motionLess = "" currentMotion = currentNumberStr nextMotion = nextNumberStr } else { motionLess = currentNumberStr.substring(0, index + 1) currentMotion = currentNumberStr.substring(index + 1) nextMotion = nextNumberStr.substring(index + 1) } } }
到此這篇關於Android自定義View模仿即刻點贊數位切換效果的文章就介紹到這了,更多相關Android模仿即刻點贊數位切換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45