全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现弧形菜单效果

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

效果:

开发环境: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  # 弧形菜单  # 圆弧菜单  # 弧形Menu  # Android实现自定义的卫星式菜单(弧形菜单)详解  # android图像绘制(七)ClipRect局部绘图/切割原图绘制总结  # android图像绘制(四)自定义一个SurfaceView控件  # android图像绘制(二)画布上放大缩小问题  # android图像绘制(六)获取本地图片或拍照图片等图片资源  # android图像绘制(五)画布保存为指定格式/大小的图片  # android图像绘制(一)多种方法做图像镜像  # android图像绘制(三)画布刷屏问题记录  # Android开发笔记之:在ImageView上绘制圆环的实现方法  # Android编程绘制圆形图片的方法  # Android编程绘图操作之弧形绘制方法示例  # 按下  # 菜单项  # 第一个  # 遍历  # 自定义  # 设置为  # 点到  # 源码下载  # 状态栏  # 发生了  # 屏幕尺寸  # lt  # childMode  # child  # getChildCount  # final  # View  # childSize  # heightMeasureSpec  # text 


相关文章: 如何快速生成ASP一键建站模板并优化安全性?  如何在Windows虚拟主机上快速搭建网站?  建站主机功能解析:服务器选择与快速搭建指南  如何在西部数码注册域名并快速搭建网站?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何通过PHP快速构建高效问答网站功能?  如何配置WinSCP新建站点的密钥验证步骤?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  设计网站制作公司有哪些,制作网页教程?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何在VPS电脑上快速搭建网站?  广州建站公司哪家好?十大优质服务商推荐  宝塔新建站点为何无法访问?如何排查?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  如何通过虚拟主机空间快速建站?  手机网站制作与建设方案,手机网站如何建设?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何在宝塔面板中创建新站点?  建站之星logo尺寸如何设置最合适?  行程制作网站有哪些,第三方机票电子行程单怎么开?  如何用PHP快速搭建高效网站?分步指南  油猴 教程,油猴搜脚本为什么会网页无法显示?  高端建站三要素:定制模板、企业官网与响应式设计优化  制作销售网站教学视频,销售网站有哪些?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何注册花生壳免费域名并搭建个人网站?  建站主机解析:虚拟主机配置与服务器选择指南  网站制作报价单模板图片,小松挖机官方网站报价?  建站之星后台密码遗忘?如何快速找回?  ,如何利用word制作宣传手册?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  盘锦网站制作公司,盘锦大洼有多少5G网站?  如何选择高效便捷的WAP商城建站系统?  如何配置IIS站点权限与局域网访问?  定制建站如何定义?其核心优势是什么?  北京的网站制作公司有哪些,哪个视频网站最好?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  郑州企业网站制作公司,郑州招聘网站有哪些?  如何在新浪SAE免费搭建个人博客?  如何快速搭建高效WAP手机网站吸引移动用户?  家庭服务器如何搭建个人网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  javascript中的try catch异常捕获机制用法分析  如何在万网自助建站中设置域名及备案?  临沂网站制作企业,临沂第三中学官方网站?  h5在线制作网站电脑版下载,h5网页制作软件?  建站之星在线版空间:自助建站+智能模板一键生成方案 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。