Android实现弧形菜单效果

Android实现弧形菜单效果,第1张

概述前言:公司需求,自己写的一个弧形菜单效果:开发环境:AndroidStudio2.2.1+gradle-2.14.1

前言:公司需求,自己写的一个弧形菜单!

效果:

开发环境:AndroIDStudio2.2.1+gradle-2.14.1

涉及知识:1.自定义控件,2.事件分发等

部分代码:

public class HomePageMenulayout extends VIEwGroup { private Context context; // 菜单项的文本 private String[] mItemTexts = null; private int StatusHeight;//状态栏高度 public HomePageMenulayout(Context context,AttributeSet attrs) { super(context,attrs); this.context = context; StatusHeight = ScreenUtils.getStatusHeight(context); } /** * 设置布局的宽高,并策略menu item宽高 */ int resWIDth = 0; int resHeight = 0; int mRadius = 0; @OverrIDe protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) { //布局宽高尺寸设置为屏幕尺寸 //设置该布局的大小 setMeasuredDimension(wIDthMeasureSpec,heightmeasureSpec); /** * 根据传入的参数,分别获取测量模式和测量值 */ int wIDth = MeasureSpec.getSize(wIDthMeasureSpec); resHeight = MeasureSpec.getSize(heightmeasureSpec); resWIDth = MeasureSpec.getSize(wIDthMeasureSpec); // 获得半径 mRadius = (int) (resHeight / 2 - 2 * StatusHeight); //设置item尺寸 int childSize = (int) (mRadius * 1 / 2); // menu item测量模式--精确模式 int childMode = MeasureSpec.EXACTLY; for (int i = 0; i < getChildCount(); i++) { final VIEw child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } // 计算menu item的尺寸;以及和设置好的模式,去对item进行测量 int makeMeasureSpec = -1; makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize,childMode); child.measure(makeMeasureSpec,makeMeasureSpec); } } /** * item布局的角度 */ private int[] wIDthall = null; /** * 设置Item的位置:第一个参数1:该参数指出当前VIEwGroup的尺寸或者位置是否发生了改变 * 2.当期绘图光标横坐标位置 * 3.当前绘图光标纵坐标位置 */ @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(); // 计算,中心点到menu item中心的距离 float tmp = mRadius - cWIDth / 2; // 遍历去设置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; } // 菜单的个数 private int mMenuItemCount; /** * 设置菜单条目的图标和文本 */ 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; } } /** * 设置菜单条目的图标和文本 */ public voID setMenuItemIconsAndTexts() { addMenuItems(); } private int mMenuItemLayoutID = R.layout.homepage_item_layout; /** * MenuItem的点击事件接口 */ private OnMenuItemClickListener mOnMenuItemClickListener; private float yposition = 0; /** * 添加菜单项 */ private voID addMenuItems() { LayoutInflater mInflater = LayoutInflater.from(getContext()); /** * 根据用户设置的参数,初始化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());  //精确按下的位置做出响应  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); } }}

源码下载

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的Android实现弧形菜单效果全部内容,希望文章能够帮你解决Android实现弧形菜单效果所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1146505.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存