Android實(shí)現(xiàn)弧形菜單效果
前言:公司需求,自己寫的一個(gè)弧形菜單!
效果:

開發(fā)環(huán)境:AndroidStudio2.2.1+gradle-2.14.1
涉及知識(shí):1.自定義控件,2.事件分發(fā)等
部分代碼:
public class HomePageMenuLayout extends ViewGroup {
private Context context;
// 菜單項(xiàng)的文本
private String[] mItemTexts = null;
private int StatusHeight;//狀態(tài)欄高度
public HomePageMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
StatusHeight = ScreenUtils.getStatusHeight(context);
}
/**
* 設(shè)置布局的寬高,并策略menu item寬高
*/
int resWidth = 0;
int resHeight = 0;
int mRadius = 0;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//布局寬高尺寸設(shè)置為屏幕尺寸
//設(shè)置該布局的大小
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
/**
* 根據(jù)傳入的參數(shù),分別獲取測(cè)量模式和測(cè)量值
*/
int width = MeasureSpec.getSize(widthMeasureSpec);
resHeight = MeasureSpec.getSize(heightMeasureSpec);
resWidth = MeasureSpec.getSize(widthMeasureSpec);
// 獲得半徑
mRadius = (int) (resHeight / 2 - 2 * StatusHeight);
//設(shè)置item尺寸
int childSize = (int) (mRadius * 1 / 2);
// menu item測(cè)量模式--精確模式
int childMode = MeasureSpec.EXACTLY;
for (int i = 0; i < getChildCount(); i++) {
final View child = getChildAt(i);
if (child.getVisibility() == GONE) {
continue;
}
// 計(jì)算menu item的尺寸;以及和設(shè)置好的模式,去對(duì)item進(jìn)行測(cè)量
int makeMeasureSpec = -1;
makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize, childMode);
child.measure(makeMeasureSpec, makeMeasureSpec);
}
}
/**
* item布局的角度
*/
private int[] widthall = null;
/**
* 設(shè)置Item的位置:第一個(gè)參數(shù)1:該參數(shù)指出當(dāng)前ViewGroup的尺寸或者位置是否發(fā)生了改變
* 2.當(dāng)期繪圖光標(biāo)橫坐標(biāo)位置
* 3.當(dāng)前繪圖光標(biāo)縱坐標(biāo)位置
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int left, top;
int cWidth = (int) (mRadius * 1 / 2);
final int childCount = getChildCount();
// 計(jì)算,中心點(diǎn)到menu item中心的距離
float tmp = mRadius - cWidth / 2;
// 遍歷去設(shè)置menuitem的位置
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
if (child.getVisibility() == GONE) {
continue;
}
left = (int) (mRadius * Math.cos(Math.toRadians(widthall[i]))) - 65;
top = (int) (mRadius - (resHeight / 2 - 2 * StatusHeight) * Math.sin(Math.toRadians(widthall[i])) - StatusHeight);
child.layout(left, top, left + cWidth, top + cWidth);
}
}
public interface OnMenuItemClickListener {
void itemClick(View view, int pos);
}
public void setOnMenuItemClickListener(
OnMenuItemClickListener mOnMenuItemClickListener) {
this.mOnMenuItemClickListener = mOnMenuItemClickListener;
}
// 菜單的個(gè)數(shù)
private int mMenuItemCount;
/**
* 設(shè)置菜單條目的圖標(biāo)和文本
*/
public void setMenuItemIconsAndTexts(String[] mItemTexts) {
this.mItemTexts = mItemTexts;
this.mMenuItemCount = mItemTexts.length;
resultAngle();
addMenuItems();
}
private void resultAngle() {
switch (this.mMenuItemCount) {
case 3:
widthall = Constants.ITEM3;
break;
case 4:
widthall = Constants.ITEM4;
break;
case 5:
widthall = Constants.ITEM5;
break;
case 6:
widthall = Constants.ITEM6;
break;
case 7:
widthall = Constants.ITEM7;
break;
case 8:
widthall = Constants.ITEM8;
break;
case 9:
widthall = Constants.ITEM9;
break;
case 10:
widthall = Constants.ITEM10;
break;
default:
break;
}
}
/**
* 設(shè)置菜單條目的圖標(biāo)和文本
*/
public void setMenuItemIconsAndTexts() {
addMenuItems();
}
private int mMenuItemLayoutId = R.layout.homepage_item_layout;
/**
* MenuItem的點(diǎn)擊事件接口
*/
private OnMenuItemClickListener mOnMenuItemClickListener;
private float yPosition = 0;
/**
* 添加菜單項(xiàng)
*/
private void addMenuItems() {
LayoutInflater mInflater = LayoutInflater.from(getContext());
/**
* 根據(jù)用戶設(shè)置的參數(shù),初始化view
*/
for (int i = 0; i < mMenuItemCount; i++) {
final int j = i;
View view = mInflater.inflate(mMenuItemLayoutId, this, false);
final ImageView iv = (ImageView) view
.findViewById(R.id.homepage_pager1_item_img);
final TextView tv = (TextView) view
.findViewById(R.id.homepage_pager1_item_tv);
if (iv != null) {
iv.setImageResource(R.mipmap.menu_ture);
}
if (tv != null) {
tv.setText(mItemTexts[i]);
}
view.findViewById(R.id.homepage_item_layout).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {}
});
view.findViewById(R.id.homepage_item_layout).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
yPosition = event.getY();//獲取按下的位置
iv.setImageResource(R.mipmap.menu);
} else if (event.getAction() == MotionEvent.ACTION_UP) {
iv.setImageResource(R.mipmap.menu_ture);
float displacement = Math.abs(yPosition - event.getY());
//精確按下的位置做出響應(yīng)
if (mOnMenuItemClickListener != null&&displacement<25) {
mOnMenuItemClickListener.itemClick(v,j);
}
} else if (event.getAction() == MotionEvent.ACTION_CANCEL || event.getAction() == MotionEvent.ACTION_POINTER_UP) {
iv.setImageResource(R.mipmap.menu_ture);
}
return true;
}
});
addView(view);
}
}
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
- Android實(shí)現(xiàn)自定義的衛(wèi)星式菜單(弧形菜單)詳解
- android圖像繪制(七)ClipRect局部繪圖/切割原圖繪制總結(jié)
- android圖像繪制(四)自定義一個(gè)SurfaceView控件
- android圖像繪制(二)畫布上放大縮小問題
- android圖像繪制(六)獲取本地圖片或拍照?qǐng)D片等圖片資源
- android圖像繪制(五)畫布保存為指定格式/大小的圖片
- android圖像繪制(一)多種方法做圖像鏡像
- android圖像繪制(三)畫布刷屏問題記錄
- Android開發(fā)筆記之:在ImageView上繪制圓環(huán)的實(shí)現(xiàn)方法
- Android編程繪制圓形圖片的方法
- Android編程繪圖操作之弧形繪制方法示例
相關(guān)文章
Android應(yīng)用退出登錄的實(shí)現(xiàn)方法
每一個(gè)app都會(huì)有一個(gè)”退出登陸”的功能,當(dāng)點(diǎn)擊退出之后需要將所有的Activity都finish掉,開始是想將棧中的所有Activity清除掉,但是沒有找到方法,后來用廣播實(shí)現(xiàn)了。下面小編給大家分享android應(yīng)用退出登錄的實(shí)現(xiàn)方法,需要的朋友參考下2017-04-04
Android加載Gif動(dòng)畫實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android加載Gif動(dòng)畫實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
android獲得當(dāng)前view在屏幕中坐標(biāo)的方法
這篇文章主要介紹了android獲得當(dāng)前view在屏幕中坐標(biāo)的方法,涉及Android針對(duì)view坐標(biāo)相關(guān)屬性的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android 取消藍(lán)牙配對(duì)框?qū)崿F(xiàn)自動(dòng)配對(duì)功能
這篇文章主要介紹了Android 取消藍(lán)牙配對(duì)框?qū)崿F(xiàn)自動(dòng)配對(duì)功能,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android實(shí)現(xiàn)左側(cè)滑動(dòng)菜單
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)左側(cè)滑動(dòng)菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
VS Code開發(fā)React-Native及Flutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試問題
這篇文章主要介紹了VS Code開發(fā)React-Native,F(xiàn)lutter 開啟無線局域網(wǎng)安卓真機(jī)調(diào)試,需要的朋友可以參考下2020-04-04

