public class CustomView extends TextView { private Paint mPaint; private int mProgress=0;//进度 private int mStrokenWidth;//圆宽度 private int mRadius;//圆半径 private DisplayMetrics mMetrics;//屏幕参数 private int centerX;//圆心所在x坐标 private int centerY;//圆心所在y坐标 private Rect mBounds; public CustomView(Context context) { this(context, null); } public CustomView(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } private void initPaint() { mPaint=new Paint(); mBounds=new Rect(); mMetrics=getResources().getDisplayMetrics(); new Thread(){ public void run() { while(true) { if(mProgress<360) { mProgress++; }else { } try { this.sleep(mProgress); postInvalidate(); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); this.setText(mProgress*100/360+"%"); this.setTextColor(Color.parseColor("#57C6FE")); this.setTextSize(20); this.setGravity(Gravity.CENTER); mRadius=200; centerX=mMetrics.widthPixels/2; centerY=mMetrics.heightPixels/2; mPaint.setAntiAlias(true); mPaint.setStyle(Style.STROKE); mPaint.setColor(Color.RED); mPaint.setStrokeWidth(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, getResources().getDisplayMetrics())); canvas.drawCircle(centerX, centerY, mRadius, mPaint); RectF rectf=new RectF(centerX-200, centerY-200, centerX+200, centerY+200); mPaint.setColor(Color.BLUE); canvas.drawArc(rectf, 0, mProgress, false, mPaint); //显示进度百分比 /* mPaint.setAntiAlias(false); mPaint.setTextSize(100); mPaint.setColor(Color.GREEN); mPaint.setAlpha(0x70); mPaint.setTypeface(Typeface.MONOSPACE); mPaint.setTextAlign(Align.CENTER); String text=mProgress*100/360+"%"; mPaint.getTextBounds(text, 9, text.length(), mBounds); //计算文字高度 float height=mBounds.height(); canvas.drawText(text, centerX, centerY, mPaint);*/ } }
关于绘制弧形的参数介绍:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); DisplayMetrics dm=getResources().getDisplayMetrics(); Paint paint=new Paint(); paint.setColor(Color.BLUE); paint.setStyle(Style.STROKE); paint.setAntiAlias(true);//打开抗锯齿 paint.setStrokeWidth(20); /* * 这个效果相当于画圆 * 第一个参数,代表矩形距离左边的x轴 * 第二个参数,代表矩形距离上边的y轴 * 第三个参数,代表矩形距离右边的x轴 * 第四个参数,代表矩形距离下边的y轴 */ //RectF rectf=new RectF(dm.widthPixels/2,0, dm.heightPixels/2 , 100); RectF rectf=new RectF(dm.widthPixels/2-100, dm.heightPixels/2-100, dm.widthPixels/2+100, dm.heightPixels/2+100); //canvas.drawOval(rectf, paint); /* * 第一个参数代表弧形所在的矩形范围 * 第二个参数代表弧形的开始弧度 * 第三个参数代表弧形的结束弧度 * 第四个参数没看出来有什么用 * 第五个就是画笔啦 */ canvas.drawArc(rectf, 0, 360, false, paint); }