兩種方式實現類似水波擴散效果,先上圖為敬
自定義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...