自己定义控件时经常遇到重写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()的使用的更多相关文章

  1. Android canvas.save()与canvas.restore()的使用总结

    含义canvas.save(); 画布将当前的状态保存canvas.restore(); 画布取出原来所保存的状态使用 canvas.save();与canvas.restore();一般结合使用,. ...

  2. Canvas中的save方法和restore方法

    初学者也许会误认为canvas中save方法是用来保存绘图状态的图形,而restore方法是用来还原之前保存的绘图状态的图形,其实不然. save():保存当前的绘图状态. restore():恢复之 ...

  3. canvas save()和canvas restore()状态的保存和恢复使用方法及实例

    canvas.save()用来保存先前状态的 canvas.restore()用来恢复之前保存的状态 注:两种方法必须搭配使用,否则没有效果 <!DOCTYPE html> <htm ...

  4. android中画弧函数canvas.drawArc()之理解

    在学习android中图形图像处理技术这部分内容时,对绘制圆弧函数canvas.drawArc()的用法.参数含义及画图原理很是不理解,在网上搜索了一些,加上自己的理解,在此做个小总结,作为学习过程中 ...

  5. Android中使用SurfaceView和Canvas来绘制动画

    事实上每一个View中都有Canvas能够用来绘制动画.仅仅须要在这个View中重载onDraw()方法就能够,可是SurfaceView类是一个专门用来制动动画的类. Canvas(中文叫做&quo ...

  6. 【转】Android Canvas的save(),saveLayer()和restore()浅谈

    Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏: ...

  7. Android Canvas的save(),saveLayer()和restore()浅谈

    save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 ...

  8. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  9. iOS的 context 和Android 中的 canvas

    ios 想要绘图,要用到CGContextRef类.最基本的用法是在- (void)drawRect:(CGRect)rect 函数中绘制. Android 中要用到Canvas类.最基本的用法是在  ...

随机推荐

  1. Android组件:Fragment切换后保存状态

    之前写的第一篇Fragment实例,和大多数人一开始学的一样,都是通过FragmentTransaction的replace方法来实现,replace方法相当于先移除remove()原来所有已存在的f ...

  2. Thinkpad W520 完美安装Ubuntu14.04LTS

    Thinkpad W520 完美安装Ubuntu14.04LTS Ubuntu已经升级到14.04LTS,这是个长期支持的版本号.自从上次安装12.04LTS之后一直没有升级. 于是从站点上下载Ubu ...

  3. js打印

    js打印,其实是打印当前页面的内容,是调用 系统的js方法,来弹出 打印设置窗口,用法很简单. window.print()就行,有的考虑到 浏览器兼容性问题,会用到document.execComm ...

  4. CentOS6 yum源支持更多rpm包的升级(使用第三方软件库EPEL、RPMForge与RPMFusion)

    转载于http://blog.csdn.net/erazy0/article/details/6878153 在CentOS下运行yum install flash-plugin或yum instal ...

  5. delphi中左右翻转窗体(修改EXStyle)

    unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...

  6. 基于visual Studio2013解决面试题之0604O(1)时间复杂度删除链表节点

     题目

  7. Android下QQ空间查看大图特效

    近期在做一个项目,里面有一个功能是实现Android QQ好友动态里面的缩略图放大,查看大图的效果.用过都知道,这个特效非常赞的,没用过的下载个玩玩吧.我刚開始以为放大的那个大图是一个Activity ...

  8. .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax

    .atitit.web 推送实现解决方式集合(3)----dwr3 Reverse Ajax 1. 原理实现 1 2. Page  添加配置.添加回调函数dwr.engine.setActiveRev ...

  9. python输出htmltestrunner中文乱码如何解决

    python unittest要产生一个可看的报告,需要借助一个第三方的包 下载HTMLTestRunner.py 第三方库 ,参考地址: http://tungwaiyip.info/softwar ...

  10. 阿斯钢iojeg9uhweu9erhpu9hyw49

    http://www.huihui.cn/share/8424421 http://www.huihui.cn/share/8424375 http://www.huihui.cn/share/842 ...