Android绘图-Paint、Canvas、Bitmap、BitmapFactory

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类常用方法

TablesAre
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 Bitmap用法总结 Bitmap用法总结 1、Drawable → Bitmap public static Bitmap drawableToBitmap(Drawable drawable) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); // canvas.setBitmap(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); return bitmap; } 2、从资源中获取Bitmap Resources res=getResources(); Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic); 3、Bitmap → byte[] private byte[] Bitmap2Bytes(Bitmap bm){ ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(); } 4、byte[] → Bitmap private Bitmap Bytes2Bimap(byte[] b){ if(b.length!=0){ return BitmapFactory.decodeByteArray(b, 0, b.length); } else { return null; } } 5、保存bitmap static boolean saveBitmap2file(Bitmap bmp,String filename){ CompressFormat format= Bitmap.CompressFormat.JPEG; int quality = 100; OutputStream stream = null; try { stream = new FileOutputStream("/sdcard/" + filename); } catch (FileNotFoundException e) { // TODO Auto-generated catch block Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. e.printStackTrace(); } return bmp.compress(format, quality, stream); } 6、将图片按自己的要求缩放 // 图片源 Bitmap bm = BitmapFactory.decodeStream(getResources() .openRawResource(R.drawable.dog)); // 获得图片的宽高 int width = bm.getWidth(); int height = bm.getHeight(); // 设置想要的大小 int newWidth = 320; int newHeight = 480; // 计算缩放比例 float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // 取得想要缩放的matrix参数 Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); // 得到新的图片 Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true); // 放在画布上 canvas.drawBitmap(newbm, 0, 0, paint); 相关知识链接:http://www.eoeandroid.com/thread-3162-1-1.html 7、bitmap的用法小结 BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = 2; //将图片设为原来宽高的1/2,防止内存溢出 Bitmap bm = BitmapFactory.decodeFile("",option);//文件流 URL url = new URL(""); InputStream is = url.openStream(); Bitmap bm = BitmapFactory.decodeStream(is); android:scaleType: android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别: CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分 显示 CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长 (宽) CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片 长/宽等于或小于View的长/宽 Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示 FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 FIT_XY / fitXY 把图片 不按比例 扩大/缩小到View的大小显示 MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。 //放大缩小图片 public static Bitmap zoomBitmap(Bitmap bitmap,int w,int h){ int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); float scaleWidht = ((float)w / width); float scaleHeight = ((float)h / height); matrix.postScale(scaleWidht, scaleHeight); Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); return newbmp; } //将Drawable转化为Bitmap public static Bitmap drawableToBitmap(Drawable drawable){ int width = drawable.getIntrinsicWidth(); int height = drawable.getIntrinsicHeight(); Bitmap bitmap = Bitmap.createBitmap(width, height, drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0,0,width,height); drawable.draw(canvas); return bitmap; Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. } //获得圆角图片的方法 public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundPx){ Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap .getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xff424242; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawRoundRect(rectF, roundPx, roundPx, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return output; } //获得带倒影的图片方法 public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap){ final int reflectionGap = 4; int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.preScale(1, -1); Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height/2, width, height/2, matrix, false); Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888); Canvas canvas = new Canvas(bitmapWithReflection); canvas.drawBitmap(bitmap, 0, 0, null); Paint deafalutPaint = new Paint(); Generated by Foxit PDF Creator © Foxit Software http://www.foxitsoftware.com For evaluation only. canvas.drawRect(0, height,width,height + reflectionGap, deafalutPaint); canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null); Paint paint = new Paint(); LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0, bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff, TileMode.CLAMP); paint.setShader(shader); // Set the Transfer mode to be porter duff and destination in paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN)); // Draw a rectangle using the paint with our linear gradient canvas.drawRect(0, height, width, bitmapWithReflection.getHeight() + reflectionGap, paint); return bitmapWithReflection; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值