Android Canvas绘图详解

合集下载

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

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学习笔记:Paint及Canvas的简单应用=

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)

android课程:canvas画图 切割画布(clipRect)

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介绍(一)

Android自定义View中Paint、Rect、Canvas介绍(一)

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的⼤⼩发⽣改变时,会调⽤此⽅法。

androidcanvas绘图详解

androidcanvas绘图详解

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进行绘制图形。

Android Canvas绘图抗锯齿解决方法

Android Canvas绘图抗锯齿解决方法
抗锯齿解决方法 对于Android来说Canvas一般大量用于自定义View和游戏开发中,对于图形的基础绘制类,提供的drawText、 drawBitmap以及drawCircle都需要抗锯齿处理才能让人满意,下面Android123将他们分为两大种情况。 一、包含Paint参数情况时,对于drawText、drawBitmap这样的方法,一般最后一个参数为Paint对象,Paint对 象一般用于设置笔刷颜色和大小,同时包含了抗锯齿的方法,比如说objPaint.setAntiAlias(true); 这个方法 执行后即可有比较明显的改善。 二、部分方法没有Paint参数,比如说setDrawFilter这个方法,它的参数只有 PaintFlagsDrawFilter对象,我 们自己构造一个新的对象,比如说new PaintFlagsDrawFilter (0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)这样就过滤器可以让文本和位图经过圆滑处理。

android学习资料:绘图Canvas

android学习资料:绘图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详细

Android原生绘图工具Canvas详细

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都是提供⼀个矩形局域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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);}}}当用户点击时将出现一个小点,拖动时将画出一条用细点组成的虚线:。

相关文档
最新文档