看了hyman老师的视频,听起来有点迷糊,所以就想把实现卫星菜单的实现总结一下。长话短说,下面总结一下:

一、自定义ViewGroup
1)、自定义属性文件

属性的定义:

<attr name="position">
<enum name="left_top" value="0"/>
<enum name="left_bottom" value="1"/>
<enum name="right_top" value="2"/>
<enum name="right_bottom" value="3"/>
<enum name="center_bottom" value="4"/>
</attr>
<attr name="radius" format="dimension"/>

这里需要注意的是:如何将属性文件和自定义的ViewGroup联系起来

通过ArcMenu将其联系起来,而ArcMenu就是我们自定义的ViewGroup

<declare-styleable name="ArcMenu">
<attr name="position"/>
<attr name="radius"/>
</declare-styleable>

2)、在布局文件中使用
这里需要注意的是:注意命名空间的使用
xmlns:hyman="http://schemas.android.com/apk/res/com.example.arcmenu"
这里分为两个部分:
第一个部分是:http://schemas.android.com/apk/res/


第二个部分是:com.example.arcmenu(这个可以在AndroidManifest.xml中有自定义的ViewGroup的包名)


3)、在自定义控件中读取

创建自定义ViewGroup

public class ArcMenu extends ViewGroup

{

}

然后可以按照下边的步骤就行相关的操作,实现相应的方法

自定义属性的读取方法:

首先需要获取的自定义的属性

TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ArcMenu, defStyle, 0);

然后获取自定义属性的值

int position = typedArray.getInt(R.styleable.ArcMenu_position, POSITION_RIGHT_BOTTOM);

4)关于自定义控件的布局

这里我主要着重讲一下主菜单在下面中间位置的布局:

首先获得主菜单的长度宽度:

int width = mCButton.getMeasuredWidth();
int height = mCButton.getMeasuredHeight();

要想主菜单放到屏幕的中间位置:

则他的x坐标为l = getMeasuredWidth() / 2 - width / 2;

y坐标为:t = getMeasuredHeight() - height;

最后布局

mCButton.layout(l, t, l + width, t + height);

子菜单的布局位置

t1 = (int) (mRadius * Math.sin(Math.PI / count * (i + 1)));
l1= (int) (mRadius * Math.cos(Math.PI / count * (i + 1)));

最终子菜单的坐标

l = getMeasuredWidth() / 2 - width / 2 - l1;
t = getMeasuredHeight() - height - t2;

子菜单布局

child.layout(l, t, l + width, t + height);

4)、设置主按钮的旋转动画

这里边的0.5f 表示的是相对与self的坐标位置

RotateAnimation anim = new RotateAnimation(start, end, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
anim.setDuration(duration);
anim.setFillAfter(true);
view.startAnimation(anim);

5)、为menuItem添加平移动画(这里需要注意的是:在设置主菜单关闭与打开状态的时候,注意其修改的位置)

if (mCurrentStatus == Status.IS_CLOSED)
{
tranAnim = new TranslateAnimation(xflag * cl, 0, yflag * ct, 0);
childView.setClickable(true);
childView.setFocusable(true);
}
else
{
tranAnim = new TranslateAnimation(0, xflag * cl, 0, yflag * ct);
childView.setClickable(false);
childView.setFocusable(false);
}

tranAnim.setFillAfter(true);
tranAnim.setDuration(duration);
tranAnim.setStartOffset((i * 100) / count);
tranAnim.setAnimationListener(new AnimationListener()
{

@Override
public void onAnimationStart(Animation animation)
{

}

@Override
public void onAnimationRepeat(Animation animation)
{

}

@Override
public void onAnimationEnd(Animation animation)
{
if (mCurrentStatus == Status.IS_CLOSED)
{
childView.setVisibility(View.GONE);
}

}
});
RotateAnimation rotateAnim = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnim.setDuration(duration);
rotateAnim.setFillAfter(true);

animset.addAnimation(rotateAnim);
animset.addAnimation(tranAnim);
childView.startAnimation(animset);

这里需要注意的是:监听子菜单的动画监听事件,当动画结束的时候,需要修改其主菜单的状态。

6)、实现menuItem的点击动画

这里就是关于叠加动画的添加

首先创建动画集

AnimationSet animationSet = new AnimationSet(true);

其次创建缩小,以及渐变动画

ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f, Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
AlphaAnimation alphaAnim = new AlphaAnimation(1f, 0.0f);

最后将动画添加到动画集
animationSet.addAnimation(scaleAnim);
animationSet.addAnimation(alphaAnim);

