Android:自定义View实现随滑动由箭头变对勾的指示按钮

首先来看下效果^_^
是不是有点MD风格的赶脚呢

实现原理并不复杂,这里我们通过自定义的方式通过位移偏差重绘线段的坐标使之有机连接起来,话不多说,代码走你┏ (゜ω゜)=☞

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
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值