如何让button要点两次.contextmeau.单机一次出现单机两次关闭

欢迎转载,但请保留文章原始出处&_&
生命壹号:http://www.cnblogs.com/smyhvae/
文章来源:
从官方文档了解到,从Android3.0(API level 11)开始,Android设备不再要求提供一个专门的菜单按钮,转而推荐使用ActionBar。所以现在市面上很多新设备使用三个虚拟按键,并不再额外提供菜单按钮。
因为Android版本的发展,对于菜单的支持各个版本有很大的区别,而Android3.0是个分水岭,大概可以分为下面三类:
OptionMenu和ActionBar:一些操作的集合,如果开发的平台在Android3.0之上,推荐使用ActionBar,如果开发的平台在Android2.3或之下,还是可以使用OptionMenu的。
ContextMenu和ActionMode:ContextMenu是一个浮动的窗口形式展现一个选项列表,ActionMode是一个显示在屏幕顶部的操作栏,允许用户选择多个选项,ActionMode在Android3.0之后才有支持。
Popup Menu:PopupMenu是固定在View上的模态菜单,以弹出的方式显示,在Android3.0之后才有支持。
【在XML中定义一个菜单】
Android提供了标准的XML格式的资源文件来定义菜单项,并且对所有菜单类型都支持,推荐使用XML资源文件来定义菜单,之后再把它Inflater到Activity或者Fragment中,而不是在Activity中使用代码声明。
而菜单的XML资源文件,需要创建在/res/menu/目录下,并且包含一下几个元素:
&menu&:定义一个Menu,是一个菜单资源文件的根节点,里面可以包含一个或者多个&item&和&group&元素。
&item&:创建一个MenuItem,代表了菜单中一个选项。
&group&:对菜单项进行分组,可以以组的形式操作菜单项。
&item&元素除了常规的id、icon、title属性的支持,还有一个重要的属性:android:showAsAction,这个属性是起兼容性的,描述了在Android的高版本中,菜单项何时以何种方式加入到ActionBar中。
&group&是对菜单进行分组,分组后的菜单显示效果并没有区别,唯一的区别在于可以针对菜单组进行操作,这样对于分类的菜单项,操作起来更方便,提供如下的操作:
Menu.setGroupCheckable():菜单组内的菜单是否都可选。
Menu.setGroupVisible():是否隐藏菜单组的所有菜单。
Menu.setGroupEnabled():菜单组的菜单是否有用。
如果菜单项需要单选或者多选,可以使用android:checkableBehavior属性设置,它可以对单个&item&或者&group&设置一个组,这个属性接受三个参数:single,单选;all,多选,none,没有Checked的选项,默认。
当创建好一个XML菜单资源文件之后,可以使用MenuInflater.inflate()方法填充菜单资源,使XML资源变成一个可编程的对象。
一、Options menu选项菜单:
OptionMenu,选项菜单,单击手机上的菜单键(MENU)出现,必须设备具有菜单按钮才可以触发。因为屏幕的限制,最多只能展示六个菜单项,如果定义的菜单项超出了六个,其他的菜单项将被隐藏,第六个菜单将会显示&更多&,点击展开更多的菜单。虽说在Android3.0之后不再推荐使用选项菜单,但是如果使用了,在Android3.0之后的设备上,选项菜单项将被默认转移到ActionBar中,这个可以通过android:showAsAction属性控制。
创建选项菜单的核心步骤:
(1)重写Activity的onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
(2)调用Menu 的add( )方法添加菜单项(MenuItem),同时可以调用MenuItem的setIcon()方法为菜单项设置图标(注:Android 3.0之后,即使添加了图标也不会显示)
(3)重写Activity的OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件
来看一下具体的代码实现:
新建Android工程MenuTest:
【方式一】通过配置文件添加Menu选项
(1)在res/menu/main.xml中定义菜单项。main.xml的代码如下:
&menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menutest.MainActivity" &
android:id="@+id/start"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/start"/&
android:id="@+id/over"
android:orderInCategory="200"
android:showAsAction="never"
android:title="@string/over"/&
注:第9行和第15行的字符串引用,需要提前在strings.xml文件中设置好。
(2)MainActivity.java:
1 package com.example.
3 import android.app.A
4 import android.os.B
5 import android.view.M
6 import android.view.MenuI
7 import android.widget.T
10 public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//重写onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
//填充选项菜单(读取XML文件、解析、加载到Menu组件上)
getMenuInflater().inflate(R.menu.main, menu);
return true;
//重写OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件(根据id来区分是哪个item)
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.start:
Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
case R.id.over:
Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
核心代码是第24行:引用布局文件menu.xml,然后在30行的方法中添加MenuItem的点击事件。
运行程序,效果如下:
如果想让MenuItem变成ActionBar的形式,可以修改res/menu/main.xml中的android:showAsAction属性,它的属性值一共有下面几种:
其中,ifRoom表示:如果有空间,就显示出来。withText表示:只显示文本(如果配了图标的话)。如果将属性设置为always,效果如下:
如果需要添加子菜单,可以修改menu.xml文件为如下所示:
&menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menutest.MainActivity" &
android:id="@+id/start"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/start"/&
android:id="@+id/over"
android:orderInCategory="200"
android:showAsAction="never"
android:title="@string/over"/&
&!-- 子菜单 --&
android:id="@+id/setting"
android:title="setting"&
android:id="@+id/setting1"
android:orderInCategory="300"
android:showAsAction="never"
android:title="声音設置"/&
android:id="@+id/setting2"
android:orderInCategory="400"
android:showAsAction="never"
android:title="背景設置"/&
于是,子菜单的点击事件为:
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case R.id.start:
Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
case R.id.over:
Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
case R.id.setting1:
Toast.makeText(this, "声音設置", Toast.LENGTH_SHORT).show();
case R.id.setting2:
Toast.makeText(this, "背景設置", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
运行效果如下:
【方式二】通过Java代码添加Menu选项:
当然了,上方的方式一是通过xml文件来添加Menu选项的,下面我们通过Java代码来添加Menu选项(此时已经不需要menu.xml文件了)。修改MainActivity.java,代码如下:&
MainActivity.java:
1 package com.example.
3 import android.app.A
4 import android.os.B
5 import android.view.M
6 import android.view.MenuI
7 import android.view.SubM
8 import android.widget.T
11 public class MainActivity extends Activity {
private static final int START_ITEM = Menu.FIRST;
//Menu.FIRST的值就是1
private static final int OVER_ITEM = Menu.FIRST+1;
private static final int SET_ITEM1 = Menu.FIRST+2;
private static final int SET_ITEM2 = Menu.FIRST+3;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//重写onCreateOptionMenu(Menu menu)方法,当菜单第一次被加载时调用
public boolean onCreateOptionsMenu(Menu menu) {
// I this adds items to the action bar if it is present.
//填充选项菜单(读取XML文件、解析、加载到Menu组件上)
// getMenuInflater().inflate(R.menu.main, menu);
//通过代码的方式来添加Menu
//添加菜单项(组ID,菜单项ID,排序,标题)
menu.add(0, START_ITEM, 100, "Start");
menu.add(0, OVER_ITEM, 200, "Over");
//添加子菜单
SubMenu sub1 = menu.addSubMenu("setting");
sub1.add(1, SET_ITEM1, 300, "声音设置");
sub1.add(1, SET_ITEM2, 400, "背景设置");
return true;
//重写OptionsItemSelected(MenuItem item)来响应菜单项(MenuItem)的点击事件(根据id来区分是哪个item)
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
switch (item.getItemId()) {
case START_ITEM:
Toast.makeText(this, "开始游戏", Toast.LENGTH_SHORT).show();
case OVER_ITEM:
Toast.makeText(this, "结束游戏", Toast.LENGTH_SHORT).show();
case SET_ITEM1:
Toast.makeText(this, "声音設置", Toast.LENGTH_SHORT).show();
case SET_ITEM2:
Toast.makeText(this, "背景設置", Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
注意第35行对各个参数的解释。
运行程序,效果和上方gif图的效果是一样的。
总结:推荐用方式1来做。
二、Context menu:上下文菜单
顾名思义 与上下文(环境)有关。操作时需要长时间按住某个item不放,就会弹出Context menu。效果如下:
创建上下文菜单的核心步骤:
(1)覆盖Activity的onCreateContextMenu(Menu menu)方法,调用Menu的add()方法添加菜单项(MenuItem)
(2)覆盖Activity的onContextItemSelected(MenuItem iitem)来响应事件
(3)调用registerForContextMenu()方法来为视图注册上下文菜单。
现在通过代码来实现。
重新建一个Android工程MenuTest02,步骤如下:
我们现在activity_main.xml中添加一个按钮button1,代码就不写了。然后继续:
(1)在res/menu/main.xml中定义菜单项。main.xml的代码如下:
&menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menutest02.MainActivity" &
android:id="@+id/start"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/start"/&
android:id="@+id/over"
android:orderInCategory="200"
android:showAsAction="never"
android:title="@string/over"/&
(2)MainActivity.java:
1 package com.example.menutest02;
3 import android.app.A
4 import android.os.B
5 import android.view.ContextM
6 import android.view.MenuI
7 import android.view.V
8 import android.view.ContextMenu.ContextMenuI
9 import android.widget.B
10 import android.widget.T
13 public class MainActivity extends Activity
private Button button1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button)findViewById(R.id.button1);
//为按钮绑定上下文菜单(注意不是绑定监听器)
registerForContextMenu(button1);
//创建上下文菜单
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main, menu);
//上下文菜单的触发事件
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.start:
Toast.makeText(this, "开始&&&", Toast.LENGTH_SHORT).show();
case R.id.over:
Toast.makeText(this, "结束&&&", Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
核心代码是第22行:为按钮button1绑定上下文菜单。注意不是绑定监听器哦,不要一看到按钮就绑定监听器哈。
注:一个界面中只能有一个上下文菜单。
运行程序,长按button,效果如下:
注:如果是在java代码中添加Menu,用参数menu来天添加就行了。
三、Popup menu:弹出式菜单
 PopupMenu,弹出菜单,一个模态形式展示的弹出风格的菜单,绑在在某个View上,一般出现在被绑定的View的下方(如果下方有空间)。
注意:弹出菜单是在API 11和更高版本上才有效的。
核心步骤:
(1)通过PopupMenu的构造函数实例化一个PopupMenu对象,需要传递一个当前上下文对象以及绑定的View。
(2)调用PopupMenu.setOnMenuItemClickListener()设置一个PopupMenu选项的选中事件。
(3)使用MenuInflater.inflate()方法加载一个XML文件到PopupMenu.getMenu()中。
(4)在需要的时候调用PopupMenu.show()方法显示。
现在通过代码来实现。重新新建一个工程文件MenuTest03。步骤如下:
先在布局文件activity_main.xml中加一个按钮,代码略。
(1)在res/menu/main.xml中定义菜单项。main.xml的代码如下:
&menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.menutest03.MainActivity" &
android:id="@+id/copy"
android:orderInCategory="100"
android:title="复制"/&
android:id="@+id/delete"
android:orderInCategory="100"
android:title="粘贴"/&
(2)MainActivity.java:
1 package com.example.menutest03;
3 import android.app.Aimport android.os.B
4 import android.view.MenuI
5 import android.view.MenuI
6 import android.view.V
7 import android.view.View.OnClickL
8 import android.widget.B
9 import android.widget.PopupM
10 import android.widget.PopupMenu.OnMenuItemClickL
11 import android.widget.T
14 public class MainActivity extends Activity implements OnClickListener,OnMenuItemClickListener{
private Button button1;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);
//点击按钮后,加载弹出式菜单
public void onClick(View v) {
//创建弹出式菜单对象(最低版本11)
PopupMenu popup = new PopupMenu(this, v);//第二个参数是绑定的那个view
//获取菜单填充器
MenuInflater inflater = popup.getMenuInflater();
//填充菜单
inflater.inflate(R.menu.main, popup.getMenu());
//绑定菜单项的点击事件
popup.setOnMenuItemClickListener(this);
popup.show(); //这一行代码不要忘记了
//弹出式菜单的单击事件处理
public boolean onMenuItemClick(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.copy:
Toast.makeText(this, "复制&&&", Toast.LENGTH_SHORT).show();
case R.id.delete:
Toast.makeText(this, "删除&&&", Toast.LENGTH_SHORT).show();
return false;
注意14行代码绑定了两个监听器:OnClickListener和OnMenuItemClickListener。 在绑定OnMenuItemClickListener监听器时,选的是下面这个:
如果是在API 14及以上版本,32行34行可以合并为:popup.inflate(R.menu.main, popup.getMenu());
注意第37行代码不要忘记show。
运行程序,单击button,效果如下:
最后,附上整个文章的代码:
【工程文件】
密码:438o
阅读(...) 评论()他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)25612人阅读
【android 进阶之路】(77)
【Android 自定义控件实战】(28)
转载请标明出处:逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这么个开源项目~~~~当然本篇不是教你如何使用这个开源项目,而是教你如何自己通过自定义ViewGroup写这样的效果,自定义ViewGroup也是我的痛楚,嘿嘿,希望以此可以抛砖引玉~~效果图:1、实现思路通过效果图,会有几个问题:a、动画效果如何实现可以看出动画是从顶点外外发射的,可能有人说,那还不简单,默认元素都在定点位置,然后TraslateAnimation就好了;这样忽略了一点,就是TraslateAnimation虽然有动画效果,但是本质是不会改变按钮的位置,我们的按钮动画结束是要点击的;有人可能会说那使用属性动画,或者改变leftMagin,rightMagin;这样可能比较麻烦,其实我们可以默认让子菜单就已经在目标位置,然后GONE,当点击时还是用TraslateAnimation,把起始位置设为定点,终点位置就是我们隐藏的区域,动画结束VISIBLE.b、如何确定位置呢?这可能需要一点数学上的知识,我画了一张草图(冰天雪地,跪玻璃碴子求画下面这些图的工具):每次会根据子菜单数量,算出a这个角度,然后通过sin , cos 分别算出每个子菜单的left ,当然这是在左上的情况,如果在右上,则top还是和左上一致的,left则为 (屏幕宽度-左上算出的left) ;其他两个方位同理~整体我通过自定义一个ViewGroup,这个ViewGroup中第一个子元素为点击的按钮(你可以随便布局,随便用什么控件),接下来的子元素我认为是菜单项。根据效果图,决定展开半径和显示的位置,让用户自己去定制。下面看具体实现:2、自定义View的属性:&?xml version=&1.0& encoding=&utf-8&?&
&resources&
&attr name=&position&&
&enum name=&left_top& value=&0& /&
&enum name=&right_top& value=&1& /&
&enum name=&right_bottom& value=&2& /&
&enum name=&left_bottom& value=&3& /&
&attr name=&radius& format=&dimension&&&/attr&
&declare-styleable name=&ArcMenu&&
&attr name=&position& /&
&attr name=&radius&/&
&/declare-styleable&
&/resources&3、在自定义的ViewGroup中获取这些属性Arcmenu.java/**
* @author zhy
public class ArcMenu extends ViewGroup implements OnClickListener
private static final String TAG = &ArcMenu&;
* 菜单的显示位置
private Position mPosition = Position.LEFT_TOP;
* 菜单显示的半径,默认100dp
private int mRadius = 100;
* 用户点击的按钮
private View mB
* 当前ArcMenu的状态
private Status mCurrentStatus = Status.CLOSE;
* 回调接口
private OnMenuItemClickListener onMenuItemClickL
* 状态的枚举类
* @author zhy
public enum Status
OPEN, CLOSE
* 设置菜单现实的位置,四选1,默认右下
* @author zhy
public enum Position
LEFT_TOP, RIGHT_TOP, RIGHT_BOTTOM, LEFT_BOTTOM;
public interface OnMenuItemClickListener
void onClick(View view, int pos);
public ArcMenu(Context context)
this(context, null);
public ArcMenu(Context context, AttributeSet attrs)
this(context, attrs, 0);
* 初始化属性
* @param context
* @param attrs
* @param defStyle
public ArcMenu(Context context, AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
// dp convert to px
mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
mRadius, getResources().getDisplayMetrics());
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.ArcMenu, defStyle, 0);
int n = a.getIndexCount();
for (int i = 0; i & i++)
int attr = a.getIndex(i);
switch (attr)
case R.styleable.ArcMenu_position:
int val = a.getInt(attr, 0);
switch (val)
mPosition = Position.LEFT_TOP;
mPosition = Position.RIGHT_TOP;
mPosition = Position.RIGHT_BOTTOM;
mPosition = Position.LEFT_BOTTOM;
case R.styleable.ArcMenu_radius:
// dp convert to px
mRadius = a.getDimensionPixelSize(attr, (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100f,
getResources().getDisplayMetrics()));
a.recycle();
4、计算子元素的大小:@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
int count = getChildCount();
for (int i = 0; i & i++)
// mesure child
getChildAt(i).measure(MeasureSpec.UNSPECIFIED,
MeasureSpec.UNSPECIFIED);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}5、确定子元素的位置:@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
if (changed)
layoutButton();
int count = getChildCount();
* 设置所有孩子的位置 例如(第一个为按钮): 左上时,从左到右 ] 第2个:mRadius(sin0 , cos0)
* 第3个:mRadius(sina ,cosa) 注:[a = Math.PI / 2 * (cCount - 1)]
* 第4个:mRadius(sin2a ,cos2a) 第5个:mRadius(sin3a , cos3a) ...
for (int i = 0; i & count - 1; i++)
View child = getChildAt(i + 1);
child.setVisibility(View.GONE);
int cl = (int) (mRadius * Math.sin(Math.PI / 2 / (count - 2)
int ct = (int) (mRadius * Math.cos(Math.PI / 2 / (count - 2)
// childview width
int cWidth = child.getMeasuredWidth();
// childview height
int cHeight = child.getMeasuredHeight();
// 右上,右下
if (mPosition == Position.LEFT_BOTTOM
|| mPosition == Position.RIGHT_BOTTOM)
ct = getMeasuredHeight() - cHeight -
// 右上,右下
if (mPosition == Position.RIGHT_TOP
|| mPosition == Position.RIGHT_BOTTOM)
cl = getMeasuredWidth() - cWidth -
Log.e(TAG, cl + & , & + ct);
child.layout(cl, ct, cl + cWidth, ct + cHeight);
}首先在layoutButton中对按钮位置就行设置,以及初始化点击事件;然后从第二个子元素开始为菜单项,分别设置其位置,计算的原理就是上面我画的草图,可以再去仔细看看,动手在纸上画一画。 /**
* 第一个子元素为按钮,为按钮布局且初始化点击事件
private void layoutButton()
View cButton = getChildAt(0);
cButton.setOnClickListener(this);
int l = 0;
int t = 0;
int width = cButton.getMeasuredWidth();
int height = cButton.getMeasuredHeight();
switch (mPosition)
case LEFT_TOP:
case LEFT_BOTTOM:
t = getMeasuredHeight() -
case RIGHT_TOP:
l = getMeasuredWidth() -
case RIGHT_BOTTOM:
l = getMeasuredWidth() -
t = getMeasuredHeight() -
Log.e(TAG, l + & , & + t + & , & + (l + width) + & , & + (t + height));
cButton.layout(l, t, l + width, t + height);
}这是定位Button的代码,此时的代码已经实现了定位,如果你把onLayout中childView.setVisibility(VISIBLE)。ArcMenu的整个控件的样子已经实现了,接下来就是点击事件,已经效果动画的实现了。6、设置按钮点击事件/**
* 为按钮添加点击事件
public void onClick(View v)
mButton = findViewById(R.id.id_button);
if (mButton == null)
mButton = getChildAt(0);
rotateView(mButton, 0f, 270f, 300);
toggleMenu(300);
* 按钮的旋转动画
* @param view
* @param fromDegrees
* @param toDegrees
* @param durationMillis
public static void rotateView(View view, float fromDegrees,
float toDegrees, int durationMillis)
RotateAnimation rotate = new RotateAnimation(fromDegrees, toDegrees,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
rotate.setDuration(durationMillis);
rotate.setFillAfter(true);
view.startAnimation(rotate);
public void toggleMenu(int durationMillis)
int count = getChildCount();
for (int i = 0; i & count - 1; i++)
final View childView = getChildAt(i + 1);
childView.setVisibility(View.VISIBLE);
int xflag = 1;
int yflag = 1;
if (mPosition == Position.LEFT_TOP
|| mPosition == Position.LEFT_BOTTOM)
xflag = -1;
if (mPosition == Position.LEFT_TOP
|| mPosition == Position.RIGHT_TOP)
yflag = -1;
// child left
int cl = (int) (mRadius * Math.sin(Math.PI / 2 / (count - 2) * i));
// child top
int ct = (int) (mRadius * Math.cos(Math.PI / 2 / (count - 2) * i));
AnimationSet animset = new AnimationSet(true);
Animation animation =
if (mCurrentStatus == Status.CLOSE)
{// to open
animset.setInterpolator(new OvershootInterpolator(2F));
animation = new TranslateAnimation(xflag * cl, 0, yflag * ct, 0);
childView.setClickable(true);
childView.setFocusable(true);
{// to close
animation = new TranslateAnimation(0f, xflag * cl, 0f, yflag
childView.setClickable(false);
childView.setFocusable(false);
animation.setAnimationListener(new AnimationListener()
public void onAnimationStart(Animation animation)
public void onAnimationRepeat(Animation animation)
public void onAnimationEnd(Animation animation)
if (mCurrentStatus == Status.CLOSE)
childView.setVisibility(View.GONE);
animation.setFillAfter(true);
animation.setDuration(durationMillis);
// 为动画设置一个开始延迟时间,纯属好看,可以不设
animation.setStartOffset((i * 100) / (count - 1));
RotateAnimation rotate = new RotateAnimation(0, 720,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotate.setDuration(durationMillis);
rotate.setFillAfter(true);
animset.addAnimation(rotate);
animset.addAnimation(animation);
childView.startAnimation(animset);
final int index = i + 1;
childView.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
if (onMenuItemClickListener != null)
onMenuItemClickListener.onClick(childView, index - 1);
menuItemAnin(index - 1);
changeStatus();
changeStatus();
Log.e(TAG, mCurrentStatus.name() +&&);
点击时,触发TanslateAnimation动画,从定点向外扩展,也给点击按钮添加了一个旋转动画,每个子菜单项同样添加了旋转动画,且如果用户设置回调,调用回调接口;设置子菜单的点击事件。整体就是点击然后动画效果~~7、设置子菜单的点击事件/**
* 开始菜单动画,点击的MenuItem放大消失,其他的缩小消失
* @param item
private void menuItemAnin(int item)
for (int i = 0; i & getChildCount() - 1; i++)
View childView = getChildAt(i + 1);
if (i == item)
childView.startAnimation(scaleBigAnim(300));
childView.startAnimation(scaleSmallAnim(300));
childView.setClickable(false);
childView.setFocusable(false);
* 缩小消失
* @param durationMillis
private Animation scaleSmallAnim(int durationMillis)
Animation anim = new ScaleAnimation(1.0f, 0f, 1.0f, 0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
anim.setDuration(durationMillis);
anim.setFillAfter(true);
* 放大,透明度降低
* @param durationMillis
private Animation scaleBigAnim(int durationMillis)
AnimationSet animationset = new AnimationSet(true);
Animation anim = new ScaleAnimation(1.0f, 4.0f, 1.0f, 4.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
Animation alphaAnimation = new AlphaAnimation(1, 0);
animationset.addAnimation(anim);
animationset.addAnimation(alphaAnimation);
animationset.setDuration(durationMillis);
animationset.setFillAfter(true);
}点击的菜单项变大且慢慢透明消失,未点击的菜单项缩小消失~有兴趣的可以改成自己喜欢的动画~注:动画效果很多借鉴了eoe上那位仁兄的代码,这类动画也比较简单,就不多说了~好了,剩下就是些getter,setter了~8、布局文件:&RelativeLayout xmlns:android=&http://schemas.android.com/apk/res/android&
xmlns:tools=&http://schemas.android.com/tools&
xmlns:zhy=&http://schemas.android.com/apk/res/com.example.zhy_arcmenu&
android:layout_width=&match_parent&
android:layout_height=&match_parent& &
&com.example.zhy_arcmenu.ArcMenu
android:id=&@+id/id_arcmenu1&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
zhy:position=&left_top&
zhy:radius=&130dp& &
&RelativeLayout
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:background=&@drawable/composer_button& &
&ImageView
android:id=&@+id/id_button&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerInParent=&true&
android:src=&@drawable/composer_icn_plus& /&
&/RelativeLayout&
&ImageView
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerInParent=&true&
android:src=&@drawable/composer_camera&
android:tag=&Camera& /&
&ImageView
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerInParent=&true&
android:src=&@drawable/composer_sun&
android:tag=&Sun& /&
&ImageView
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerInParent=&true&
android:src=&@drawable/composer_place&
android:tag=&Place& /&
&ImageView
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_centerInParent=&true&
android:src=&@drawable/composer_sleep&
android:tag=&Sleep& /&
&/com.example.zhy_arcmenu.ArcMenu&嗯,第一个元素为按钮,其他的都是菜单项了~~喜欢用代码的,也可以代码生成,我是比较喜欢布局文件中写这些玩意~9、MainActivitypackage com.example.zhy_
import android.app.A
import android.os.B
import android.view.V
import android.view.W
import android.widget.ImageV
import android.widget.T
import com.example.zhy_arcmenu.ArcMenu.OnMenuItemClickL
public class MainActivity extends Activity
private ArcMenu mArcMenuLeftT
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mArcMenuLeftTop = (ArcMenu) findViewById(R.id.id_arcmenu1);
//动态添加一个MenuItem
ImageView people = new ImageView(this);
people.setImageResource(R.drawable.composer_with);
people.setTag(&People&);
mArcMenuLeftTop.addView(people);
mArcMenuLeftTop
.setOnMenuItemClickListener(new OnMenuItemClickListener()
public void onClick(View view, int pos)
Toast.makeText(MainActivity.this,
pos + &:& + view.getTag(), Toast.LENGTH_SHORT)
结束~~有任何意见欢迎指出~~
积分:51662
排名:第65名
原创:207篇
评论:15733条
长期为您推荐优秀博文、开源项目、视频等,进入还有好玩的等着你,欢迎扫一扫。
请勿重复加群,Thx
文章:11篇
阅读:251502
文章:10篇
阅读:144209
文章:67篇
阅读:6792257

我要回帖

更多关于 button点一次执行两次 的文章

 

随机推荐