设置时长和状态
animationSet.setDuration(duration);
animationSet.setFillAfter(true);

最终效果图如下:

demo下载,请点击此处

转载于:https://www.cnblogs.com/persist-confident/p/4487386.html

android 实现自定义卫星菜单相关推荐

  1. android 开发卫星菜单,android之类似卫星菜单,来自定义ViewGroup。。。。。

    这是一个继承ViewGroup的自定义控件,对于高手来说比较简单,但对于我们这样的小白,确实是一个不错的demo 定义继承ViewGroup的自定义View  ,需要实现它的两个基本方法, onMea ...

  2. 【Android】自定义环形菜单View

    实现的效果图:六个小图片可以跟随手指滑动绕中心点旋转 代码: package com.example.test_canvas;import java.util.ArrayList; import ja ...

  3. Android项目开发实战—自定义左右菜单

    Android实现自定义左右菜单 功能描述: 在左中右三个区域分别承载三个不同的view,把它全部添加进来,而我们实现左右菜单,就是来控制当前显示的是哪一部分:如果显示中间菜单,就把中间菜单呈现在用户 ...

  4. Android 实现卫星菜单

    步骤:一:自定义ViewGroup 1.自定义属性 a.attr.xml b.在布局文件中使用activity_main.xml c.在自定义控件中进行读取 2.onMeasure 3.onLayou ...

  5. android 自定义menu背景,Android编程实现自定义系统菜单背景的方法

    本文实例讲述了Android编程实现自定义系统菜单背景的方法.分享给大家供大家参考,具体如下: 不多说,上图,见代码. package lab.sodino.menutest; import andr ...

  6. Android自定义menu菜单布局

    一:先写一个自定义的菜单布局 menu_gallery.xml: <?xml version="1.0" encoding="utf-8"?> &l ...

  7. android 自定义menu 背景颜色,Android中设置Menu菜单的文字颜色为白色

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 开发者交流裙: 188168040 Android中设置Menu菜单的文字颜色为白色,一般情况下,Android中Menu菜单的title文字颜色为黑色, ...

  8. Android仿QQ侧滑菜单

    先上效果图: GIF图有点模糊,源码已上传Github:Android仿QQ侧滑菜单 ####整体思路: 自定义ItemView的根布局(SwipeMenuLayout extends LinearL ...

  9. tkinter 菜单添加事件_Tasker的最新测试劫持了Android 11的电源菜单

    流行的Android自动化应用Tasker 最近收到了重大更新,为该应用引入了许多新功能.该更新包括解锁应用程序读取手机上任何传感器以触发任务的功能,使您可以通过任何第三方应用程序自动发送短信或拨打电 ...

最新文章

  1. mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路
  2. 简述linux各个组成部分的定义及功能,Mariadb的架构及相关概念
  3. php程序中用户名含特殊字符怎么办,php中包含ñ等特殊字符
  4. .NET西安社区 [拥抱开源,又见 .NET] 第二次活动简报
  5. REVERSE-COMPETITION-GeekChallenge2021
  6. SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
  7. pcre安装_Nginx | Nginx的介绍和安装
  8. vue写的页面title中ico图标不显示的问题
  9. python调试方法logging_python中logging使用方法
  10. Vue生命周期钩子函数
  11. 190104每日一句
  12. bartender 10.1破解版|bartender条码打印10.1
  13. vue 函数(二):callback回调函数
  14. MOOC《程序设计入门——C语言》翁恺 第六周编程练习及答案
  15. 企查查、天眼查、启信宝的产品调研分析
  16. UG NX 12 基准轴
  17. 前端速成-CSS | 04.li标签样式、标签的正常、悬停、触发状态样式
  18. 【计算机视觉与深度学习】全连接神经网络(二)
  19. 迅视财经 设计牵手“黑科技”
  20. 今日一起喝汤啦,‘不醉不归’——意志篇

热门文章

  1. IdHTTP1.Get(url)得到的源码怎么跟直接浏览的不一样呢?
  2. Flutter AlertDialog弹框的基本使用、Flutter showDialog方法使用概述
  3. ES6学习 - Promise对象
  4. 可以接收数量不定的参数的函数
  5. EL表达式(web作业)
  6. 关于“数组指针”的一点想法
  7. [jQuery基础] jQuery动效案例(一) -- 弹窗广告、对联广告
  8. Tips--解决安装完Anaconda没有快捷方式的问题
  9. VS2005 解决应用程序配置不正确,程序无法启动问题(小问题,大思想)
  10. Matlab常用图像操作