Android环形菜单实现
参考https://github.com/Hitomis/CircleMenu ,在原自定义View中修改了一些代码
效果图:

使用方式:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private CircleMenuView circleMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
circleMenu = (CircleMenuView) findViewById(R.id.circle_menu);
circleMenu.setMainMenu(Color.parseColor("#CDCDCD"), R.mipmap.icon_menu, R.mipmap.icon_cancel)
.addSubMenu(Color.parseColor("#258CFF"), R.mipmap.p1)
.addSubMenu(Color.parseColor("#30A400"), R.mipmap.icon_search)
.addSubMenu(Color.parseColor("#FF4B32"), R.mipmap.icon_notify)
.addSubMenu(Color.parseColor("#8A39FF"), R.mipmap.icon_setting)
.addSubMenu(Color.parseColor("#FF6A00"), R.mipmap.icon_gps)
// 这里开启返回键拦截,主要就是按下返回键关闭菜单
.setInterceptBackPressedEnable(true)
.setFeedbackListener(new CircleMenuView.OnCircleMenuFeedbackListener() {
@Override
public void onMenuSelected(int index) {
Snackbar.make(circleMenu, "点击了 [" + index + "]", Snackbar.LENGTH_SHORT).show();
}
@Override
public void onMenuCenterClicked() {
Snackbar.make(circleMenu, "点击了 [中心]", Snackbar.LENGTH_SHORT).show();
}
@Override
public void onMenuOpened() {
}
@Override
public void onMenuClosed() {
}
});
}
}
必要的注释都在代码里了,包括返回键的处理
主要是Path绘制I的时候需要旋转Canvas
public class CircleMenuView extends View {
private static final String TAG = "CircleMenuView";
private static final int STATUS_MENU_OPEN = 1;
private static final int STATUS_MENU_OPENED = 1 << 1;
private static final int STATUS_MENU_CLOSE = 1 << 2;
private static final int STATUS_MENU_CLOSE_CLEAR = 1 << 3;
private static final int STATUS_MENU_CLOSED = 1 << 4;
private static final int STATUS_MENU_CANCEL = 1 << 5;
/**
* 最多8个菜单
*/
private static final int MAX_SUBMENU_NUM = 8;
private final int shadowRadius = 5;
private int partSize;
private int iconSize;
private float circleMenuRadius;
private int itemNum;
private float itemMenuRadius;
private float fraction, rFraction;
private float pathLength;
private int mainMenuColor;
private Drawable openMenuIconDrawable, closeMenuIconDrawable;
private List<Integer> subMenuColorList;
private List<Drawable> subMenuDrawableList;
private List<RectF> menuRectFList;
private int centerX, centerY;
private int clickIndex;
private int rotateAngle;
private int itemIconSize;
private int pressedColor;
/**
* view此时的状态
*/
private int state;
private boolean pressed;
private Paint oPaint, cPaint, sPaint;
private PathMeasure pathMeasure;
private Path path, dstPath;
private OnCircleMenuFeedbackListener mFeedbackListener;
public CircleMenuView(Context context) {
this(context, null);
}
public CircleMenuView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleMenuView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
state = STATUS_MENU_CLOSED;
init();
setFocusable(true);
setFocusableInTouchMode(true);
}
private void init() {
initTool();
mainMenuColor = Color.parseColor("#CDCDCD");
openMenuIconDrawable = new GradientDrawable();
closeMenuIconDrawable = new GradientDrawable();
subMenuColorList = new ArrayList<>();
subMenuDrawableList = new ArrayList<>();
menuRectFList = new ArrayList<>();
}
private void initTool() {
oPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
oPaint.setStyle(Paint.Style.FILL_AND_STROKE);
cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
cPaint.setStyle(Paint.Style.STROKE);
// 设置画笔头部和尾部的形状
cPaint.setStrokeCap(Paint.Cap.ROUND);
sPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
sPaint.setStyle(Paint.Style.FILL);
path = new Path();
dstPath = new Path();
pathMeasure = new PathMeasure();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int measureWidthSize = width, measureHeightSize = height;
if (widthMode == MeasureSpec.AT_MOST) {
measureWidthSize = dip2px(20) * 10;
}
if (heightMode == MeasureSpec.AT_MOST) {
measureHeightSize = dip2px(20) * 10;
}
setMeasuredDimension(measureWidthSize, measureHeightSize);
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int minSize = Math.m

本文介绍了一种基于Hitomis/CircleMenu的Android环形菜单的实现,包括主菜单、子菜单的设置、旋转动画以及返回键拦截的处理。通过实例展示了如何在Activity中使用并定制该控件的外观和行为。
1075

被折叠的 条评论
为什么被折叠?



