Android 兩種方式實現類似水波擴散效果

2021-09-08 16:47:51 字數 2168 閱讀 8131

兩種方式實現類似水波擴散效果,先上圖為敬

自定義view實現

動畫實現

思路分析:通過canvas畫圓,每次改變圓半徑和透明度,當半徑達到一定程度,再次從中心開始繪圓,達到不同層級的效果,通過不斷繪製達到view擴散效果

private paint centerpaint; //中心圓paint

private int radius = 100; //中心圓半徑

private paint spreadpaint; //擴散圓paint

private float centerx;//圓心x

private float centery;//圓心y

private int distance = 5; //每次圓遞增間距

private int maxradius = 80; //最大圓半徑

private int delaymilliseconds = 33;//擴散延遲間隔,越大擴散越慢

private listspreadradius = new arraylist<>();//擴散圓層級數,元素為擴散的距離

private listalphas = new arraylist<>();//對應每層圓的透明度

style檔案裡自定義屬性

初始化

public spreadview(context context) 

public spreadview(context context, @nullable attributeset attrs)

public spreadview(context context, @nullable attributeset attrs, int defstyleattr)

確定圓心位置

@override

protected void onsizechanged(int w, int h, int oldw, int oldh)

自定義view的繪製

@override

protected void ondraw(canvas canvas)

}//當最外層擴散圓半徑達到最大半徑時新增新擴散圓

if (spreadradius.get(spreadradius.size() - 1) > maxradius)

//超過8個擴散圓,刪除最先繪製的圓,即最外層的圓

if (spreadradius.size() >= 8)

//中間的圓

canvas.drawcircle(centerx, centery, radius, centerpaint);

//todo 可以在中間圓繪製文字或者

//延遲更新,達到擴散視覺差效果

postinvalidatedelayed(delaymilliseconds);

}

xml樣式

效果圖中心圓處可以自定義寫文字,畫等等...

思路分析:通過動畫實現,imageview

不停做動畫縮放+漸變

最中心的imageview保持不變

中間一層imageview從原始放大到1.4倍,同時從不透明變為半透明

最外層的imageview從1.4倍放大到1.8倍,同時從半透明變為全透明

利用shape畫乙個圓,作為動畫基礎檢視

<?xml version="1.0" encoding="utf-8"?>

布局檢視

中間imageview的動畫

private void setanim1()
最外層imageview的動畫

private void setanim2()
效果圖相比較而言,自定義view的效果更好點,動畫實現起來更方便點。

兩種方式實現的擴散效果介紹完畢,具體專案裡還是要按需變動的。

同時歡迎關注哈

android 兩種非同步方式

使用asynctask 開啟子執行緒獲取伺服器資料,更新介面ui 非同步任務 後台執行,耗時的操作都放在這裡,相當於thread的run方法 override protected string doinbackground string.params 在執行後台任務之後,可以在這更改ui介面,相當於...

Android 廣播註冊兩種方式

兩種註冊型別的區別是 1 第一種不是常駐型廣播,也就是說廣播跟隨activity的生命週期。注意 在activity結束前,移除廣播接收器。2 第二種是常駐型,也就是說當應用程式關閉後,如果有資訊廣播來,程式也會被系統呼叫自動執行。在android下,要想接受廣播資訊,那麼這個廣播接收器就得我們自己...

兩種方式實現checkBox readonly功能

今天在做開發的時候遇到了這樣乙個問題 有乙個checkbox選項是不能被改變的。但是checkbox又是沒有readonly屬性的,這個時候我就想到了另外乙個屬性disabled,但是disabled的物件是不能提交到後台的,所以這個又被排除掉了。想了想,只能新增事件來搞定了。於是在checkbox...