一. 前言
绘制图片分为:绘制矢量图(drawPicture)和 绘制位图(drawBitmap)。
二. 绘制矢量图
1. 作用
绘制矢量图的内容,即绘制存储在矢量图里某个时刻Canvas绘制内容的操作。
2. 应用场景
① 相比于再次调用各种绘图API,使用Picture能节省操作 & 时间。
② 如果不手动调用,录制的内容不会显示在屏幕上,只是存储起来。
3. 使用步骤
1 2 3 4 5
| public Canvas beginRecording(int width, int height)
public void endRecording()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Picture mPicture = new Picture();
mPicture.beginRecording(int width, int height);
canvas.drawCircle(500,500,400,mPaint);
mPicture.endRecording ();
mPicture.draw (Canvas canvas);
|
4. 调用录制好的Picture的三种方式
① Picture的draw方法
1 2 3 4 5 6 7 8 9
| @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); mPicture.draw(canvas); }
|
② Canvas的drawPicture提供了三种方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public void drawPicture (Picture picture)
public void drawPicture (Picture picture, Rect dst)
public void drawPicture (Picture picture, RectF dst) @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); canvas.drawPicture(mPicture, new RectF(0, 0, mPicture.getWidth(), mPicture.getHeight()));
canvas.drawPicture(mPicture, new RectF(0, 0, mPicture.getWidth(), 200)); }
|
③ PictureDrawable的draw方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| @Override protected void onDraw(Canvas canvas){ super.onDraw(canvas); PictureDrawable drawable = new PictureDrawable(mPicture);
drawable.setBounds(0, 0,mPicture.getWidth(), mPicture.getHeight()); drawable.draw(canvas);
drawable.setBounds(0, 0,250, mPicture.getHeight()); drawable.draw(canvas); }
|

④ 总结

三. 绘制位图
1. 作用
将已有的图片转换为位图(Bitmap),最后再绘制到Canvas上。
2. 获取bitmap的三种方式

第一种方式排除,第二种方式虽然满足要求,但是一般不推荐使用,一般使用第三种。
3. BitmapFactory获取Bitmap的方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(),R.raw.bitmap);
Bitmap bitmap = null; try { InputStream is = mContext.getAssets().open("bitmap.png"); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); }
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/bitmap.png");
Bitmap bitmap = BitmapFactory.decodeStream(is); is.close();
|
4. 绘制Bitmap的四种方式
1 2 3 4 5 6 7 8 9 10 11
| public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint)
|
① 方法1
1 2 3 4 5
| public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)
canvas.drawBitmap(bitmap,new Matrix(),new Paint());
|

关于利用Matrix对图片的操作可以参考:Bitmap的简单使用
② 方法2
1 2 3 4 5
| public void drawBitmap (Bitmap bitmap, float left, float top, Paint paint)
canvas.drawBitmap(bitmap,300,400,new Paint());
|

③ 方法3
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)
Rect src = new Rect(0,0,bitmap.getWidth()/2,bitmap.getHeight());
Rect dst = new Rect(100,100,250,250);
canvas.drawBitmap(bitmap,src,dst,null);
|

应用场景:
① 素材管理
将素材都放在一个图,那么按需绘制会便于管理

② 实现动态效果
一个资源文件,然后逐渐描绘就可以达到动态效果。

