返回顶部
首页 > 资讯 > 移动开发 >Android实现弧形菜单效果
  • 622
分享到

Android实现弧形菜单效果

菜单Android 2022-06-06 01:06:57 622人浏览 八月长安
摘要

前言:公司需求,自己写的一个弧形菜单! 效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识:1.自定义控件,2.事件分发等 部分代码

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

效果:

开发环境: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);
 }
 
 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);
 }
 }
 
 private int[] widthall = null;
 
 @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;
 
 private OnMenuItemClickListener mOnMenuItemClickListener;
 private float yPosition = 0;
 
 private void addMenuItems() {
 LayoutInflater mInflater = LayoutInflater.from(getContext());
 
 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图像绘制(七)ClipRect局部绘图/切割原图绘制总结android图像绘制(四)自定义一个SurfaceView控件android图像绘制(二)画布上放大缩小问题android图像绘制(六)获取本地图片或拍照图片等图片资源android图像绘制(五)画布保存为指定格式/大小的图片android图像绘制(一)多种方法做图像镜像android图像绘制(三)画布刷屏问题记录Android开发笔记之:在ImageView上绘制圆环的实现方法Android编程绘制圆形图片的方法Android编程绘图操作之弧形绘制方法示例


--结束END--

本文标题: Android实现弧形菜单效果

本文链接: https://lsjlt.com/news/21924.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android实现弧形菜单效果
    前言:公司需求,自己写的一个弧形菜单! 效果: 开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识:1.自定义控件,2.事件分发等 部分代码...
    99+
    2022-06-06
    菜单 Android
  • Android实现自定义的卫星式菜单(弧形菜单)详解
    一、前言 Android 实现卫星式菜单也叫弧形菜单,主要要做的工作如下: 1.动画的处理 2.自定义ViewGroup来实现卫星式菜单View (1)自定义属性 &n...
    99+
    2022-06-06
    自定义 菜单 Android
  • Android studio实现菜单效果
    本文实例为大家分享了Android studio实现菜单效果的具体代码,供大家参考,具体内容如下 一、onCreateOptionsMenu() 首先在res目录下新建一个menu文...
    99+
    2024-04-02
  • 基于Android实现可滚动的环形菜单效果
    效果 首先看一下实现的效果: 可以看出,环形菜单的实现有点类似于滚轮效果,滚轮效果比较常见,比如在设置时间的时候就经常会用到滚轮的效果。那么其实通过环形菜单的表现可以将其看作是一个...
    99+
    2024-04-02
  • 简单实现Android弹出菜单效果
    本文实例为大家分享了Android弹出菜单效果的具体代码,供大家参考,具体内容如下 功能描述:用户单击按钮弹出菜单。当用户选择一个菜单项,会触发MenuItemClick事件并...
    99+
    2022-06-06
    菜单 Android
  • Android实现下拉菜单Spinner效果
    Android 中下拉菜单,即如html中的<select>,关键在于调用setDropDownViewResource方法,以XML的方式定义下拉菜单要显示的模样...
    99+
    2022-06-06
    spinner Android
  • Android Drawerlayout实现侧滑菜单效果
    本文实例为大家分享了Drawerlayout侧滑菜单的具体代码,供大家参考,具体内容如下Drawerlayout的xml布局<?xml version="1.0" encoding="utf-8"?><Re...
    99+
    2023-05-30
    drawerlayout 侧滑菜单 roi
  • Android UI实现SlidingMenu侧滑菜单效果
    本篇博客给大家分享一个效果比较好的侧滑菜单的Demo,实现点击左边菜单切换Fragment。 效果如下:   主Activity代码: package com...
    99+
    2022-06-06
    菜单 slidingmenu Android
  • Android实现微博菜单弹出效果
    先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下。 说一下实现思路: 截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片; 2、创建popupwindow,完成...
    99+
    2023-05-30
    android 菜单弹出
  • Android菜单栏DIY实现效果详解
    目录前言实现的效果和思路1. 绘制底部布局2. 添加子view3. 处理事件分发4. 做个动画5. 小结前言 个人打算开发个视频编辑的APP,然后把一些用上的技术总结一下,这次主要是...
    99+
    2024-04-02
  • Android卫星菜单效果的实现方法
    Android小白第一次写博客,心情无比激动。下面给大家展示一下卫星菜单的实现。1.简单介绍卫星菜单在应用程序中,有很多展示菜单的方式,但其功能都是大同小异,这样一来,菜单的美观以及展示方式就显的尤为重要,卫星菜单就是很不错的一种。下面是本...
    99+
    2023-05-31
    android 卫星菜单 roi
  • Android使用DrawerLayout实现侧滑菜单效果
    一、概述DrawerLayout是一个可以方便的实现Android侧滑菜单的组件,我最近开发的项目中也有一个侧滑菜单的功能,于是DrawerLayout就派上用场了。如果你从未使用过DrawerLayout,那么本篇博客将使用一个简单的案例...
    99+
    2023-05-30
    android drawerlayout 侧滑菜单
  • CSS怎么实现菱形导航菜单效果代码
    这篇文章主要介绍“CSS怎么实现菱形导航菜单效果代码”,在日常操作中,相信很多人在CSS怎么实现菱形导航菜单效果代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS怎么实...
    99+
    2024-04-02
  • Android实现圆形菜单悬浮窗
    序言 Android悬浮窗的实现,主要有四个步骤: 1. 声明及申请权限2. 构建悬浮窗需要的控件3. 将控件添加到WindowManager4. 必要时更新WindowManage...
    99+
    2024-04-02
  • Android实现模仿UCweb菜单效果的方法
    本文实例讲述了Android实现模仿UCweb菜单效果的方法。分享给大家供大家参考。具体如下: UCWeb的菜单看起来不错,自己模仿做一个,思路实现如下: 1、保留menu按键...
    99+
    2022-06-06
    方法 Android
  • Android中DrawerLayout如何实现侧滑菜单效果
    这篇文章主要为大家展示了“Android中DrawerLayout如何实现侧滑菜单效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android中DrawerLayout如何实现侧滑菜单效果”...
    99+
    2023-05-30
    drawerlayout android
  • Android实现渐变色的圆弧虚线效果
    首先来看看效果图: 1,SweepGradient(梯度渲染) public SweepGradient (float cx, float cy, int[] colo...
    99+
    2022-06-06
    渐变色 Android
  • Android实现梯形TextView效果
    目录效果图:自定义代码实现逻辑:要点分析 1.背景与文本内容的绘制 2.梯形范围内外的点击事件处理 3.其它自定义属性 效果图: 自定义代码实现逻辑: public class...
    99+
    2024-04-02
  • CSS3 实现分类菜单效果
    这篇文章给大家介绍CSS3 实现分类菜单效果,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。HTML<html><head>    <title>...
    99+
    2023-06-08
  • vue实现多级菜单效果
    本文实例为大家分享了vue实现多级菜单效果的具体代码,供大家参考,具体内容如下 效果图: 效果说明: 点击父菜单,如果有子菜单就在其左侧显示出子菜单 思路: 通过递归的方式。 代码...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作