Android實(shí)現(xiàn)直播聊天區(qū)域中頂部的漸變效果
背景
在4月份開(kāi)發(fā)直播時(shí),有一個(gè)需求,需要實(shí)現(xiàn)一個(gè)RecylerView頂部漸變的效果
實(shí)際效果

解決思路
圖層重疊處理(本質(zhì)是alpha疊加出來(lái)的效果)
實(shí)現(xiàn)流程
保存一個(gè)圖層,然后畫(huà)漸變,最后再和原來(lái)的圖層進(jìn)行合并,達(dá)到這個(gè)效果。
涉及知識(shí)(不知道的請(qǐng)google):
* 主要通過(guò)RecyclerView 的 ItemDecoration類(lèi)進(jìn)行解決。
* Paint、Canvas、Shader、Xfermode(圖層融合)
* Gradient(漸變)
詳細(xì)過(guò)程:
圖層疊加需要通過(guò)Xfermode,Xfermode主要是讓不同圖層融合,但是有個(gè)前提,就是不同圖層需要由相同的畫(huà)筆(Paint)繪制而成。 這里就拋出了幾個(gè)問(wèn)題:
1. 如何獲取RecyclerView上每個(gè)Item的圖層?
2. 獲取到圖層,如何讓該圖層的畫(huà)筆和漸變圖層的畫(huà)筆保持一致?
3. 融合方式,參見(jiàn)Xfermode的參數(shù)?
解決方案
1. 查找資料之后,可以通過(guò)RecyclerView的ItemDecoration抽象類(lèi)獲知,繪制圖層前后的事件。 onDraw:繪制Item開(kāi)始的事件回調(diào),onDrawOver:繪制Item結(jié)束的事件回調(diào)。可以通過(guò)Parent計(jì)算獲取相應(yīng)的Item或Canvas面板。
2. Canvas的saveLayer方法,將當(dāng)前的Canvas存入Paint中,然后用該P(yáng)aint繪制漸變圖層,就實(shí)現(xiàn)兩個(gè)圖層相同畫(huà)筆這一條件。
3. 融合方式,采用DST_IN, 底部圖層是聊天Item,上層是漸變圖層,alpha融合之后就是聊天Item帶有漸變的效果。(腦部一下)
具體代碼:
public void doTopGradualEffect(){
if(recyclerView == null){
return ;
}
mPaint = new Paint();
// 融合器
final Xfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
mPaint.setXfermode(xfermode);
// 創(chuàng)造一個(gè)顏色漸變,作為聊天區(qū)頂部效果
linearGradient = new LinearGradient(0.0f, 0.0f, 0.0f, 100.0f, new int[]{0, Color.BLACK}, null, Shader.TileMode.CLAMP);
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
// 滑動(dòng)RecyclerView,渲染之后每次都會(huì)回調(diào)這個(gè)方法,就在這里進(jìn)行融合
@Override
public void onDrawOver(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(canvas, parent, state);
mPaint.setXfermode(xfermode);
mPaint.setShader(linearGradient);
canvas.drawRect(0.0f, 0.0f, parent.getRight(), 200.0f, mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(layerId);
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
layerId = c.saveLayer(0.0f, 0.0f, (float) parent.getWidth(), (float) parent.getHeight(), mPaint, Canvas.ALL_SAVE_FLAG);
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
}
});
}
Demo已經(jīng)上傳github:https://github.com/HarrisonLin/RecyclerViewEffectGather,有興趣的可以去下載。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android直播app送禮物連擊動(dòng)畫(huà)效果(實(shí)例代碼)
- Android 實(shí)現(xiàn)仿網(wǎng)絡(luò)直播彈幕功能詳解及實(shí)例
- Android實(shí)現(xiàn)炫酷的網(wǎng)絡(luò)直播彈幕功能
- Android仿斗魚(yú)直播的彈幕效果
- Android自定義View模仿虎撲直播界面的打賞按鈕功能
- Android高級(jí)UI特效仿直播點(diǎn)贊動(dòng)畫(huà)效果
- android實(shí)現(xiàn)直播點(diǎn)贊飄心動(dòng)畫(huà)效果
- Android仿直播特效之點(diǎn)贊飄心效果
- Android控件實(shí)現(xiàn)直播App點(diǎn)贊飄心動(dòng)畫(huà)
- Android貝塞爾曲線(xiàn)實(shí)現(xiàn)直播點(diǎn)贊效果
相關(guān)文章
Android利用Hero實(shí)現(xiàn)列表與詳情頁(yè)無(wú)縫切換動(dòng)畫(huà)
本文我們將利用Hero動(dòng)畫(huà)實(shí)現(xiàn)一個(gè)簡(jiǎn)單案例:實(shí)現(xiàn)列表與詳情頁(yè)無(wú)縫切換動(dòng)畫(huà),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手嘗試一下2022-06-06
android實(shí)現(xiàn)視頻的加密和解密(使用AES)
本篇文章主要介紹了android實(shí)現(xiàn)視頻的加密和解密(使用AES),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05
android網(wǎng)絡(luò)編程之a(chǎn)ndroid連接網(wǎng)絡(luò)的簡(jiǎn)單示例代碼
這篇文章主要介紹了android連接網(wǎng)絡(luò)的簡(jiǎn)單示例,需要的朋友可以參考下2014-04-04
詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案
這篇文章主要介紹了詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2016-12-12
android使用url connection示例(get和post數(shù)據(jù)獲取返回?cái)?shù)據(jù))
這篇文章主要介紹了android使用URLConnection來(lái)get和post數(shù)據(jù)獲取返回的數(shù)據(jù),大家參考使用吧2014-01-01
android實(shí)現(xiàn)點(diǎn)擊按鈕控制圖片切換
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)點(diǎn)擊按鈕控制圖片切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)
現(xiàn)在很多項(xiàng)目都需要集成百度地圖,所以就把自己做過(guò)一個(gè)項(xiàng)目的經(jīng)驗(yàn)寫(xiě)出來(lái)和大家分享,方便自己和大家使用的時(shí)候參考借鑒,下面就來(lái)一起看看Android集成百度地圖開(kāi)發(fā)流程和注意事項(xiàng)吧。2016-09-09
android利用handler實(shí)現(xiàn)倒計(jì)時(shí)功能
這篇文章主要為大家詳細(xì)介紹了android利用handler實(shí)現(xiàn)倒計(jì)時(shí)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11

