Android——canvas学习
2016-05-13 11:08
369 查看
《 自定义控件之绘图篇(四):canvas变换与操作 》这篇blog介绍了canvas使用的基本情况
结合自己写的小demo ,加深了印象
刚做的时候在画完表盘之后,用canvas.restore()取出初始状态后,画时针时没有再调用canvas.save()保存,导致两次连续的restore()操作,以至于第二次restore()画分针时取得未知的canvas状态,出现了错位如图(分针不在圆心为起点画图):
正常图片:
完整代码:
结合自己写的小demo ,加深了印象
canvas.save();//这里要保存一次,以便于画完表盘,restore到初始状态 canvas.drawCircle(width / 2, width / 2, radius, mPaintCircle); for(int i=0;i<24;i++){ if(i%6==0){ canvas.drawLine(width/2,0,width/2,60,mPaint1); canvas.drawText(i+"",width/2-mPaint1.measureText(i+"")/2,90,mPaint1); }else{ canvas.drawLine(width / 2, 0, width / 2, 30, mPaint2); canvas.drawText(i+"",width/2-mPaint1.measureText(i+"")/2,60,mPaint2); } canvas.rotate(15,width/2,width/2); } canvas.restore();//画完表盘后,从canvas栈中取出之前保存的状态 int hour=11; int minute=45; int degreeH=hour*30; int degreeM=minute*6; canvas.save();//这里务必要再进行保存,画完时针还要画分针 canvas.rotate(degreeH, width / 2, width / 2); canvas.drawLine(width / 2, width / 2, width / 2, width / 2 - radius * 0.6f, mPaint1); canvas.restore();//画完时针后取出画时针前的状态,由于canvas状态是一个栈结构保存的,所以如果之前画时针时没有保存,则取得未知的canvas状态 canvas.rotate(degreeM, width / 2, width / 2); canvas.drawLine(width / 2, width / 2, width / 2, width / 2 - radius * 0.6f, mPaint2);
刚做的时候在画完表盘之后,用canvas.restore()取出初始状态后,画时针时没有再调用canvas.save()保存,导致两次连续的restore()操作,以至于第二次restore()画分针时取得未知的canvas状态,出现了错位如图(分针不在圆心为起点画图):
正常图片:
完整代码:
public class Myiew extends View { public Myiew(Context context) { super(context); } public Myiew(Context context, AttributeSet attrs) { super(context, attrs); } public Myiew(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } private int width,height,radius; private Paint mPaintCircle,mPaint1,mPaint2; @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); width=getMeasuredWidth(); height=getMeasuredHeight(); radius=width/2; mPaintCircle=new Paint(); mPaint1=new Paint(); mPaint2=new Paint(); mPaintCircle.setStyle(Paint.Style.STROKE); mPaint1.setStyle(Paint.Style.STROKE); mPaint2.setStyle(Paint.Style.STROKE); mPaintCircle.setColor(Color.GRAY); mPaint1.setColor(Color.BLACK); mPaint1.setStrokeWidth(5); mPaint1.setTextSize(30); mPaint2.setColor(Color.BLACK); mPaint2.setStrokeWidth(3); mPaint2.setTextSize(15); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.save();//这里要保存一次,以便于画完表盘,restore到初始状态 canvas.drawCircle(width / 2, width / 2, radius, mPaintCircle); for(int i=0;i<24;i++){ if(i%6==0){ canvas.drawLine(width/2,0,width/2,60,mPaint1); canvas.drawText(i+"",width/2-mPaint1.measureText(i+"")/2,90,mPaint1); }else{ canvas.drawLine(width / 2, 0, width / 2, 30, mPaint2); canvas.drawText(i+"",width/2-mPaint1.measureText(i+"")/2,60,mPaint2); } canvas.rotate(15,width/2,width/2); } canvas.restore();//画完表盘后,从canvas栈中取出之前保存的状态 int hour=11; int minute=45; int degreeH=hour*30; int degreeM=minute*6; canvas.save();//这里务必要再进行保存,画完时针还要画分针 canvas.rotate(degreeH, width / 2, width / 2); canvas.drawLine(width / 2, width / 2, width / 2, width / 2 - radius * 0.6f, mPaint1); canvas.restore();//画完时针后取出画时针前的状态,由于canvas状态是一个栈结构保存的,所以如果之前画时针时没有保存,则取得未知的canvas状态 canvas.rotate(degreeM, width / 2, width / 2); canvas.drawLine(width / 2, width / 2, width / 2, width / 2 - radius * 0.6f, mPaint2); } }
相关文章推荐
- Android安全攻防战,反编译与混淆技术完全解析(下)
- Android 自定义BaseAdapter
- android Cache——内存基本原理和机制管理
- android:layout_gravity和android:gravity属性的区别
- Android中实现静态的默认安装和卸载应用
- android 适配器动态生成控件时 复用的问题
- Android自定义View的实现方法,带你一步步深入了解View(四)
- android中应用下载的简单实现
- RxJava&RxAndroid学习
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
- Android视图绘制流程完全解析,带你一步步深入了解View(二)
- Android LayoutInflater原理分析,带你一步步深入了解View(一)
- Android安全攻防战,反编译与混淆技术完全解析(上)
- 如何在 android 中转换为 'file:///storage/sdcard0/Pictures/X.jpg' 的 'content://media/external/images/media/Y
- Android进程间通信之----Aidl传递对象
- android自定义View时报error: No resource identifier found for attribute ‘XXX’ in package ‘
- android studio 下如何使用SVN
- android studio上使用butterknife
- 利用 BitmapShader 制作自带边框圆形头像
- 在Android Studio中使用Lambda表达式