首先来看下效果^_^
实现原理并不复杂,这里我们通过自定义的方式通过位移偏差重绘线段的坐标使之有机连接起来,话不多说,代码走你┏ (゜ω゜)=☞
public class MagicButton extends View {
// 八个点,用于绘制线段
private PointF mPoint0;
private PointF mPoint1;
private PointF mPoint2;
private PointF mPoint3;
private PointF mPoint4;
private PointF mPoint5;
private PointF mPoint6;
private PointF mPoint7;
// 箭头到对勾对应的四个点
private PointF mArrawToTickPoint1, mArrawToTickPoint2, mArrawToTickPoint3, mArrawToTickPoint4;
// 对勾到箭头对应的四个点
private PointF mTickToArrawPoint1, mTickToArrawPoint2, mTickToArrawPoint3, mTickToArrawPoint4;
// 角度,对应于位移偏差,用于动态改变线段的落点
private float mProgress = 0;
// view的宽高
private int mViewWidth;
private int mViewHeight;
// view的中心
private int mViewCenterX;
private int mViewCenterY;
// 半径
private int mRadius;
// 是否绘制箭头标志位
private boolean mIsDrawArrow = true;
/**
* 画实心圆
*/
private Paint mCirclePaint;
/**
* 画符号
*/
private Paint mSymbolPaint;
public MagicButton(Context context) {
super(context);
}
public MagicButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// 画背景圆
mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCirclePaint.setColor(Color.parseColor("#ccaaaaaa"));
// 画符号
mSymbolPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mSymbolPaint.setColor(getResources().getColor(android.R.color.white));
mSymbolPaint.setStyle(Paint.Style.STROKE);
mSymbolPaint.setStrokeCap(Paint.Cap.ROUND);
mSymbolPaint.setStrokeJoin(Paint.Join.ROUND);
}
public MagicButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MagicButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyl