} onDraw方法中处理 @Override protected void onDraw(Canvas canvas) { //画原图 canvas.drawBitmap (bitmapSrc, 0, 0, mPaint); //在原图下方画目标图 canvas.drawBitmap(bitmapDst, 0, bitmapSrc.getHeight matrix.setScale(1,-1); matrix.postTranslate(0,bitmapSrc.getHeight()*2); canvas.drawBitmap
RectF rect, float rx, float ry, Paint paint); //画路径 void drawPath(Path path, Paint paint); //画位图 void drawBitmap (Bitmap bitmap, float left, float top, Paint paint); void drawBitmap(Bitmap bitmap, Rect src, RectF dst , Paint paint); void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint); void drawBitmap(int[ ] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, void drawBitmap , int offset, int stride, int x, int y, int width, int height, boolean hasAlpha, Paint paint); void drawBitmap
1.1 clipRect() 使用很简单,直接应用: canvas.clipRect(left, top, right, bottom); canvas.drawBitmap(bitmap, x, canvas.save(); canvas.translate(200, 0); canvas.drawBitmap(bitmap, x, y, paint); canvas.restore canvas.save(); canvas.translate(200, 0); canvas.drawBitmap(bitmap, x, y, paint); canvas.restore canvas.save(); canvas.skew(0, 0.5f); canvas.drawBitmap(bitmap, x, y, paint); canvas.restore(); canvas.save(); canvas.translate(200, 0); canvas.drawBitmap(bitmap, x, y, paint); canvas.restore
1.绘制图片 绘制有两种方法,drawPicture(矢量图) 和 drawBitmap(位图) (1)drawPicture 使用Picture前请关闭硬件加速,以免引起不必要的问题! 在使用Picture之前请关闭硬件加速,以免引起不必要的问题 (2)drawBitmap 通过BitmapFactory从不同位置获取Bitmap: 1.资源文件(drawable/mipmap/raw 绘制Bitmap: 依照惯例先预览一下drawBitmap的常用方法: // 第一种 public void drawBitmap (Bitmap bitmap, Matrix matrix, Paint void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) public void drawBitmap (Bitmap bitmap canvas.drawBitmap(bitmap,200,500,new Paint()); 第三种方法,多了两个矩形区域(src,dst) 名称 作用 Rect src 指定绘制图片的区域 Rect
R.drawable.show); } @Override public void dispatchDraw(Canvas canvas) { canvas.translate(100, 0); canvas.drawBitmap (bmp, matrix, null); canvas.translate(0, 250); canvas.drawBitmap(bmp, matrix, mPaint); canvas.setDrawFilter (pfd); canvas.translate(0, 250); canvas.drawBitmap(bmp, matrix, null); } } 下图是效果: ?
new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); /** * 绘制图片 */ canvas.drawBitmap 下面有一张PorterDuff.Mode的16中效果图,咱们的只是其一: 源码咱们只关心谁先谁后绘制的 canvas.translate(x, y); canvas.drawBitmap (mDstB, 0, 0, paint); paint.setXfermode(sModes[i]); canvas.drawBitmap (createCircleImage(mSrc, min), 0, 0, null); break; case TYPE_ROUND: canvas.drawBitmap new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); /** * 绘制图片 */ canvas.drawBitmap
setMeasuredDimension()方法,参数:宽度,高度;调用背景Bitmap对象的getWidth()和getHeight() 重写onDraw()方法,传递进来Canvas对象 调用Canvas对象的drawBitmap 上边点(0),Paint对象 获取Paint对象,new出来 调用Paint对象的setAntiAlias(),设置抗锯齿,参数:布尔值 滑动按钮 滑动按钮目前的位置,0,0,状态是 关 canvas.drawBitmap (bitmapBtn, 0, 0, paint); 滑动按钮的位置在,背景图的宽度-滑动按钮的宽度,0,状态是 开 canvas.drawBitmap(bitmapBtn, 背景图的宽度-滑动按钮的宽度 view */ @Override protected void onDraw(Canvas canvas) { //绘制背景 canvas.drawBitmap (bitmapBackground, 0, 0, paint); //绘制滑动按钮 canvas.drawBitmap(bitmapBtn, slideBtnLeft,
我们在绘制第二张图的时候是距离左边距为0,而此时我们已经计算出了开启状态需要距离左边的边距,所以,我们只需这样修改 canvas.drawBitmap(slidingBitmap,slidLeftMax (backgroundBitmap, 0, 0, paint); canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint); } (backgroundBitmap, 0, 0, paint); canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint); } (backgroundBitmap, 0, 0, paint); canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint); } (backgroundBitmap, 0, 0, paint); canvas.drawBitmap(slidingBitmap, slideLeft, 0, paint); }
event); } @Override protected void onDraw(Canvas canvas) { //画结果 canvas.drawBitmap null, Canvas.ALL_SAVE_FLAG); //画DST dstCanvas.drawPath(path,pathPaint); canvas.drawBitmap new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT); mPaint.setXfermode(xfermode); canvas.drawBitmap
rectF, roundPX, roundPX, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap (height + height/2), Config.ARGB_8888); Canvas canvas = new Canvas(reflectedBitmap); canvas.drawBitmap defaultPaint = new Paint(); canvas.drawRect(0, height, width, height + reflectedGap, defaultPaint); canvas.drawBitmap super.onCreate(savedInstanceState); setContentView(R.layout.main); drawBitmap (); } private void drawBitmap(){ imgView1 = (ImageView)findViewById(R.id.imgView1
(canvas, null, null, mSwitch_off); drawBitmap(canvas, null, null, mSwitch_thumb); canvas.translate(mSwitch_on.getWidth() - mSwitch_thumb.getWidth(), 0); drawBitmap SWITCH_ON : SWITCH_OFF; drawBitmap(canvas, new Rect(0, 0, mDstX, mBmpHeight), new Rect mPaint); int count = canvas.save(); canvas.translate(mDstX, 0); drawBitmap bitmap.getWidth(), bitmap.getHeight()) : dst); Paint paint = new Paint(); canvas.drawBitmap
方法很简单,在 View 里面,重载 onDraw(Canvas canvas) 方法,然后用 canvas.drawBitmap() 方法,将其画在屏幕上。 canvas.drawBitmap(mBitmap, 0, 0, null); } } 结果: ? 原图: ? 虽然这仅仅只是第一步,但是很鼓舞人心呢,呵呵。 canvas.drawBitmap(mBitmap, 0, 0, null); } } 显示结果: ? 下面一篇将介绍对Bitmap的一些操作。
int top = (int) (getWidth() / 2 - getWidth() / 3 - getWidth() / 1.5f / 8); canvas.drawBitmap (mInnerCircleBitmap,left,top,mPaint); canvas.drawBitmap(mOutCircleBitmap,left,top,mPaint); canvas.save(); canvas.rotate(mDegress,getWidth() / 2, getWidth() / 2); canvas.drawBitmap canvas.save(); canvas.rotate(-mDegress,getWidth() / 2, getWidth() / 2); canvas.drawBitmap
下面是drawBitmap的几个比较常用的重载方法: drawBitmap(Bitmap bitmap, float left, float top, Paint paint) bitmap:Bitmap top:看2 paint:画笔 drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) src:在Bitmap图片上截取一部分作为绘制源,可 drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint) matrix:Matrix的参数传入是的drawBitmap功能变得异常强大,让此方法有意思了许多 在onDraw方法中drawBitmap的以上重载方法,注意在使用完Bitmap之后记得用Bitmap.recycle()来回收掉资源,以防止oom。 ); // 绘制图片 canvas.drawBitmap(bitmap, 0, 300, null); // 将图片拉伸平铺在RectF矩形内 canvas.drawBitmap(bitmap, null
/** * 以一个Bitmap为画布,画上一个Bitmap * @param canvasBitmap 作为画布的Bitmap * @param drawBitmap (Bitmap canvasBitmap, Bitmap drawBitmap, int top, int left) { Canvas localCanvas = new Canvas(canvasBitmap);//以canvasBitmap生成画布 localCanvas.drawBitmap(drawBitmap, left, top, null);//在画布上移left和top左标开始绘制drawBitmap localCanvas.save(Canvas.ALL_SAVE_FLAG);//保存 localCanvas.restore(); drawBitmap.recycle();//释放掉drawBitmap,防止内存泄漏 } 加载资源文件中的图片为
float y = 10; // 设置纵坐标 p.setColor(Color.RED); // 设置画笔为红色 canvas.drawBitmap 10, y, p); // 绘制第 1 个位图(原始图像) y += mBitmap.getHeight() + 10; // 纵坐标增加 canvas.drawBitmap += mBitmap2.getHeight() + 10; // 纵坐标增加 p.setShader(mShader); // 设置阴影 canvas.drawBitmap
Destination Image ) : 先绘制的是目标图像 , 设置 Xfermod 图形组合模式后 , 绘制的是源图像 ; //绘制目标图像 ( Destination Image ) canvas.drawBitmap 目标图像 ( SourceImage ) : 先绘制的是目标图像 , 设置 Xfermod 图形组合模式后 , 绘制的是源图像 ; //绘制 源图像 ( SourceImage ) canvas.drawBitmap 0, paint); ⑤ 代码总结 : 使用 Xfermod 的四个步骤 : // 1.创建画笔 Paint paint = new Paint(); // 2.绘制目标图像 canvas.drawBitmap choose a mode paint.setXfermode(new PorterDuffXfermode(mode)); // 4.绘制 源图像 ( SourceImage ) canvas.drawBitmap
"width:${w}" + " height:${h}" mView.post { mView.drawBitmap ViewOverlay中加入了专门为人脸贴图定义的几个变量,mFaceBitmap直接加载的资源里面的png图片,mFaceRect的矩形也是直接获取加载后的mFaceBitmap的矩形大小,定义的这两个主要为了drawBitmap drawBitmap(it, x, y, Paint()) } mRects?. drawBitmap( mFaceBitmap, mFaceRect, p, Paint() ) onDraw事件里针对每个一Rect矩形,我们都在原矩形的基础上再扩大10,所以除了位置偏移后再对每个点做了一个10的固定偏移,最后用drawBitmap画出图像就实现了贴图的效果。 ?
drawBitmap 需要指定范围 RectF,只要知道小图圆心坐标就行了。 bitmapRadius, pos[1] - bitmapRadius, pos[0] + bitmapRadius, pos[1] + bitmapRadius); // 根据这个范围绘制头像 canvas.drawBitmap totalRadius, paint); switch (bitmaps.size()) { // case 1: // canvas.drawBitmap bitmapRadius, pos[1] - bitmapRadius, pos[0] + bitmapRadius, pos[1] + bitmapRadius); canvas.drawBitmap rectF; } if (i == bitmapSize-1) { // 最后一张图片,生成另一个大的图片 canvas.drawBitmap
paint.setColor(Color.BLACK); paint.setAntiAlias(true); final Matrix matrix = new Matrix(); canvas.drawBitmap 0,// 蓝色值 0, 0, 0, 1, 0 // 透明度 }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap 0,// 蓝色值 0, 0, 0, 1, 0 // 透明度 }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap 0,// 蓝色值 0, 0, 0, 1, 0 // 透明度 }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap 0,// 蓝色值 0, 0, 0, 1, 0 // 透明度 }); paint.setColorFilter(new ColorMatrixColorFilter(cm)); canvas.drawBitmap