Android绘图-Paint、Canvas、Bitmap、BitmapFactory

原创 2015年04月13日 16:32:35

Paint类代表画笔,Canvas类代表画布。

Paint类

Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。创建方法:

Paint paint = new Paint();

Paint类常用方法

方法 描述
setARGB(int a, int r, int g, int b) 设置颜色
setColor(int color) 设置颜色
setAlpha(int a) 设置透明度,值为0~255
setAntiAlias(boolean aa) 指定使用使用抗锯齿功能,如果使用会使绘图速度变慢
setDither(boolean dither) 指定是否使用图像抖动处理,如果使用会使图像颜色更加平滑和饱满
setPathEffect(PathEffect effect) 设置绘制路径时的路径效果,例如点画线
setShader(Shader shader) 设置渐变,可以使用LinearGradient(线性渐变)、RadialGradient(径向渐变)或者SweepGradient(角度渐变)
setShadowLayer(float radius, float dx, float dy, int color) 设置阴影,参数radius为阴影的角度,dx和dy为阴影在x轴和y轴上的距离,color为阴影的颜色。如果radius为0,将没有阴影
setStrokeCap(Paint.Cap cap) 用于当画笔的填充样式为STROKE或FILL_AND_STROKE时,设置笔刷的图形样式,参数值可以是Cap.BUTT、Cap.ROUND或Cap.SQUARE。主要体现在线的端点上
setStrokeJoin(Paint.Join join) 用于设置画笔转弯处的连接风格,参数值为Join.BEVEL、Join.MITER或Join.ROUND
setStrokeWidth(float width) 设置笔触的宽度
setStyle(Paint.Style style) 设置填充风格,参数值为Style.FILL、Style.FILL_AND_STROKE或Style.STROKE
setTextAlign(Paint.Align align) 设置绘制文本时的文字对齐方式,参数为Align.CENTER、Align.LEFT或Align.RIGHT
setTextSize(float textSize) 设置绘制文本时的文字大小
setFakeBoldText(boolean fakeBoldText) 设置是否为粗体文字
setXfermode(Xfermode xfermode) 设置图形重叠时的处理方式,例如合并、取交集或并集,经常用来制作橡皮的擦除效果

Canvas类

Canvas类代表画布,通过该类提供的方法,可以绘制各种图形(例如,矩形、圆形和线条等)。通常,要在Android中绘图,需要先创建一个继承自View类的视图,并重写onDraw(Canvas canvas)方法,然后再显示绘图的Activity中添加该视图。

绘制几何图形
方法 描述
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint) 绘制弧
drawCircle(float cx, float cy, float radius, Paint paint) 绘制圆形
drawLine(float startX, float startY, float stopX, float stopY, Paint paint) 绘制一条线
drawLines(float[] pts, Paint paint) 绘制多条线
drawOval(RectF oval, Paint paint) 绘制椭圆
drawPoint(float x, float y, Paint paint) 绘制一个点
drawPoints(float[] pts, Paint paint) 绘制多个点
drawRect(float left, float top, float right, float bottom, Paint paint) 绘制矩形
drawRoundRect(RectF rect, float rx, float ry, Paint paint) 绘制圆角矩形

例子,绘制五个不同颜色的圆组成的图案。
创建一个名称为MyView的内部类,改类继承自android.view.View类,如下:

package com.example.drawcircle;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;

public class MyView extends View{

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawColor(Color.WHITE);//设置画布的背景色为白色
        Paint paint = new Paint();//创建采用默认设置的画笔
        paint.setAntiAlias(true);//使用抗锯齿功能
        paint.setStrokeWidth(3);//设置笔触的宽度
        paint.setStyle(Style.STROKE);//设置填充样式为描边
        paint.setColor(Color.BLUE);
        canvas.drawCircle(50, 50, 30, paint);//绘制蓝色的圆形
        paint.setColor(Color.YELLOW);
        canvas.drawCircle(100, 50, 30, paint);//绘制黄色的圆形
        paint.setColor(Color.BLACK);
        canvas.drawCircle(150, 50, 30, paint);//绘制黑色的圆形
        paint.setColor(Color.GREEN);
        canvas.drawCircle(75, 90, 30, paint);//绘制绿色的圆形
        paint.setColor(Color.RED);
        canvas.drawCircle(125, 90, 30, paint);//绘制红色的圆形

    }

}

在MainActivity的onCreate()方法,获取布局文件,添加MyView视图:

    FrameLayout frameLayout = (FrameLayout) findViewById(R.id.frameLayout1);
    frameLayout.addView(new MyView(this, null));

最终的结果为:
这里写图片描述

