很多资料中指出,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