Android Canvas绘图详解
- 格式:doc
- 大小:248.50 KB
- 文档页数:18
Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)标签:图形androidpathfloatclass2012-01-20 20:02 151861人阅读评论(64) 收藏举报分类:android(12)版权声明:本文为博主原创文章,未经博主允许不得转载。
目录(?)[+] 1、首先说一下canvas类:Class OverviewThe Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing).这个类相当于一个画布,你可以在里面画很多东西;我们可以把这个Canvas理解成系统提供给我们的一块内存区域(但实际上它只是一套画图的API,真正的内存是下面的Bitmap),而且它还提供了一整套对这个内存区域进行操作的方法,所有的这些操作都是画图API。
也就是说在这种方式下我们已经能一笔一划或者使用Graphic来画我们所需要的东西了,要画什么要显示什么都由我们自己控制。
这种方式根据环境还分为两种:一种就是使用普通View的canvas画图,还有一种就是使用专门的SurfaceView的canvas来画图。
两种的主要是区别就是可以在SurfaceView中定义一个专门的线程来完成画图工作,应用程序不需要等待View的刷图,提高性能。
Android学习笔记:Paint及Canvas的简单应用在Android中需要通过graphics类来显示2D图形。
graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等常用的类。
graphics具有绘制点、线、颜色、2D几何图形、图像处理等功能。
1.Color(颜色)类Android系统中颜色的常用表示方法有以下3种:(1)int color = Color.BLUE;(2)int color = Color.argb(150,200,0,100);(3)在xml文件中定义颜色;在实际应用当中,我们常用的颜色有以下一些,其颜色常量及其表示的颜色如下所示:Color.BLACK 黑色Color.GREEN 绿色Color.BLUE 蓝色Color.LTGRAY 浅灰色Color.CYAN 青绿色 Color.MAGENTA 红紫色Color.DKGRAY 灰黑色 Color.RED 红色Color.YELLOW 黄色 Color.TRANSPARENT 透明Color.GRAY 灰色Color.WHITE 白色2.Paint(画笔)类要绘制图形,首先得调整画笔,按照自己的开发需要设置画笔的相关属性。
Pain类的常用属性设置方法如下:setAntiAlias(); //设置画笔的锯齿效果setColor(); //设置画笔的颜色setARGB(); //设置画笔的A、R、G、B值setAlpha(); //设置画笔的Alpha值setTextSize(); //设置字体的尺寸setStyle(); //设置画笔的风格(空心或实心)setStrokeWidth(); //设置空心边框的宽度getColor(); //获取画笔的颜色3.Canvas(画布)类画笔属性设置好之后,还需要将图像绘制到画布上。
Canvas类可以用来实现各种图形的绘制工作,如绘制直线、矩形、圆等等。
android canvas画图 切割画布(clipRect)canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);最后一个参数有多个选择分别是://DIFFERENCE是第一次不同于第二次的部分显示出来//REPLACE是显示第二次的//REVERSE_DIFFERENCE 是第二次不同于第一Java代码1.2.3.importandroid.content.Context;4.importandroid.graphics.Canvas;5.importandroid.graphics.Color;6.importandroid.graphics.Paint;7.importandroid.graphics.Path;8.importandroid.graphics.Region;9.importandroid.util.AttributeSet;10.importandroid.view.View;11.12.publicclasssBookextendsView{13.ContextmContext;14.PaintmPaint;15.PathmPath;16.publicsBook(Contextcontext){17.super(context);18.init();19.}20.21.publicsBook(Contextcontext,AttributeSetattrs){22.super(context,attrs);23.init();24.}25.26.publicsBook(Contextcontext,AttributeSetattrs,intdefStyle){27.super(context,attrs,defStyle);28.init();29.}30.31.privatevoidinit(){32.mPaint=newPaint();33.mPaint.setAntiAlias(true);34.mPaint.setStrokeWidth(6);35.mPaint.setTextSize(16);36.mPaint.setTextAlign(Paint.Align.RIGHT);37.38.mPath=newPath();39.}40.41.protectedvoidonDraw(Canvascanvas){42.canvas.drawColor(Color.GRAY);43.44.canvas.save();45.canvas.translate(10,10);46.drawScene(canvas);47.canvas.restore();48.49.canvas.save();50.canvas.translate(160,10);51.canvas.clipRect(10,10,90,90);52.canvas.clipRect(30,30,70,70,Region.Op.XOR);53.drawScene(canvas);54.canvas.restore();55.56.canvas.save();57.canvas.translate(10,160);58.mPath.reset();59.//canvas.clipPath(mPath);//makestheclipempty60.//mPath.addCircle(50,50,50,W);61.mPath.cubicTo(0,0,100,0,100,100);62.mPath.cubicTo(100,100,0,100,0,0);63.canvas.clipPath(mPath,Region.Op.REPLACE);64.drawScene(canvas);65.canvas.restore();66.67.canvas.save();68.canvas.translate(160,160);69.canvas.clipRect(0,0,60,60);70.canvas.clipRect(40,40,100,100,Region.Op.UNION);71.drawScene(canvas);72.canvas.restore();73.74.canvas.save();75.canvas.translate(10,310);76.canvas.clipRect(0,0,60,60);77.canvas.clipRect(40,40,100,100,Region.Op.XOR);78.drawScene(canvas);79.canvas.restore();80.81.canvas.save();82.83.canvas.translate(160,310);84.canvas.clipRect(0,0,60,60);85.canvas.clipRect(40,40,100,100,Region.Op.REVERSE_DIFFERENCE);86.drawScene(canvas);87.canvas.restore();88.}89.90.privatevoiddrawScene(Canvascanvas){91.canvas.clipRect(0,0,100,100);92.93.canvas.drawColor(Color.WHITE);94.95.mPaint.setColor(Color.RED);96.canvas.drawLine(0,0,100,100,mPaint);97.98.mPaint.setColor(Color.GREEN);99.canvas.drawCircle(30,70,30,mPaint);100.101.mPaint.setColor(Color.BLUE);102.canvas.drawText("Clipping",100,30,mPaint);103.}104.}105.次的部分显示//INTERSECT交集显示//UNION全部显示//XOR补集 就是全集的减去交集生育部分显示。
Android⾃定义View中Paint、Rect、Canvas介绍(⼀)⾃定义View对于新⼿⽽⾔貌似是⼀个很复杂的东西。
格式,各函数的意义。
对于⼤神经常忘记各函数及⼀些参数的具体写法及意义,刚好在做⼀个风车效果,把过程及遇到的问题都写下来1、如何⾃定义⼀个Viewpublic class LeafView extends View {private String TAG = "--------LeafView";public LeafView(Context context, AttributeSet attrs) {super(context, attrs);Log.i(TAG, "我是⾃定义View: LeafView");}}<LinearLayoutandroid:layout_width="match_parent"android:layout_height="100dp"android:orientation="vertical"android:background="@color/colorPrimary"><com.my.LeafViewandroid:id="@+id/leafView"android:layout_width="50dp"android:layout_height="50dp"android:layout_gravity="center_horizontal"/></LinearLayout>上⾯就是⾃定义了⼀个LeafView最简单的写法。
当然界⾯上什么都不会显⽰,除了LinearLayout的背景⾊2、onDraw(Canvas canvas)⽅法我们现来看下⾯⼀段代码,画出⼀个红⾊的正⽅形public class MyView extends View {private String TAG = "--------MyView";private int width, height;public MyView(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);width = w;height = h;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Rect rect = new Rect(0, 0, width, height);Paint paint = new Paint();paint.setColor(Color.RED);canvas.drawRect(rect, paint);}}通过看上⾯代码,有⼀个onSizeChanged()、onDraw()、canvas.drawRect()⽅法,有⼀个Paint, Rect, Canvas类1、onSizeChanged() 当View的⼤⼩发⽣改变时,会调⽤此⽅法。
Android Canvas绘图详解(图文)Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 。
今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在和包中。
他们提供了图形处理相关的: Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、 BitmapDrawable 和TransitionDrawable等。
以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。
你可以获取View 中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。
下面我们就主要来了解下Canvas的使用方法。
Canvas对象的获取方式有两种:一种我们通过重写方法,View中的Canvas对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。
另一种就是当你想创建一个Canvas对象时使用的方法:1 2Bitmap b = (100, 100, Canvas c =new Canvas(b);上面代码创建了一个尺寸是100*100的Bitmap,使用它作为Canvas操作的对象,这时候的Canvas就是使用创建的方式。
当你使用创建的Canvas在bitmap上执行绘制方法后,你还可以将绘制的结果提交给另外一个Canvas,这样就可以达到两个Canvas协作完成的效果,简化逻辑。
但是android SDK建议使用参数里提供的Canvas就好,没必要自己创建一个新的Canvas对象。
接下来我们看看Canvas提供我们哪些绘制图形的方法。
我们创建一个自定义View对象,使用onDraw方法提供的Canvas进行绘制图形。
Andorid绘图Canvas做Java的都知道,绘图肯定首先需要一个Canvas,然后在用Graphics在上面绘制自己想要图案。
不错,Android 上面也类似,你可以从一个Bitmap得到它的Canvas(new Canvas(BitMap bitMap)),进行绘制,也可以自定义一个View,用它的Canvas。
不同的是,Android里没有Graphics,而用 Paint代之,当然用法也稍有不同。
以下是自定义View的一段代码:Java代码1.Java代码1.@Override2.publicvoidonDraw(Canvascanvas){3.//首先定义一个paint4.Paintpaint=newPaint();5.6.//绘制矩形区域-实心矩形7.//设置颜色8.paint.setColor(Color.WHITE);9.//设置样式-填充10.paint.setStyle(Style.FILL);11.//绘制一个矩形12.canvas.drawRect(newRect(0,0,getWidth(),getHeight()),paint);13.14.//绘空心矩形15.//设置颜色16.paint.setColor(Color.RED);17.//设置样式-空心矩形18.paint.setStyle(Style.STROKE);19.//绘制一个矩形20.canvas.drawRect(newRect(10,10,50,20),paint);21.22.//绘文字23.//设置颜色24.paint.setColor(Color.GREEN);25.//绘文字26.canvas.drawText(str,30,30,paint);27.28.//绘图29.//从资源文件中生成位图30.Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);31.//绘图32.canvas.drawBitmap(bitmap,10,10,paint);33.}34.35.@Override36.publicvoidonDraw(Canvascanvas){37.//首先定义一个paint38.Paintpaint=newPaint();39.40.//绘制矩形区域-实心矩形41.//设置颜色42.paint.setColor(Color.WHITE);43.//设置样式-填充44.paint.setStyle(Style.FILL);45.//绘制一个矩形46.canvas.drawRect(newRect(0,0,getWidth(),getHeight()),paint);47.48.//绘空心矩形49.//设置颜色50.paint.setColor(Color.RED);51.//设置样式-空心矩形52.paint.setStyle(Style.STROKE);53.//绘制一个矩形54.canvas.drawRect(newRect(10,10,50,20),paint);55.56.//绘文字57.//设置颜色58.paint.setColor(Color.GREEN);59.//绘文字60.canvas.drawText(str,30,30,paint);61.62.//绘图63.//从资源文件中生成位图64.Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.icon);65.//绘图66.canvas.drawBitmap(bitmap,10,10,paint);67.}以上需要注意的有三点:1、Android中的Rect和java中的可能稍有区别,前两个参数是左上角的坐标,后两个参数是右下角的坐标(不是宽度和高度);2、Style.STROKE和Style.FILL外边的像素数是有区别的,这点和java里一样;3、绘文字时,设置的坐标点为(30,30),但绘出来后你会发现,文字的左上角坐标要比你设置的偏上,不知道是android设置的bug,还是我们有理解到坐标点的意义。
Android原⽣绘图⼯具Canvas详细⽬录1.Canvas提供的绘制函数2.绘制背景3.绘制矩形drawRect4.绘制圆⾓矩形drawRoundRect5.绘制圆形drawCircle6.绘制路径drawPath7.绘制直线drawLine8.绘制圆弧drawArc9.绘制椭圆drawOval10.绘制点drawPoint11.绘制⽂本drawText 沿路径绘制⽂本drawTextOnPath12.绘制bitmap drawBitmap如果对上⼀篇感兴趣的话可以看看下⾯步⼊正题:先看看效果图1.Canvas提供的绘制函数canvas.drawColor();canvas.drawRGB();canvas.drawRect();canvas.drawRoundRect();canvas.drawCircle();canvas.drawPath();canvas.drawLine();canvas.drawArc();canvas.drawOval();canvas.drawPoint();canvas.drawPoints();canvas.drawText();canvas.drawTextOnPath();canvas.drawBitmap();2.绘制背景⽤于初始化和清空画布//绘制颜⾊,默认模式public void drawColor(@ColorInt int color) {super.drawColor(color);}//颜⾊绘制,设置modepublic void drawColor(@ColorInt int color, @NonNull PorterDuff.Mode mode) {super.drawColor(color, mode);}//参数0-255public void drawARGB(int a, int r, int g, int b) {super.drawARGB(a, r, g, b);}//参数0-255public void drawRGB(int r, int g, int b) {super.drawRGB(r, g, b);}第⼆个函数中⽤到PorterDuff.Mode,PorterDuff.Mode主要⽤于图像混合模式,后⾯细说//传⼊RectFpublic void drawRect(@NonNull RectF rect, @NonNull Paint paint) {super.drawRect(rect, paint);}//传⼊Rectpublic void drawRect(@NonNull Rect r, @NonNull Paint paint) {super.drawRect(r, paint);}//把Rect的四个点坐标传⼊public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint) {super.drawRect(left, top, right, bottom, paint);}Rect 和RectF都是提供⼀个矩形局域。
AndroidCanvas⽅法总结前⾔:当我们进⾏⾃定义控件的时候,为了实现更多更炫酷的效果,我们通常都需要在Canvas(画布)上绘制各种东西。
⽽⾕歌也提供了很多的API⽅法,能让我们更⽅便更快捷的实现想要的效果。
Canvaspublic class Canvasextends Objectng.Object↳ android.graphics.CanvasCanvas类包含“绘制”调⽤。
要绘制⼀些东西,你需要4个基本组件:⼀个⽤于保存像素的位图,⼀个⽤于托管绘图调⽤的Canvas(写⼊位图),⼀个绘图基元(例如Rect,Path,text,Bitmap)和⼀个paint(描述绘图的颜⾊和样式)。
下⾯介绍下Canvas 的常⽤⽅法,先看下总的内容:⼀、画布变换1、translate(位移)/*** 画布向(100,100)⽅向平移** @param dx 向X轴⽅向平移100px* @param dy 向Y轴⽅向平移100px*/canvas.translate(100, 100);看下效果图:注意:translate()是可以叠加的,⽽且这⾥实际上移动的是坐标,画布的位置并没有变,也就是说坐标原点变到了原来(100,100)的位置2、rotate(旋转)/*** 原点为中⼼,旋转45度(顺时针⽅向为正⽅向)** @param degrees 旋转⾓度*/canvas.rotate(45);效果图如下:旋转还有另外⼀个⽅法:canvas.rotate(float degrees, float px, float py);/*** Preconcat the current matrix with the specified rotation.** @param degrees The amount to rotate, in degrees* @param px The x-coord for the pivot point (unchanged by the rotation)* @param py The y-coord for the pivot point (unchanged by the rotation)*/public final void rotate(float degrees, float px, float py) {if (degrees == 0.0f) return;translate(px, py);rotate(degrees);translate(-px, -py);}根据源码可以很明显的看到,其实就是先平移到指定位置,在指定位置进⾏了旋转之后⼜对画布做了返回平移处理,这样就实现了以⾃定义点为中⼼旋转画布的效果。
AndroidCanvas的drawText()与⽂字居中⽅案详解⾃定义View是绘制⽂本有三类⽅法// 第⼀类public void drawText (String text, float x, float y, Paint paint)public void drawText (String text, int start, int end, float x, float y, Paint paint)public void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)public void drawText (char[] text, int index, int count, float x, float y, Paint paint)// 第⼆类public void drawPosText (String text, float[] pos, Paint paint)public void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)// 第三类public void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)public void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)其中drawText()最常⽤,drawPosText ()是根据⼀个个坐标点指定⽂字位置,drawTextOnPath ()是根据路径绘制。
Android Canvas绘图详解(图文)摘要Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。
今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D 使用的api都在android.graphics和android.graphics.drawable包中。
他们提供了图Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0。
今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳过这篇文章。
大部分2D使用的api都在android.graphics和android.graphics.drawable包中。
他们提供了图形处理相关的:Canvas、ColorFilter、Point(点)和RetcF(矩形)等,还有一些动画相关的:AnimationDrawable、BitmapDrawable和TransitionDrawable等。
以图形处理来说,我们最常用到的就是在一个View上画一些图片、形状或者自定义的文本内容,这里我们都是使用Canvas来实现的。
你可以获取View中的Canvas对象,绘制一些自定义形状,然后调用View. invalidate方法让View重新刷新,然后绘制一个新的形状,这样达到2D动画效果。
下面我们就主要来了解下Canvas的使用方法。
Canvas对象的获取方式有两种:一种我们通过重写View.onDraw方法,View中的Canvas 对象会被当做参数传递过来,我们操作这个Canvas,效果会直接反应在View中。
另一种就是当你想创建一个Canvas对象时使用的方法:1 2 Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); Canvas c =new Canvas(b);上面代码创建了一个尺寸是100*100的Bitmap,使用它作为Canvas操作的对象,这时候的Canvas就是使用创建的方式。
当你使用创建的Canvas在bitmap上执行绘制方法后,你还可以将绘制的结果提交给另外一个Canvas,这样就可以达到两个Canvas协作完成的效果,简化逻辑。
但是android SDK建议使用View.onDraw参数里提供的Canvas就好,没必要自己创建一个新的Canvas对象。
接下来我们看看Canvas提供我们哪些绘制图形的方法。
我们创建一个自定义View对象,使用onDraw方法提供的Canvas进行绘制图形。
CanvasDemoActivity.java:1 2 3 4 5 6 package com.android777.demo.uicontroller.graphics;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647 import android.graphics.Paint;import android.os.Bundle;import android.view.View;public class CanvasDemoActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(new CustomView1(this));}/*** 使用内部类自定义一个简单的View* @author Administrator**/class CustomView1 extends View{Paint paint;public CustomView1(Context context) {super(context);paint =new Paint();//设置一个笔刷大小是3的黄色的画笔 paint.setColor(Color.YELLOW);paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);paint.setStrokeWidth(3);}//在这里我们将测试canvas提供的绘制图形方法@Overrideprotected void onDraw(Canvas canvas) {}}}执行结果是一片黑色的区域,因为在自定义的CustomView1中,我们没有做任何的绘制操作。
canvas提供的绘制图形的方法都是以draw开头的。
从上面方法的名字看来我们可以知道Canvas可以绘制的对象有:弧线(arcs)、填充颜色(argb和color)、Bitmap、圆(circle和oval)、点(point)、线(line)、矩形(Rect)、图片(Picture)、圆角矩形(RoundRect)、文本(text)、顶点(Vertices)、路径(path)。
通过组合这些对象我们可以画出一些简单有趣的界面出来,但是光有这些功能还是不够的,如果我要画一个仪表盘(数字围绕显示在一个圆圈中)呢?幸好Android还提供了一些对Canvas位置转换的方法:rorate、scale、translate、skew(扭曲)等,而且它允许你通过获得它的转换矩阵对象(getMatrix方法,不知道什么是转换矩阵?看这里) 直接操作它。
这些操作就像是虽然你的笔还是原来的地方画,但是画纸旋转或者移动了,所以你画的东西的方位就产生变化。
为了方便一些转换操作,Canvas 还提供了保存和回滚属性的方法(save和restore),比如你可以先保存目前画纸的位置(save),然后旋转90度,向下移动100像素后画一些图形,画完后调用restore方法返回到刚才保存的位置。
下面我们就演示下canvas的一些简单用法:1 2 3 4 protected void onDraw(Canvas canvas) {canvas.drawCircle(100, 100, 90, paint); }效果是:1 2 3 4 5 6 7 8 91011121314 @Overrideprotected void onDraw(Canvas canvas) { //绘制弧线区域RectF rect =new RectF(0, 0, 100, 100);canvas.drawArc(rect,//弧线所使用的矩形区域大小 0, //开始角度90,//扫过的角度false,//是否使用中心paint);}使用下面的代码:1 2 3 4 5 6 7 8 910111213 protected void onDraw(Canvas canvas) { //绘制弧线区域RectF rect =new RectF(0, 0, 100, 100);canvas.drawArc(rect,//弧线所使用的矩形区域大小 0, //开始角度90,//扫过的角度true,//是否使用中心paint);}两图对比我们可以发现,当drawArcs(rect,startAngel,sweepAngel,useCenter,paint)中的useCenter为false时,弧线区域是用弧线开始角度和结束角度直接连接起来的,当useCenter为true时,是弧线开始角度和结束角度都与中心点连接,形成一个扇形。
1 2 3 4 5 protected void onDraw(Canvas canvas) { canvas.drawColor(Color.BLUE);}canvas.drawColor是直接将View显示区域用某个颜色填充满。
1 2 3 4 5 6 7 @Overrideprotected void onDraw(Canvas canvas) {//画一条线canvas.drawLine(10, 10, 100, 100, paint); }Canvas.drawOval:1 2 3 4 5 6 7 8 9 @Overrideprotected void onDraw(Canvas canvas) {//定义一个矩形区域RectF oval =new RectF(0,0,200,300);//矩形区域内切椭圆canvas.drawOval(oval, paint);}canvas.drawPosT ext:1 2 3 4 5 6 7 8 910111213141516 @Overrideprotected void onDraw(Canvas canvas) {//按照既定点绘制文本内容canvas.drawPosText("Android777",new float[]{ 10,10,//第一个字母在坐标10,1020,20,//第二个字母在坐标20,2030,30,//....40,40,50,50,60,60,70,70,80,80,90,90,100,100}, paint);1718} canvas.drawRect:1 2 3 4 5 6 7 8 9 10 @Overrideprotected void onDraw(Canvas canvas) {RectF rect =new RectF(50, 50, 200, 200); canvas.drawRect(rect, paint);}}canvas.drawRoundRect:1 2 3 4 5 6 7 8 91011 @Overrideprotected void onDraw(Canvas canvas) {RectF rect =new RectF(50, 50, 200, 200);canvas.drawRoundRect(rect,30,//x轴的半径30,//y轴的半径paint);}canvas.drawPath:1 2 3 4 5 6 7 8 9101112 @Overrideprotected void onDraw(Canvas canvas) {Path path =new Path();//定义一条路径path.moveTo(10, 10);//移动到坐标10,10 path.lineTo(50, 60);path.lineTo(200,80);path.lineTo(10, 10);canvas.drawPath(path, paint);}canvas.drawTextOnPath:1 2 3 4 5 6 7 8 910111213 @Overrideprotected void onDraw(Canvas canvas) {Path path =new Path();//定义一条路径path.moveTo(10, 10);//移动到坐标10,10path.lineTo(50, 60);path.lineTo(200,80);path.lineTo(10, 10);// canvas.drawPath(path, paint);canvas.drawTextOnPath("Android777开发者博客", path, 10, 10, paint); }位置转换方法,canvas.rorate和canvas.translate:1 2 3 4 5 6 7 8 91011121314 @Overrideprotected void onDraw(Canvas canvas) {paint.setAntiAlias(true);paint.setStyle(Style.STROKE);canvas.translate(canvas.getWidth()/2, 200);//将位置移动画纸的坐标点:150,150 canvas.drawCircle(0, 0, 100, paint);//画圆圈//使用path绘制路径文字canvas.save();canvas.translate(-75, -75);Path path =new Path();path.addArc(new RectF(0,0,150,150), -180, 180);Paint citePaint =new Paint(paint);1516171819202122232425262728293031323334353637383940414243444546 citePaint.setTextSize(14);citePaint.setStrokeWidth(1);canvas.drawTextOnPath("", path, 28, 0, citePaint); canvas.restore();Paint tmpPaint =new Paint(paint);//小刻度画笔对象tmpPaint.setStrokeWidth(1);float y=100;int count = 60;//总刻度数for(int i=0 ; i <count ; i++){if(i%5 == 0){canvas.drawLine(0f, y, 0, y+12f, paint);canvas.drawText(String.valueOf(i/5+1), -4f, y+25f, tmpPaint);}else{canvas.drawLine(0f, y, 0f, y +5f, tmpPaint);}canvas.rotate(360/count,0f,0f);//旋转画纸}//绘制指针tmpPaint.setColor(Color.GRAY);tmpPaint.setStrokeWidth(4);canvas.drawCircle(0, 0, 7, tmpPaint);tmpPaint.setStyle(Style.FILL);tmpPaint.setColor(Color.YELLOW);canvas.drawCircle(0, 0, 5, tmpPaint);canvas.drawLine(0, 10, 0, -65, paint);}上面几个例子基本已经将常用的canvas.draw*方法测试过了,我们结合一些事件,做一些有用户交互的应用:1 2 3 4 5 6 7 8 9101112131415 package com.android777.demo.uicontroller.graphics; import java.util.ArrayList;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PointF;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;public class CanvasDemoActivity extends Activity {1617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(new CustomView1(this));}/*** 使用内部类自定义一个简单的View* @author Administrator**/class CustomView1 extends View{Paint paint;private ArrayList<PointF> graphics =new ArrayList<PointF>(); PointF point;public CustomView1(Context context) {super(context);paint =new Paint();//设置一个笔刷大小是3的黄色的画笔paint.setColor(Color.YELLOW);paint.setStrokeJoin(Paint.Join.ROUND);paint.setStrokeCap(Paint.Cap.ROUND);paint.setStrokeWidth(3);}@Overridepublic boolean onTouchEvent(MotionEvent event) {graphics.add(new PointF(event.getX(),event.getY()));invalidate();//重新绘制区域returntrue;}//在这里我们将测试canvas提供的绘制图形方法@Overrideprotected void onDraw(Canvas canvas) {for(PointF point : graphics) {6061626364656667 canvas.drawPoint(point.x, point.y, paint); }// super.onDraw(canvas);}}}当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线:。