绘制一个android机器人:

    Paint paint = new Paint();//采用默认设置创建一个画笔
    paint.setAntiAlias(true);//使用抗锯齿功能
    paint.setColor(0xFFA4C739);//设置画笔的颜色为绿色
    //绘制机器人的头
    RectF rectF_head = new RectF(10, 10, 100, 100);
    rectF_head.offset(100, 20);
    canvas.drawArc(rectF_head, -10, -160, false, paint);//绘制弧
    //绘制眼睛
    paint.setColor(Color.WHITE);//设置画笔的颜色为白色
    canvas.drawCircle(135, 53, 4, paint);//绘制圆
    canvas.drawCircle(175, 53, 4, paint);//绘制圆
    paint.setColor(0xFFA4C739);//设置画笔的颜色为绿色
    //绘制天线
    paint.setStrokeWidth(2);//设置笔触的宽度
    canvas.drawLine(120, 15, 135, 35, paint);//绘制线
    canvas.drawLine(190, 15, 175, 35, paint);//绘制线
    //绘制身体
    canvas.drawRect(110, 75, 200, 150, paint);//绘制矩形
    RectF rectF_body = new RectF(110, 140, 200, 160);
    canvas.drawRoundRect(rectF_body, 10, 10, paint);//绘制圆角矩形
    //绘制胳膊
    RectF rectF_arm = new RectF(85, 75, 105, 140);
    canvas.drawRoundRect(rectF_arm, 10, 10, paint);//绘制左侧的胳膊
    rectF_arm.offset(120, 0);//设置X轴上偏移120像素
    canvas.drawRoundRect(rectF_arm, 10, 10, paint);//绘制右侧的胳膊
    //绘制腿
    RectF rectF_leg = new RectF(125, 150, 145, 200);
    canvas.drawRoundRect(rectF_leg, 10, 10, paint);//绘制左侧的腿
    rectF_leg.offset(40, 0);
    canvas.drawRoundRect(rectF_leg, 10, 10, paint);//绘制右侧的腿

这里写图片描述

绘制文本

drawText()方法用于在画布的指定位置绘制文字。常用方法如下;

drawText(String text, float x, float y, Paint paint)

drawPosText()方法也可用于在画布上绘制文字,使用该方法需要为每个字符指定一个位置。

drawPosText(String text, float[] pos, Paint paint)

例子

    Paint paintText = new Paint();//创建一个采用默认设置的画笔
    paintText.setColor(0xFFFF6600);//设置画笔颜色
    paintText.setTextAlign(Align.LEFT);//设置文字左对齐
    paintText.setTextSize(18);//设置文字大小
    paintText.setAntiAlias(true);//使用抗锯齿功能
    canvas.drawText("Hello,Android", 163, 60, paintText);//通过drawText()方法绘制文字
绘制路径

Path类常用方法

Tables Are
addArc(RectF oval, float startAngle, float sweepAngle) 添加弧形路径
addCircle(float x, float y, float radius, Path.Direction dir) 添加圆形路径
addOval(RectF oval, Path.Direction dir) 添加椭圆形路径
addRect(RectF rect, Path.Direction dir) 添加矩形路径
addRoundRect(RectF rect, float rx, float ry, Path.Direction dir) 添加圆角矩形路径
moveTo(float x, float y) 设置开始绘制直线的起始点
lineTo(float x, float y) 在moveTo()方法设置的起始点与该方法指定的结束点之间绘制一条直线
quadTo(float x1, float y1, float x2, float y2) 用于根据指定参数绘制一条线段轨迹
close() 闭合路径

例子

    Paint paint =  new Paint();//创建一个画笔
    paint.setAntiAlias(true);//设置使用抗锯齿功能
    paint.setColor(0xFFFF6600);//设置画笔颜色
    paint.setTextSize(18);//设置文字大小
    paint.setStyle(Style.STROKE);//设置填充方式为描边
    //绘制圆形路径
    Path pathCircle = new Path();
    pathCircle.addCircle(70, 70, 40, Path.Direction.CCW);//添加逆时针的圆形路径
    canvas.drawPath(pathCircle, paint);//绘制路径
    //绘制折现路径
    Path pathLine = new Path();
    pathLine.moveTo(150, 100);
    pathLine.lineTo(200, 45);
    pathLine.lineTo(250, 100);
    pathLine.lineTo(300, 80);
    canvas.drawPath(pathLine, paint);
    //绘制三角形路径
    Path pathTr = new Path();
    pathTr.moveTo(350, 80);
    pathTr.lineTo(400, 30);
    pathTr.lineTo(450, 80);
    pathTr.close();
    canvas.drawPath(pathTr, paint);
    //绘制绕路径的环形文字
    String str = "人生不想见,动如参与商";
    Path path = new Path();
    path.addCircle(200, 180, 32, Path.Direction.CW);//添加顺时针的圆形路径
    paint.setStyle(Style.FILL);
    canvas.drawTextOnPath(str, path, 0, -18, paint);

