android仿即刻點贊文字部分的自定義View的示例代碼
概述:在學(xué)習(xí)HenCoder的過程中,有一期是模仿優(yōu)秀自定義View,有一個項目是仿即刻的點贊,后來原作者在點評中提到,需要將文字和圖片分開來寫,并且模仿者的動畫實現(xiàn)由點雜亂。所以決定重現(xiàn)實現(xiàn)下文字部分的效果。并拓展了更多功能。最后說一句本文基于kotlin實現(xiàn)。不明白的地方請在評論區(qū)指出。
即刻原效果:
個人效果:
分析
從效果圖容易看出,圖中的功能主要分為兩個部分:
- 左側(cè)大拇指動畫
- 右側(cè)的文字動畫
拓展的功能包括:文字變換模式(全部和部分) 改變文字和未改變文字的間隔和顏色,文字始終位于中心位置。
一 文字的繪制
對文字繪制還不熟悉的同學(xué)請參考HenCoder系列文章,這里只對怎么實現(xiàn)居中的作一下說明。
1 水平居中
水平居中的繪制按文字變換模式分為兩種
全部改變時:
控件寬度的一半減去文字寬度的一半 即是文字開始繪制的位置
canvas.drawText(array[1], width / 2.toFloat() - halfTextWidth(array[1]), baseLineY + yOffset, mPaint) canvas.drawText(array[2], width / 2.toFloat() - halfTextWidth(array[2]), baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)
部分改變時
計算每部分文字起始位置
// 獲取部分改變的模式時的繪制文字其實起始位置 startX = width / 2.toFloat() - (2 * halfTextWidth(array[0]) + mTextSpace + 2 * halfTextWidth(array[1])) / 2 mPaint.color = mNoChangeTextColor canvas.drawText(array[0], startX, baseLineY, mPaint) mPaint.color = mChangedTextColor canvas.drawText(array[1], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + yOffset, mPaint) canvas.drawText(array[2], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)
2 垂直居中
垂直居中的實現(xiàn),最重要的是需要計算文字基線在垂直方向的位置 計算公式就不在這里解釋了
var fontMetrics = mPaint.fontMetrics // 文字基線y軸坐標(biāo) 為了 讓文字 垂直居中 val baseLineY = height / 2 - fontMetrics.top / 2 - fontMetrics.bottom / 2
二 動畫的實現(xiàn)
可以看到 我們默認(rèn)是沒有點贊的,然后點一下就贊,再點一下 取消點贊。所以思路是這樣的 首先繪制居中文字,然后在控件看不到的下方再繪制一遍,然后根據(jù)平移動畫完成這個效果,這個動畫是通過屬性動畫實現(xiàn)的。
// 為了顯示效果 根據(jù)是否是全部改變 設(shè)置不同的繪制方式
if (mChangeMode === 0) {
mPaint.color = mChangedTextColor
canvas.drawText(array[1], width / 2.toFloat() - halfTextWidth(array[1]), baseLineY + yOffset, mPaint)
canvas.drawText(array[2], width / 2.toFloat() - halfTextWidth(array[2]), baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)
} else if (mChangeMode === 1) {
/ 獲取部分改變的模式時的繪制文字其實起始位置
startX = width / 2.toFloat() - (2 * halfTextWidth(array[0]) + mTextSpace + 2 * halfTextWidth(array[1])) / 2
mPaint.color = mNoChangeTextColor
canvas.drawText(array[0], startX, baseLineY, mPaint)
mPaint.color = mChangedTextColor
canvas.drawText(array[1], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + yOffset, mPaint)
canvas.drawText(array[2], startX + 2 * halfTextWidth(array[0]) + mTextSpace, baseLineY + height / 2 + +halfOfTextHeight + yOffset, mPaint)
}
可以看到 在設(shè)置繪制垂直方向的位置的時候,都加入了一個 yOffset 的變量,通過改變這個屬性的值也顯示動畫,那個這個值的最大值很明顯就是 文字高度的一半加上控件高度的一半。
halfOfTextHeight = (fontMetrics.bottom - fontMetrics.top) / 2 textOffset = (halfOfTextHeight + height / 2)
自定義屬性動畫必須添加的 set get 方法
@Suppress("unused")
fun setYOffset(yOffset: Float) {
this.yOffset = yOffset
invalidate()
}
@Suppress("unused")
fun getYOffset() = yOffset
最后提供給外界跳用的方法
fun show() {
hasThumbs = if (hasThumbs) {
val animator = ObjectAnimator.ofFloat(this, "yOffset", -textOffset, 0f)
animator.duration = 500
animator.start()
false
} else {
val animator = ObjectAnimator.ofFloat(this, "yOffset", 0f, -textOffset)
animator.duration = 500
animator.start()
true
}
}
// 調(diào)用
val tv: ThumbsView = findViewById(R.id.thumbsView1) as ThumbsView
tv.show()
三 源碼
github地址:源碼點我直達(dá)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android自定義View之組合控件實現(xiàn)類似電商app頂部欄
這篇文章主要為大家詳細(xì)介紹了Android自定義View之組合控件,實現(xiàn)類似電商app頂部欄的相關(guān)資料,具有參考價值,感興趣的小伙伴們可以參考一下2016-05-05
Android通過自定義控件實現(xiàn)360軟件詳情頁效果
這篇文章主要給大家介紹了Android通過自定義控件實現(xiàn)360軟件詳情頁效果的相關(guān)資料,實現(xiàn)后的效果非常不錯,文中也給出了詳細(xì)的示例代碼和介紹,需要的朋友可以參考借鑒,下面來一起看看吧。2017-05-05
Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別
本文主要介紹了Android中ProgressDialog的dismiss()與cancel()方法的區(qū)別,具有很好的參考價值。下面跟著小編一起來看下吧2017-04-04
安卓監(jiān)聽屏幕的橫豎翻轉(zhuǎn)實現(xiàn)方法
這篇文章主要介紹了安卓監(jiān)聽屏幕的橫豎翻轉(zhuǎn)實現(xiàn)方法,有需要的朋友可以參考一下2013-12-12
Android 處理OnItemClickListener時關(guān)于焦點顏色的設(shè)置問題
這篇文章主要介紹了Android 處理OnItemClickListener時關(guān)于焦點顏色的設(shè)置問題的相關(guān)資料,需要的朋友可以參考下2017-02-02
務(wù)必掌握的Android十六進(jìn)制狀態(tài)管理最佳實踐
這篇文章主要為大家介紹了務(wù)必掌握的Android十六進(jìn)制狀態(tài)管理最佳實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
在不同Activity之間傳遞數(shù)據(jù)的四種常用方法
這篇文章主要介紹了在不同Activity之間傳遞數(shù)據(jù)的四種常用方法 的相關(guān)資料,需要的朋友可以參考下2016-03-03
Android開發(fā)組件化架構(gòu)設(shè)計原理到實戰(zhàn)
這篇文章主要為大家介紹了Android開發(fā)組件化架構(gòu)設(shè)計原理到實戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

