android 自定义圆环

最近学了自定义控件,以前一直想写个圆环,最近粗粗写了个,以便记录.

public class RingProgressView extends View {    private float radius = 200; //圆半径    private float distance = 60;// 圆环    private Paint mCirclePaint;    private Paint textPaint;    private int vWidth, vHeight;    private RectF mRectF;    private int curProgress = 0;    private int oldProgress = 0;    private float textOffsetY;    private float vX, vY; //绘制的中心点    private String text = "0";    public RingProgressView(Context context) {        this(context, null);    }    public RingProgressView(Context context, AttributeSet attrs) {        super(context, attrs);        //自定义属性的话可以自己找找attrs属性        initPaint();    }    private void initPaint() {        mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);        mCirclePaint.setStrokeCap(Paint.Cap.ROUND);        textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.SUBPIXEL_TEXT_FLAG);        textPaint.setColor(Color.WHITE);        textPaint.setTextSize(30);        textPaint.setTextAlign(Paint.Align.CENTER);        textOffsetY = (textPaint.descent() + textPaint.ascent()) / 2;    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        //测绘视图的大小        vWidth = resolveSize((int) (radius * 2), widthMeasureSpec);        vHeight = resolveSize((int) (radius * 2), heightMeasureSpec);        int thisX = vWidth - getPaddingLeft() - getPaddingRight();        int thisY = vHeight - getPaddingTop() - getPaddingBottom();        vX = thisX / 2;        vY = thisY / 2;        //当前圆直径大于视图时候  改变圆的大小        if (vWidth < radius * 2 || vHeight < radius * 2) {            if (thisX > thisY) {                radius = thisY / 2;            } else {                radius = thisX / 2;            }        }        //更改之后  改变圆环大小        if (radius != 200)            distance = radius / 6;        //自定义之后必须调用这个        setMeasuredDimension(vWidth, vHeight);    }    @Override    protected void onDraw(Canvas canvas) {        //绘制实心圆,中心圆的颜色        mCirclePaint.setStrokeWidth(0);        mCirclePaint.setStyle(Paint.Style.FILL);        mCirclePaint.setColor(0xFFF29B76);        canvas.drawCircle(vX, vY, radius, mCirclePaint);        //先绘制底部的360圆环,然后绘制滑动的圆环        mCirclePaint.setStyle(Paint.Style.STROKE);        mCirclePaint.setColor(Color.YELLOW);        mCirclePaint.setStrokeWidth(distance);        mRectF = new RectF(vX - radius + distance / 2, vY - radius + distance / 2, vX + radius - distance / 2, vY + radius - distance / 2);//定义一个矩形区域          canvas.drawArc(mRectF, 0, 360, false, mCirclePaint);        mCirclePaint.setColor(0xDDD12345);        canvas.drawArc(mRectF, -90, oldProgress, false, mCirclePaint);        //绘制百分比文字        canvas.drawText(text + "%", vX, vY - textOffsetY, textPaint);    }    public synchronized void setProgress(double progress) {        oldProgress = curProgress;        curProgress = (int) (progress * 360);        myHandler.removeCallbacksAndMessages(null);        if (oldProgress != curProgress)            oldProgress = 0;        myHandler.sendMessageDelayed(new Message(), 2);    }    private Handler myHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            if (curProgress < oldProgress) {                removeCallbacksAndMessages(this);            } else if (curProgress >= oldProgress) {                oldProgress += 3;                if (oldProgress > curProgress)                    oldProgress = curProgress;                text = String.format("%.1f", oldProgress / 3.6);                invalidate();                myHandler.sendMessageDelayed(new Message(), 1);            }        }    };    //可以设置圆环的一些属性    public void setRadius() {        //xxx    }}

更多相关文章

  1. Android 控件TextView的属性
  2. Android Zxing修改二维码中扫描框的大小仿微信
  3. android 动态改变控件大小的方法
  4. android开发:View中android:fadingEdge属性的作用
  5. EditText的字体和大小
  6. android属性android:largeHeap
  7. Android中如何比较两个时间值的大小.

随机推荐

  1. android:layout_weight总有你不知道的用
  2. Android之NDK开发
  3. Android系列教程之前言
  4. android中自定义SeekBar
  5. Android(安卓)Launcher 分析
  6. 2011.10.14(2)——— android 仿照微信的图
  7. Android操作HTTP实现与服务器通信
  8. Android主线程与子线程之沟通
  9. android之调用webservice 实现图片上传下
  10. 2011.10.14(2)——— android 仿照微信的图