上面就是几张预览图!代码在最底下
主要就两个步骤,画图、监听点击
1、整个控件基本上是一步步画出来的,重写onDraw方法开始for循环画扇形出来,画扇形的时候同时画扇形内的图标,扇形画完了之后画中心圆按钮,中心画了圆之后吧OK按钮画上。
2、重写onTouch方法监听手指触发的位置,根据按下的位置确定按钮在哪个扇形的范围上,然后重绘一下onDraw把按下的灰色背景绘制出来。难点在于如何确定按下的位置是否处于扇形范围,换了好几种方案,奈何数学不好,最后选了现在使用的方案。
package com.imxiaoyu.common.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 仿遥控器上下左右ok圆形菜单
* Created by 庞光渝 on 2017/3/9.博客:https://my.oschina.net/u/1462828/blog
*/
public class RoundMenuView extends View {
/**
* 变量
*/
private int coreX;//中心点的坐标X
private int coreY;//中心点的坐标Y
private List<RoundMenu> roundMenus;//菜单列表
private boolean isCoreMenu = false;//是否有中心按钮
private int coreMenuColor;//中心按钮的默认背景--最好不要透明色
private int coreMenuStrokeColor;//中心按钮描边颜色
private int coreMenuStrokeSize;//中心按钮描边粗细
private int coreMenuSelectColor;//中心按钮选中时的背景颜色
private Bitmap coreBitmap;//OK图片
private OnClickListener onCoreClickListener;//中心按钮的点击回调
private float deviationDegree;//偏移角度
private int onClickState = -2;//-2是无点击,-1是点击中心圆,其他是点击菜单
private int roundRadius;//中心圆的半径
private double radiusDistance;//半径的长度比(中心圆半径=大圆半径*radiusDistance)
private long touchTime;//按下时间,抬起的时候判定一下,超过300毫秒算点击
public RoundMenuView(Context context) {
super(context);
}
public RoundMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RoundMenuView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canva