Android - Canvas 简单总结

在自定义控件时,经常需要使用canvas、paint等,在canvas类中,绘画基本都是靠drawXXX()方法来完成的,在这些方法中,很多时候都需要用到paint类型的参数,本文先对paint类常用的一些设置做个简单总结

paint 属性设置简单总结

图形绘制相关:

public void set(Paint src)  根据已有画笔的属性进行赋值

public void setColor(int color) 设置颜色

public void setAlpha(int alpha) 设置透明度,alpha为透明度,取值范围为0~255,数值越小越透明

public void setARGB(int a, int r, int g, int b)  设置透明度和颜色,a代表透明度,r,g,b代表颜色值

public void setAntiAlias(boolean aa) 设置是否使用抗锯齿功能,比较耗资源,减慢绘制速度

public void setDither(boolean dither) 设定是否使用图像抖动,如true,绘制出来的图片颜色更饱满、清晰

public void setStyle(android.graphics._Original_Paint.Style style) 设置画笔的样式,为FILL,FILL_OR_STROKE,或STROKE

以下这段文字来源于网络,谢谢作者!

当我们在调用drawCircle、drawOval、drawArc、drawRect等方法时,我们既可以绘制对应图形的填充面,也可以只绘制该图形的轮廓线,控制的关键在于画笔Paint中的style。Paint通过setStyle方法设置要绘制的类型,style有取三种值:Paint.Style.FILL、Paint.Style.STROKE和Paint.Style.FILL_AND_STROKE。

当style为FILL时,绘制是填充面,FILL是Paint默认的style;

当style为STROKE时,绘制的是图形的轮廓线;

当style为FILL_AND_STROKE时,同时绘制填充面和轮廓线,不过这种情况用的不多,因为填充面和轮廓线是用同一种颜色绘制的,区分不出轮廓线的效果。

public void setStrokeCap(Cap cap)

当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式  Cap.ROUND,或方形样式Cap.SQUARE

public void setStrokeWidth(float width) 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度

文字绘制相关:

public void setTextSize(float textSize) 设置文字大小

public void setTextScaleX(float scaleX) 设置文字x轴的缩放比例,可以实现文字的拉伸效果

public void setTextSkewX(float skewX)  设置文字倾斜弧度

public void setUnderlineText(boolean flag) 设置文字下划线效果

public void setStrikeThruText(boolean flag) 设置删除线效果

public Typeface setTypeface(Typeface typeface) 设置字体风格

public void setTextAlign(android.graphics._Original_Paint.Align align) 设置文字的对齐方向

其中有两个属性设置需要作说明:

1、public Typeface setTypeface(Typeface typeface) ,接收参数为 Typeface对象,在Typeface.java类中,比较简单的,有defaultFromStyle方法返回Typeface对象:

public static Typeface defaultFromStyle(int style) {}

2、public void setTextAlign(android.graphics._Original_Paint.Align align) 设置文字的对齐方向,接收的参数为Paint的内部枚举类Align的值,可选LEFT、CENTER和RIGHT。

下边是文字绘制时常用的属性设置例子:

[java] view plain copy

  1. public void draw(Canvas canvas) {
  2. super.draw(canvas);
  3. paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
  4. paint.setColor(Color.RED);
  5. paint.setTextSize(41);
  6. paint.setTextAlign(Align.CENTER);
  7. paint.setTextScaleX(2.5f);
  8. paint.setTextSkewX(-0.5f);
  9. paint.setUnderlineText(true);
  10. paint.setStrikeThruText(true);
  11. canvas.drawText("hwgt的博客", 0, 41, paint);
  12. ... ...
  13. }

另外,需要注意的是:Canvas的drawText()方法中,如不setTextAlign(... ...)的话,第二个参数 x 默认是字符串的左边的位置,第三个参数则固定为这个字符串的baseline的位置。

Canvas属性与方法

首先列出canvas以draw开头的方法:

设置ARGB、颜色填充画布:

[java] view plain copy

  1. public void drawARGB(int a, int r, int g, int b) {}
  2. public void drawColor(int color) {}
  3. public void drawRGB(int r, int g, int b) {}
  4. canvas.drawARGB(50, 255, 0, 0);//参数即为ARGB的值

画点:

[java] view plain copy

  1. public native void drawPoint(float x, float y, Paint paint);
  2. //参数比较明显,就是点的坐标,需要注意的是,在绘制点之前,需要设置画笔的宽度,否则不能画出来
  3. paint.setStrokeWidth(13);
  4. //另外,还可以设置画笔的样式,来指定所画的点的样式,圆形还是方形
  5. paint.setStrokeCap(Paint.Cap.ROUND);//或者paint.setStrokeCap(Paint.Cap.BUTT);
  6. canvas.drawPoint(100, 100, paint);

