自定义View学习的最后一期了,先上效果图。
相信大家心中都有自己的实现方法,这里就贴上我的方法以供参考。
/** * 刻度画笔 */ private Paint linePaint; /** * 进度画笔 */ private Paint textPaint; /** * 进度 */ private int index = 0; /** * 刻度 */ private int ruling = 0;
private void init() { linePaint = new Paint(); linePaint.setColor(Color.BLACK); linePaint.setStrokeWidth(5); linePaint.setAntiAlias(true); linePaint.setStyle(Style.FILL); textPaint = new Paint(linePaint); textPaint.setTextSize(70); textPaint.setColor(Color.WHITE); handler.sendEmptyMessage(0); handler.sendEmptyMessageDelayed(1, 2000); }上述相信大家都可以明白。。接下来就是最关键的onDraw()
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //移动画布 canvas.translate(getWidth() / 2, getHeight() / 2); //填充背景 canvas.drawColor(getResources().getColor(R.color.gray)); //刻度总数 int count = 30; //进度字占大小 Rect rect = new Rect(); String indexsString = String.valueOf(index); if (index < 10) { indexsString = "0" + indexsString; } textPaint.getTextBounds(indexsString, 0, indexsString.length(), rect); //进度字体 canvas.drawText(indexsString, -rect.width() / 2, rect.height() / 2, textPaint); //旋转画布,画刻度,并根据ruling值来改变颜色 for (int i = 0; i < count; i++) { if (i <= ruling) { linePaint.setColor(getResources().getColor(R.color.pink)); } else { linePaint.setColor(Color.BLACK); } canvas.drawLine(0, 100, 0, 120, linePaint); canvas.rotate(360 / count, 0, 0); } }注释的应该很详细不懂的也可以留言,接下来看看效果
完成了这个之后相信第二个也是手到擒来!
/** * 圆环 */ private Paint rectPaint; /** * 刻度 */ private Paint linePaint; /** * 填充 */ private Paint fillPaint; /** * 进度字 */ private Paint textPaint; private int index = 0; private int index2 = 0; public ProgressView2(Context context) { this(context, null); // TODO Auto-generated constructor stub } public ProgressView2(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public ProgressView2(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); }
private void init() { rectPaint = new Paint(); rectPaint.setAntiAlias(true); rectPaint.setStrokeWidth(20); rectPaint.setStyle(Style.STROKE); rectPaint.setColor(getResources().getColor(R.color.dark)); linePaint = new Paint(rectPaint); linePaint.setStrokeWidth(20); linePaint.setColor(getResources().getColor(R.color.pink)); fillPaint = new Paint(linePaint); fillPaint.setStrokeWidth(1); fillPaint.setColor(Color.BLACK); fillPaint.setAlpha(60); textPaint = new Paint(); textPaint.setStrokeWidth(5); textPaint.setAntiAlias(true); textPaint.setTextSize(70); textPaint.setColor(Color.WHITE); handler.sendEmptyMessage(0); handler.sendEmptyMessage(1); }
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //刻度数 int count = 60; //背景色 canvas.drawColor(getResources().getColor(R.color.gray)); //移动画布 canvas.translate(getWidth() / 2, getHeight() / 2); //圆环大小 RectF rectF = new RectF(-100, -100, 100, 100); String indexString = String.valueOf(index); if (index < 10) { indexString = "0" + indexString; } Rect rect = new Rect(); textPaint.getTextBounds(indexString, 0, <span style="font-family: Arial, Helvetica, sans-serif;">indexString </span><span style="font-family: Arial, Helvetica, sans-serif;">.length(), rect);</span> canvas.drawText(indexString, -rect.width() / 2, rect.height() / 2, textPaint); //圆环 canvas.drawArc(rectF, 0, 360, false, rectPaint); //填充色 canvas.drawArc(rectF, -90, index, false, linePaint); for (int i = 0; i < index2; i++) { canvas.drawLine(0, -90, 0, -110, fillPaint); canvas.rotate(360 / count, 0, 0); } }效果图
PS:上传的代码中有一个bug,再onDraw中衡量字体大小时不应该用“00”.length(),应该用indexString.length()
粗心大意要不得啊
Android 自定义学习(5)自定义Progressbar
原文地址:http://blog.csdn.net/u014163726/article/details/40506117