BouncingMenu一款彈跳菜單控件
彈跳菜單控件是一款專門脫離于Activity的一個自定義控件纹烹。
特點(diǎn)概述:
- 動態(tài)加載 :不用在XML布局文件中聲明定義沃琅;</br>
-
框架化 :可以直接像
Toast.makeText(getBaseContext(),"",Toast.LENGTH_SHORT).show()
婆排,利用了建造者模式來調(diào)用霉猛;</br> - 動畫美感 :利用了屬性動畫钻蹬。</br>
效果圖:</br>
[圖片上傳失敗...(image-abc547-1576144706679)]</br>
思路
*****并不是在Activity
之上建立一個FrameLayout佛致,這個控件是獨(dú)立于Activity
之上的贮缕,相當(dāng)于一個menu
一樣,可以獨(dú)立存在俺榆,那么我們就要得到最外層的布局DecorView
感昼,在它之上添加一個獨(dú)立的布局;
*****那么還要畫出最上面的圓弧形狀罐脊,它其實(shí)就是一個貝塞爾曲線定嗓,這里我們動態(tài)加載的布局要畫上一個上方帶有圓弧的圖形;
*****這個布局上也可以加載數(shù)據(jù)萍桌,當(dāng)然這里數(shù)據(jù)可以用ListView
,也可以用RecyclerView
宵溅,我這里選擇了后者;
*****為了顯示好看曲線上炎,我們用到了屬性動畫
使用</br>
BoucingMenu.make(getBaseContext(),main_layout,R.layout.menu_boucing).show();
引申
本例最主要的是如何得到DecorView
恃逻,通過android源碼我們知道DecorView
是Activity
布局中最外層的一個布局,而我們真正意義上的xml中書寫的布局都是它的Child<\br>
/**
* 找到DecorView的根布局
* @param view
*/
private ViewGroup findSuitableParent(View view){
ViewGroup fallBack = null;
do{
if (view instanceof FrameLayout){
if (view.getId() == android.R.id.content){
return (ViewGroup)view;
}else{
fallBack = (ViewGroup) view;
}
}
if (view != null){
ViewParent parent = view.getParent();
view = parent instanceof View ? (View) parent : null;
}
}while (view != null);
return fallBack;}
畫出的曲線用到的是貝塞爾曲線藕施,畫曲線那么這里利用了path.quarTo();
,想見更多關(guān)于貝塞爾曲線寇损,那么請移步
--https://github.com/heavenxue/AsLixueAndroids/blob/master/lixuelib/src/main/java/com/aibei/lixue/lixuelib/view/PathBezier.java
具體的代碼地址
https://github.com/heavenxue/BouncingControls
如果有什么問題的可以留言,有問題的可以進(jìn)入我的github
進(jìn)行討論铅碍。
如果此篇文章對您有幫助或者您很感興趣润绵,那么小手指別忘了點(diǎn)個贊哦!么么噠胞谈,謝謝關(guān)注尘盼!歡迎star 和 follow ??