画直线:

[java] view plain copy

  1. public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint) {}
  2. canvas.drawLine(100, 100, 500, 500, paint);//参数为起点和终点的XY坐标

画圆:

[java] view plain copy

  1. public void drawCircle(float cx, float cy, float radius, Paint paint) {}
  2. canvas.drawCircle(200, 200, 100, paint);//参数为圆心坐标和半径

绘制矩形:

[java] view plain copy

  1. public void drawRect(float left, float top, float right, float bottom, Paint paint) {}
  2. public void drawRect(RectF rect, Paint paint) {}
  3. public void drawRect(Rect r, Paint paint) {}
  4. // RectF 和 Rect  都可用来定义一个矩形区域,主要区别是参数类型不同,一个是int类型,一个是float类型
  5. private RectF mRectF;
  6. mRectF = new RectF(100, 100, 200, 500);
  7. canvas.drawRect(mRectF, paint);

绘制圆角矩形:

[java] view plain copy

  1. public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {}
  2. private RectF mRectF;
  3. mRectF = new RectF(100, 100, 500, 500);//定义一个区域
  4. canvas.drawRoundRect(mRectF, 20, 50, paint); //第二、三个参数分别定义x和y方向的圆角弧度

绘制一个区域的内切圆或椭圆(视所定义的矩形而定):

[java] view plain copy

  1. public void drawOval(RectF oval, Paint paint) {}
  2. private RectF mRectF;
  3. mRectF = new RectF(100, 100, 200, 500);
  4. canvas.drawOval(mRectF, paint);

绘制弧形区域:

[java] view plain copy

  1. public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint) {}
  2. private RectF mRectF;
  3. mRectF = new RectF(100, 100, 200, 200);//定义一个矩形区域
  4. canvas.drawArc(mRectF, 0, 90, false, paint);
  5. //第二个参数为起始弧度,第三个为终止弧度,第四个为显示方式

绘制路径 — Path 的使用:

[java] view plain copy

  1. public void drawPath(Path path, Paint paint) {}
  2. paint.setStyle(Paint.Style.STROKE);
  3. paint.setStrokeWidth(3);
  4. mPath = new Path();
  5. mPath.moveTo(100, 100);
  6. mPath.lineTo(200, 100);
  7. mPath.lineTo(150, 150);
  8. mPath.lineTo(150, 350);
  9. mPath.close();
  10. canvas.drawPath(mPath, paint);

绘制路径,即指定几个点的坐标,然后按照顺序将这些点连接起来,那么,首先需要指定起点,使用moveTo方法,如果没有使用moveTo方法指定起点的话,默认起点为(0,9),然后用lineTo方法指定需要经过的点,最后,如果起点和终点的坐标不一样,并且需要将起点和终点连接起来的话,就调用close方法,如不调用close方法的话,起点和终点是不会被连接起来的。

绘制文本:

[java] view plain copy

  1. public void drawText(String text, float x, float y, Paint paint) {}
  2. public void drawText(char[] text, int index, int count, float x, float y, Paint paint) {}
  3. public void drawText(String text, int start, int end, float x, float y, Paint paint) {}
  4. canvas.drawText("hwgt", 100, 100, paint);
  5. canvas.drawText(new char [] {‘h‘,‘w‘,‘g‘,‘t‘,‘3‘,‘1‘,‘3‘,‘3‘}, 2, 3, 100, 100, paint);
  6. canvas.drawText("hwgt3133", 2, 4, 100, 100, paint); //含头不含尾

按照指定点的坐标绘制文本:

[java] view plain copy

  1. public void drawPosText(String text, float[] pos, Paint paint) {}
  2. public void drawPosText(char[] text, int index, int count, float[] pos, Paint paint) {}
  3. canvas.drawPosText("hwgt", new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);
  4. canvas.drawPosText(new char[]{‘h‘,‘w‘,‘g‘,‘t‘}, 3, 1, new float[]{50.0f,50.0f,100.0f,100.0f,250.0f,250.0f,500.0f,500.0f,}, paint);
  5. //推荐使用第二个方法,if (index < 0 || index + count > text.length || count*2 > pos.length),就会报错

按照指定的路径绘制文本:

[java] view plain copy

  1. public void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) {}

canvas的save和restore方法:

在绘制图形的过程中,会需要对画布进行旋转,缩放,平移等操作,但对画布进行比如平移操作之后,会对以后画上去的内容也产生影响,有时,我们只希望这种平移或是旋转操作只是临时作用于画布上的某些内容,这个时候就可以使用save和restore方法,save和restore方法一般是配对使用的,例如:

[java] view plain copy

  1. paint.setFakeBoldText(true); // 将画笔设置为粗体
  2. canvas.drawText("00000000", 0, 75, paint);
  3. canvas.save();
  4. canvas.translate(0, 250);
  5. canvas.drawText("||||||||||||||||", 0, 75, paint);
  6. canvas.restore();
  7. canvas.drawText("—————", 0, 75, paint);

去掉save和restore方法即能看出效果。

暂时总结到这里,后续再做补充

时间: 2024-10-04 04:38:42

Android - Canvas 简单总结的相关文章

【转】Android Canvas绘图详解(图文)

转自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1212/703.html Android Canvas绘图详解(图文) 泡在网上的日子 发表于 2012-12-12 20:29 第 63165 次阅读 Canvas,android 15 Android中使用图形处理引擎,2D部分是android SDK内部自己提供,3D部分是用Open GL ES 1.0.今天我们主要要了解的是2D相关的,如果你想看3D的话那么可以跳

移动端UI设计越来越流行的高斯模糊(Gaussian blur)和毛玻璃效果(磨砂效果),如何使用Android RenderScript简单实现?

高斯模糊(Gaussian blur)和毛玻璃效果(亦称磨砂效果),近两年在移动端的UI设计上越来越流行,特别是iOS手机上出现的较多,iOS系统也提供了相应的API帮助开发人员分分钟实现这两个效果.而Android系统则经历了一个漫长的探索过程,对图片的处理,从Java算法到NDK方式实现等,各种摸索层出不穷. 值得欣慰的是,Google终于在API 11中引入了 RenderScript ,一个强大的图片处理框架,帮助Android开发人员专注于图片处理算法而不是API的调度工作.使用Ren

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博 SharePanel Android上简单的一键分享可分享到微信QQ和新浪微博 简介 效果图 代码块 简介 最近在写一个小程序长微博工具,效果就是编辑长微博,然后一键分享到微信.QQ和新浪微博. 一开始是想直接用Intent.createChooser(target, title)来做,后来一想,这样做不是很好啊,会有许多乱七八糟的应用弹出来,我想优先分享到微信.QQ和微博,于是找了点资料,将一键分享这个部分做

Android WIFI 简单用法

随着Wifi的普及,在开发App的时候对wifi的考虑越来越多了.例如程序的升级在wifi下可以省很多流量,在通信软件中的视频通话.可以实现高画质的传输等等,Android提供了WifiManager类来帮助开发者们管理Wifi.下面就简单来说一下WifiManager的简单用法把. 权限: 为了使用WfiManager 我们需要在Androidmanifest.xml 加入权限: //本例中使用了前两个.具体请按照需要添加权限. <uses-permission android:name=&quo

【转】Android Studio简单设置

原文网址:http://ask.android-studio.org/?/article/14 Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings --> Appearance --> Theme ,选择 Darcula 主题即可. 字体设置 系统字体设置 如果你的Android Studio界面中,中文显示有问题,或者选择中文目录显示有问题,或者想修改菜单栏的字体,可以这么设置.Settings -

Android NDK 简单介绍、工具安装、环境配置

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发人员高速开发C(或C++)的动态库,并能自己主动将so和java应用一起打包成apk.这些工具对开发人员的帮助是巨大的. * NDK集成了交叉编译器,并提供了对应的mk文件隔离平台.CPU.API等差异,开发者仅仅须要简单改动mk文件(指出"哪些文件须要编译"."编译特性要求"等),就能够创建出so. * NDK能够自己主动地将so和Ja

Android学习系列(41)--Android Studio简单使用

1. 环境 UBUNTU 14.04 + Android Studio 0.8.2 2. 安装jdk openjdk-7是一个很好的选择: sudo apt-get update sudo apt-get install openjdk-7-jdk 不排除你需要选择一个默认版本: sudo update-alternatives --config java sudo update-alternatives --config javac 3. 安装Android Studio 在UBUNTU有两种

android的简单入门学习

话说光配环境就整死我了, 不是说多么难, 是最近google被屏了, 很多sdk里面需要下载的东西都下不下来, 坑爹啊.  最后跟扫拉稀要了一个他配置好的,才运行了. android目录分析: assets 资产目录,存放文件,这些文件会被打包到应用程序的apk(安装包) bin 编译后的文件目录 gen 目录自动生成的目录 project.properties 代表编译的版本 target = "" 来修改编译版本 libs 支持jar包 会被添加到android depend 目录

android 实现简单登录

一直知道WEB登录之后是通过session保持回话的,现在安卓却不知道怎么弄了. 研究了一下,记录一下.直接上代码: 服务器端: index.jsp <%@page import="java.io.PrintWriter"%> <%@page import="com.sun.org.apache.xml.internal.serialize.Printer"%> <%@page import="com.google.gson.