自定义View填充圆

直接上代码吧:
其实填充圆的话无非就是两个圆   一个实心圆的半径不停变化  一个空心圆作为边框
然后就可以实现了  而且这个代码还是可以实现简单的拖拽的

只需要这一个类就可以完成效果    主布局只是负责加载这个控件   不做任何操作
package gaojianyi.bwie.com.myzdy_dc;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

import static android.R.attr.radius;

/**
 * date:2017/6/11
 * author:高坚译(dell)
 * Time:10:39
 */

public class MyView extends View{
    private SingleTapThread singleTapThread;
    private Paint paint,paint1;
    private int windowWidth;
    private int windowHeight;
    private int ii;
    private GestureDetector detector;
    /**
     * 最后滑动的X坐标
     */
    private int lastX;
    /**
     * 最后滑动的Y坐标
     */
    private int lastY;

    public MyView(Context context) {
        this(context,null);
    }

    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //测量模式
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        //测量规格大小
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int width;
        int height;
        if (widthMode == MeasureSpec.EXACTLY) {
            width=widthSize;
        } else if (widthMode == MeasureSpec.AT_MOST) {
            width=Math.min(widthSize,radius*2);
        } else {
            width=windowWidth;
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            height=heightSize;
        } else if (heightMode == MeasureSpec.AT_MOST) {
            height=Math.min(heightSize,radius*2);
        } else {
            height=windowHeight;
        }
        setMeasuredDimension(width,height);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        paint = new Paint();//空心圆   作为边框
        paint.setColor(Color.GREEN);
        paint.setStyle(Paint.Style.STROKE);
        paint.setTextSize(90);
        paint.setStrokeWidth(10);
        canvas.drawCircle(getWidth()/2,getHeight()/2,300,paint);

        paint1 = new Paint();//实心圆画笔
        paint1.setColor(Color.RED);
        //ii表示变化的半径   (命名又点不规范)
        canvas.drawCircle(getWidth() / 2, getHeight() / 2, ii, paint1);
        int i = ii / 3;//记录百分比变化
        canvas.drawText(i+"%",getWidth() / 2-100,getHeight() / 2,paint);

        //这个方法是让他允许点击   然后执行画布刷新
        detector = new GestureDetector(new MyGestureDetector());
            setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return detector.onTouchEvent(event);
                }
            });

}
    public class MyGestureDetector extends GestureDetector.SimpleOnGestureListener{
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return super.onDoubleTap(e);
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            singleTapThread = new SingleTapThread();
            getHandler().postDelayed(singleTapThread, 100);
            return super.onSingleTapConfirmed(e);
        }
    }
    private class SingleTapThread implements Runnable {
        @Override
        public void run() {
           //这个就是让它在多大范围内执行
          if (ii < 300) {
            invalidate();
            getHandler().postDelayed(singleTapThread, 100);
            ii = ii + 1;
            }
        }
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //获取当前手指的坐标
        int currentX = (int) event.getX();
        int currentY = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                lastX = currentX;
                lastY = currentY;
                break;
            case MotionEvent.ACTION_MOVE:
                //获取当前偏移的坐标
                int biasX = currentX - lastX;
                int biasY = currentY - lastY;
                //重写layout方法改变控件所在屏幕的位置
                layout(getLeft()+biasX, getTop()+biasY, getRight()+biasX, getBottom()+biasY);
                break;
        }
        return true;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值