这里写图片描述

Bitmap类

Bitmap类代表位图,使用它不仅可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,而且还可以指定格式保存图像文件。
Bitmap类常用方法:

方法 描述
compress(Bitmap.CompressFormat format, int quality, OutputStream stream) 用于将Bitmap对象压缩为指定格式并保存到指定的文件输出流中,其中format参数值为Bitmap.CompressFormat.JPEG,Bitmap.CompressFormat.PNG,Bitmap.CompressFormat.WEBP
createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 用于从源位图的指定左边点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象,并按Matrix指定规则进行变换
createBitmap(int width, int height, Bitmap.Config config) 用于创建一个指定宽度和高度的新的Bitmap对象
createBitmap(Bitmap source, int x, int y, int width, int height) 用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象
createBitmap(int[] colors, int width, int height, Bitmap.Config config) 使用颜色数组创建一个指定宽度和高度的新的Bitmap对象,其中,数组元素的个数为width*height
createBitmap(Bitmap src) 用于使用源位图创建一个新的Bitmap对象
createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) 用于将源位图缩放为指定宽度和高度的新的Bitmap对象
isRecycled() 用于判断Bitmap对象是否被回收
recycle() 强制回收Bitmap对象

BitmapFactory类

该类是一个工具类,用于从不同的数据源来解析、创建Bitmap对象。

方法 描述
decodeFile(String pathName) 用于从给定的路径所指定的文件中解析、创建Bitmap对象
decodeFileDescriptor(FileDescriptor fd) 用于从FileDescriptor对应的文件中解析、创建Bitmap对象
decodeResource(Resources res, int id) 用于根据给定的资源ID从指定的资源中解析、创建Bitmap对象
decodeStream(InputStream is) 用于从指定的输入流中解析、创建Bitmap对象
版权声明:本文为博主原创文章,未经博主允许不得转载。

android 中的绘制类Paint 画笔,Canvas 画布,Bitmap 类和BitmapFactory及自定义属性

常用的绘图类是Paint 画笔,Canvas 画布,Bitmap 类和BitmapFactoryPaint类Paint类代表画笔,用来描述图形的颜色和风格,如线宽,颜色,透明度,和填充效果等信 息,...

Android 的画布Canvas和画笔Paint

版权声明:本文为转载http://blog.csdn.net/rhljiayou/article/details/7212620 目录(?)[-] Class Overview...

Android中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)

1.java.lang.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E 记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数...

通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)

绘制一个XY集是一种很常见的任务,基于Android平台的绘制很简单,它让所有的GUI在XML中定义的(虽然它也可以通过代码创建)模型是相当不错的。大部分的图形处理一个样本查看,但在大多数情况下,图应...

Android绘图总结(Bitmap,Canvas,Paint,圆角)

最近老是和绘图打交道,经常用到Canvas,bitmap,Paint,但是对它们的理解总是模糊,这里作下总结,加深对绘图的理解。 要掌握Android的画图,首先就要了解一下,基本用到的图形接口...

通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)

本文出自:http://woshixushigang.iteye.com/blog/1023876 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bi...

Android显示系统之Pixel、Bitmap、Drawable、Canvas、Paint和Matrix之间的联系

/********************************************************************************************  * aut...
  • conowen
  • conowen
  • 2012年08月06日 10:30
  • 9601

Android显示系统之Pixel、Bitmap、Drawable、Canvas、Paint和Matrix之间的联系

1、Pixel与Bitmap        Pixel       像素,又称画素,为图像显示的基本单位。每个像素可有各自的颜色值,可采用三原色显示,因而又分成红、绿、蓝三种子像素(R...

android中的Bitmap,Drawable,Canvas,Paint之间的区别和转换

转载地址:http://www.cnblogs.com/playing/archive/2011/05/10/2042241.html很多网友刚刚开始学习Android平台,对于Drawable、Bi...

Android隐喻(三) 图形绘制: Canvas、SurfaceView、Paint、Surface、SurfaceHolder、Bitmap

如果你是画家,有一群人想要看你的画,想象一下整个流程。   首先找一块画布,执笔,绘制,完成后找一面墙把画挂上去,众人围观。其中不可缺少的要素包括:画布、(画家拿笔)绘制、挂墙展示。对于计算机,也就...
  • redouba
  • redouba
  • 2014年03月18日 13:42
  • 1823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android绘图-Paint、Canvas、Bitmap、BitmapFactory
举报原因:
原因补充:

(最多只允许输入30个字)