Android中canvas.save()和canvas.restore()的使用
自己定义控件时经常遇到重写View的Ondraw()方法,Ondraw()方法经常设计到save()和restore()这两个方法.这两个相互匹配出现的,作用是用来保存画布的状态和取出保存的状态的。
详细作用例如以下:
1.save():用来保存Canvas的状态,save()方法之后的代码,能够调用Canvas的平移、放缩、旋转、裁剪等操作!
2.restore():用来恢复Canvas之前保存的状态,防止save()方法代码之后对Canvas运行的操作。继续对兴许的绘制会产生影响。通过该方法能够避免连带的影响!
以下简单举个样例。说明一下,先来看第一段代码:
private class DemoView extends View {
private Paint mPaint;
private Bitmap bitmap1;
private Bitmap bitmap2;
public DemoView(Context context) {
super(context);
mPaint = new Paint();
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);
bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap1, 0, 0, mPaint);
canvas.scale(5f, 5f);
canvas.drawBitmap(bitmap2, 30, 30, mPaint);
super.onDraw(canvas);
}
}
非常easy的演示样例,就是画了两个图片,而且在第一个画完后。把画布放大了5倍。效果如图所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDM1ODE2OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
以下,我们把代码稍作修改,例如以下:
private class DemoView extends View {
private Paint mPaint;
private Bitmap bitmap1;
private Bitmap bitmap2;
public DemoView(Context context) {
super(context);
mPaint = new Paint();
bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.a);
bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.b);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(bitmap1, 0, 0, mPaint);
canvas.save();//保存
canvas.scale(5f, 5f);
canvas.restore();//恢复
canvas.drawBitmap(bitmap2, 30, 30, mPaint);
super.onDraw(canvas);
}
}
效果例如以下:
这样是不是效果对照非常明显了。
简述一下两个的不同吧:
1.第一段代码中画了bmp1后就运行了缩放操作,而且没有保存状态!紧接着画了bmp2。那么bmp2也会一样受到缩放的影响。!
2.第二段代码中我们进行画布缩放的之前保存了画布状态,做了缩放操作之后又取出之前保存的状态,这样做是为了保证bmp2正常画出来不受到缩放的影响!
嗯,貌似是看懂了,不知道你懂了没~
Android中canvas.save()和canvas.restore()的使用的更多相关文章
- Android canvas.save()与canvas.restore()的使用总结
含义canvas.save(); 画布将当前的状态保存canvas.restore(); 画布取出原来所保存的状态使用 canvas.save();与canvas.restore();一般结合使用,. ...
- Canvas中的save方法和restore方法
初学者也许会误认为canvas中save方法是用来保存绘图状态的图形,而restore方法是用来还原之前保存的绘图状态的图形,其实不然. save():保存当前的绘图状态. restore():恢复之 ...
- canvas save()和canvas restore()状态的保存和恢复使用方法及实例
canvas.save()用来保存先前状态的 canvas.restore()用来恢复之前保存的状态 注:两种方法必须搭配使用,否则没有效果 <!DOCTYPE html> <htm ...
- android中画弧函数canvas.drawArc()之理解
在学习android中图形图像处理技术这部分内容时,对绘制圆弧函数canvas.drawArc()的用法.参数含义及画图原理很是不理解,在网上搜索了一些,加上自己的理解,在此做个小总结,作为学习过程中 ...
- Android中使用SurfaceView和Canvas来绘制动画
事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...
- 【转】Android Canvas的save(),saveLayer()和restore()浅谈
Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22 阅读:1445 评论:0 收藏: ...
- Android Canvas的save(),saveLayer()和restore()浅谈
save() saveLayer() restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- iOS的 context 和Android 中的 canvas
ios 想要绘图,要用到CGContextRef类.最基本的用法是在- (void)drawRect:(CGRect)rect 函数中绘制. Android 中要用到Canvas类.最基本的用法是在 ...
随机推荐
- Opera浏览器测试移动端网站和模拟手机浏览器的方法
链接地址:http://www.neirong.org/post-256.html?utm_source=tuicool Chrome浏览器请看:Chrome浏览器测试移动端网站和模拟手机浏览器的方法 ...
- Linux经常使用命令(十二) - less
less 工具也是对文件或其他输出进行分页显示的工具.应该说是linux正统查看文件内容的工具.功能极其强大. less 的使用方法比起 more 更加的有弹性.使用了 less 时.更easy用来查 ...
- 以交互方式使用exp/imp的演示
众所周知,用exp/imp对数据库进行逻辑备份.包含表.用户,整个数据库,我们通常所熟悉的是使用命令行指定參数的方式来做的.以下我来演示一下不太经常使用的以交互方式的操作,操作非常easy.就是仅仅要 ...
- 类虚函数表原理实现分析(当我们将虚表地址[n]中的函数替换,那么虚函数的实现就由我们来控制了)
原理分析 当调用一个虚函数时, 编译器生成的代码会调用 虚表地址[0](param1, param2)这样的函数. 已经不是在调用函数名了. 当我们将虚表地址[n]中的函数实现改为另外的函数, 虚函数 ...
- Android-Cannot merge new index 66195 into a non-jumbo instruction的解决的方法
转载请注明来源:http://blog.csdn.net/goldenfish1919/article/details/33729679 用eclispe打包的时候报错: [2014-06-23 13 ...
- 在O(1)时间删除指定链表结点
#region 在O(1)时间删除指定链表结点 /// <summary> /// 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. /// </summa ...
- android布局margin和padding差异!
事实上从使用的时候就能够差别开来. android:padding android:layout_margin padding是在本控件级别的,而margin是在layout级别的. 最好拿有背景的控 ...
- Citrix 服务器虚拟化之三十二 XenConvert
Citrix 服务器虚拟化之三十二 XenConvert 简介: Citrix XenConvert 是用于实现物理到虚拟(P2V)转换的工具,可将工作负载从运行 Windows 的服务器或桌面计算 ...
- ViEmu For VS2010 3.0 解除30天限制的方法
一.概述 首先,ViEmu试用版在安装时会记录安装的时间,用于判断是否已经过了限制的时间,这个时间记录在注册表中 以本人的机器(WIN7X64)为例,它记录在 HKEY_CLASSES_ROOT\Wo ...
- Xamarin.forms 自定义dropdownview控件
一 基本说明 想用xamarin做个像美团这样的下拉列表进行条件选择的功能,但是但是找了半天好像没有现成的,也没有其他类似的控件可以走走捷径,再则也没有找到popwindow之类的东东,这里只好使用s ...