Android实现自定义的卫星式菜单(弧形菜单)详解

相信大家经常在应用中会看到卫星菜单,那么这篇文章就来介绍在Android中如何实现自定义的卫星式菜单(弧形菜单),有需要的可以参考学习。

一、前言

Android 实现卫星式菜单也叫弧形菜单,主要要做的工作如下:

1.动画的处理

2.自定义ViewGroup来实现卫星式菜单View

(1)自定义属性

       a. 在attrs.xml中定义属性

       b. 在布局中使用自定义属性

       c. 在自定义View中读取布局文件中的自定义属性

(2)onMeasure 测量 child 即测量主按钮以及菜单项

(3)onLayout 布局 child 即布局主按钮以及菜单项

(4)设置主按钮的选择动画

       a.为菜单项menuItem添加平移动画和旋转动画

       b.实现菜单项menuItem的点击动画

卫星式菜单效果截图:

    

二、实现

上面介绍了原理和效果图,下面来看看卫星菜单类的实现:

1.布局文件的实现

    

2.卫星菜单类的实现

 package com.xc.xcskin.view; import com.xc.xcskin.R; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationSet; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; /** * 卫星式菜单View * @author caizhiming * */ public class XCArcMenuView extends ViewGroup implements OnClickListener{ private static final int POS_LEFT_TOP = 0; private static final int POS_LEFT_BOTTOM = 1; private static final int POS_RIGHT_TOP = 2; private static final int POS_RIGHT_BOTTOM = 3; private Position mPosition = Position.RIGHT_BOTTOM; private int mRadius; private Status mStatus = Status.CLOSE; //主菜的单按钮 private View mCButton; private OnMenuItemClickListener mOnMenuItemClickListener; /** * 菜单的状态枚举类 * @author caizhiming * */ public enum Status{ OPEN,CLOSE } /** * 菜单的位置枚举类 * @author caizhiming * */ public enum Position{ LEFT_TOP,LEFT_BOTTOM, RIGHT_TOP,RIGHT_BOTTOM } /** * 点击子菜单项的回调接口 * @author caizhiming * */ public interface OnMenuItemClickListener { void onClick(View view, int pos); } public void setOnMenuItemClickListener( OnMenuItemClickListener onMenuItemClickListener) { this.mOnMenuItemClickListener = onMenuItemClickListener; } public XCArcMenuView(Context context) { this(context, null); // TODO Auto-generated constructor stub } public XCArcMenuView(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public XCArcMenuView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub //获取自定义属性 TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.XCArcMenuView,defStyle,0); int pos = a.getInt(R.styleable.XCArcMenuView_position , POS_RIGHT_BOTTOM); switch (pos) { case POS_LEFT_TOP: mPosition = Position.LEFT_TOP; break; case POS_LEFT_BOTTOM: mPosition = Position.LEFT_BOTTOM; break; case POS_RIGHT_TOP: mPosition = Position.RIGHT_TOP; break; case POS_RIGHT_BOTTOM: mPosition = Position.RIGHT_BOTTOM; break; } mRadius = (int) a.getDimension(R.styleable.XCArcMenuView_radius, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics())); Log.v("czm", "mPosition = " + mPosition + ",mRadius = "+mRadius); a.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub int count = getChildCount(); for(int i = 0; i 

3.使用卫星式菜单类

 package com.xc.xcskin; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; import com.xc.xcskin.view.XCArcMenuView; import com.xc.xcskin.view.XCArcMenuView.OnMenuItemClickListener; import com.xc.xcskin.view.XCGuaguakaView; import com.xc.xcskin.view.XCGuaguakaView.OnCompleteListener; /** * 使用并测试自定义卫星式菜单View * @author caizhiming * */ public class XCArcMenuViewDemo extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.xc_arcmenu_view_demo); XCArcMenuView view = (XCArcMenuView) findViewById(R.id.arcmenu); view.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public void onClick(View view, int pos) { // TODO Auto-generated method stub String tag = (String) view.getTag(); Toast.makeText(XCArcMenuViewDemo.this, tag, Toast.LENGTH_SHORT).show(); } }); } }

三、总结

Android实现自定义的卫星式菜单(弧形菜单)的内容到这就基本结束了,感兴趣的朋友们可以动手操作起来,只有自己实践了才能更深的理解,希望本文对大家能有所帮助。

以上就是Android实现自定义的卫星式菜单(弧形菜单)详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动