android-canvas 之save与restore

很多资料中指出,canvas其实就是一个 画布,我们呢,用它给的各种工具(API)
在加上一支神奇的画笔(Paint类)可以在画布上画出各种形状。有两个关键的点,其一是画控件画布区域。(你画画必须画在纸上啊)其二就是 画控件的实际区域,电脑必定 智商超低,它不知道什么是画布,这对它来讲太高深,它觉得,你就直接告诉 在哪画? 这样的画就出现了坐标系,电脑只在坐标轴的正x和正y范围内进行绘制,然而电脑可不管 画布在这区域内有没有!如果它画的范围内没有画布  那么它就画不上。即使他画了我们也看不到,画布必须在坐标的合理范围内,这样画布才能被画上画。

由于电脑绘制时候只认坐标,你给出一个坐标系(确定原点在你屏幕的位置,可能在屏幕之外),然后明确告诉它在哪个位置上开始绘制。
save 的作用是保存canvas状态,实际上保存就是 坐标系的原点的位置和x 轴与y轴的延伸方向,这也是我们在下面
那个例子中看到的。当你进行 平移,旋转,拉伸等操作时候 实际上 是对整个坐标系进行的上述操作。比如你在(30,40)的位置上画上一个点,然后旋转45度,这样(30, 40)的位置变了,因为坐标系的位置变了。如果你想 念save之前的坐标位置,只需要 调用 restore() 方法 把 那个坐标系从栈中取出。 你再绘图就是根据 save之前的坐标的位置进行绘画。

如下一个例子 就是对上述的合理解释的验证,代码有注释,我是继承了TextView类扩展的MyTextView类。

布局文件mytextview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <com.example.draw.MyTextView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:text="今晚吃班饭"/>
    <com.example.draw.MyTextView
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:text="今晚吃班饭"/>
</LinearLayout>

onDraw里面的代码

protected void onDraw(Canvas canvas) {

        int height = getMeasuredHeight();//得到画布区域的高
        int width = getMeasuredWidth();//得到画布区域的宽

        int px = width / 2;
        int py = height / 2;

        Paint p1 = new Paint(Paint.ANTI_ALIAS_FLAG);
        p1.setColor(Color.RED);
        //给出画布区域(红色部分)
        canvas.drawRect(0,0, width,height,p1);
        //确定200,200的位置
        //因为我们给出控件在父控件中的大小为200dp,200dp
        //因此 控件的中心位置就是(200,200)高和宽都为400
        p1.setColor(Color.YELLOW);//黄色的圈
        canvas.drawCircle(200,200,20,  p1);

        p1.setColor(Color.BLACK);
        p1.setStrokeWidth(10);
        p1.setStyle(Paint.Style.FILL_AND_STROKE);

        //画出当前原点的位置
        canvas.drawCircle(0, 0, 20, p1);
        canvas.drawLine(0, 0, 0, 1000, p1);
        canvas.drawLine(0, 0, 1000, 0, p1);

        canvas.save();//保存上述坐标系的状态,放入
        canvas.translate(100, 300);//将坐标轴向右(dx)移动100 向下(dy)移动300

        //再次画出原点位置,并且画出x轴与y轴
        p1.setColor(Color.GREEN);
        canvas.drawCircle(0, 0, 20, p1);
        canvas.drawLine(0, 0, 0, 1000, p1);
        canvas.drawLine(0, 0, 1000, 0, p1);

        canvas.restore();//恢复到前一个坐标系

        //将坐标系绕px,py 旋转30度
        canvas.rotate(30, px, py);
        canvas.drawPoint(px, py, p1);

        //画出原点的位置,并且画出x轴与y轴
        p1.setColor(Color.BLUE);
        canvas.drawCircle(0, 0, 20, p1);
        canvas.drawLine(0, 0, 0, 1000, p1);
        canvas.drawLine(0, 0, 1000, 0, p1);
        super.onDraw(canvas);
}

时间: 2024-10-28 14:40:54

android-canvas 之save与restore的相关文章

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

Android Canvas的save(),saveLayer()和restore()浅谈 时间:2014-12-04 19:35:22      阅读:1445      评论:0      收藏:0      [点我收藏+] save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是

android_浅析canvas的save()和restore()方法

[java] view plain copy <span style="font-size:18px;"> </span> [java] view plain copy <span style="font-size:18px;"></span> 绘图之前,首先需要调整画笔,待画笔调整好之后,再将图像绘制到画布上,这样才可以显示在手机屏幕上!Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进

Canvas的save和restore

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

HTML5中canvas的save和restore方法

canvas的save和restore方法: save() 方法把当前绘画状态的一份拷贝压入到一个保存图像状态的栈中.这里的绘画状态指坐标原点.变形时的变化矩阵(该矩阵是调用 rotate().scale() 和 translate() 的结果).以及图形上下文对象的当前属性值等内容. 1.图像上下文CanvasRenderingContext2D的属性和方法: 属性                              描述canvas                          取

canvas 中save和restore的用法

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法. onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布. 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢? ? save:用来保存Canvas的状态.save之后,可以调用Canvas的平移.放缩.旋转.错切.裁剪等操作. ? restore:用来恢复Canvas之前保存的状态.防止save后对Canvas执行的操作对后续的绘制有影响. sa

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

save()  saveLayer()  restore() 1.在自定义控件当中你onMeasure和onLayout的工作做完成以后就该绘制该控件了,有时候需要自己在控件上添加一些修饰来满足需求 复写onDraw(Canvas canvas),其中Canvas就像是一块画布,你自定义控件的样式就是在它上面完成的. Canvas ,Paint等基本概念就不赘述了. 2.下面就直接用demo来解释标题列出的方法先介绍save()和 必须了解的相关知识:http://www.cnblogs.com

Canvas的save和restore简单程序说明

关于save和restore网上不少说明,在这里简单的用程序证实了一下. 图1 上图为绘制的最终图画,绘制这种view有多中方式. a) 简单的方式:不对canvas进行任何平移或者旋转的操作,对canvas直接绘制.代码如下 @Override protected void onDraw(Canvas canvas) { int width = 900; int height = 900; Paint paint = new Paint(); //上半部分红色举行 paint.setColor

理解Canvas的save()和restore()方法

save()和restore()方法是绘制复杂图形必不可少的方法.它们分别是用来保存和恢复 canvas 状态的,都没有参数. Canvas 状态是以堆(stack)的方式保存的,每一次调用 save 方法,当前的状态就会被推入堆中保存起来.这种状态包括:当前应用的变形(即移动,旋转和缩放,见下):strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX,shadowO

android canvas d

(以下转自:http://blog.csdn.net/longyi_java/article/details/6930480) 1.基本的绘制图片方法 //Bitmap:图片对象,left:偏移左边的位置,top: 偏移顶部的位置    drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 2.对图片剪接和限定显示区域 drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint p

Android - Canvas 简单总结

在自定义控件时,经常需要使用canvas.paint等,在canvas类中,绘画基本都是靠drawXXX()方法来完成的,在这些方法中,很多时候都需要用到paint类型的参数,本文先对paint类常用的一些设置做个简单总结 paint 属性设置简单总结 图形绘制相关: public void set(Paint src)  根据已有画笔的属性进行赋值 public void setColor(int color) 设置颜色 public void setAlpha(int alpha) 设置透明