android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)

上传人:wm****3 文档编号:42643298 上传时间:2018-06-02 格式:DOC 页数:9 大小:17.17KB
返回 下载 相关 举报
android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)_第1页
第1页 / 共9页
android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)_第2页
第2页 / 共9页
android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)_第3页
第3页 / 共9页
android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)_第4页
第4页 / 共9页
android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)》由会员分享,可在线阅读,更多相关《android实现自定义圆形、圆角和椭圆imageview(使用xfermode图形渲染方法)(9页珍藏版)》请在金锄头文库上搜索。

1、AndroidAndroid 实现自定义圆形、圆角和椭圆实现自定义圆形、圆角和椭圆 ImageView(ImageView(使用使用 XfermodeXfermode 图图形渲染方法形渲染方法) )一:简介:在上一篇Android 实现圆形、圆角和椭圆自定义图片 View(使用BitmapShader 图形渲染方法) 博文中,采用 BitmapShader 方法实现自定义的圆形、圆角等自定义 ImageView,这篇我们将采用更为常见的 Xfermode 渲染模式方案来实现圆形、圆角和椭圆样式的ImageView,同样本实例也是直接继承 ImageView,这样可以省很多事情,比如测量步骤,以

2、及不需要自己去写设置图片的方法,本文使用 Xfermode 模式中的 DST_IN 模式来实现要达到的效果,当然大家也可以采用其他的模式,比如 SRC_IN 等都可以实现该效果。(照例完整源代码在文章的最后给出下载地址哈)二:效果图:三、Xfermode 渲染模式简介:xfermode 影响在 Canvas 已经有的图像上绘制新的颜色的方式 * 正常的情况下,在图像上绘制新的形状,如果新的 Paint 不是透明的,那么会遮挡下面的颜色. * 如果新的 Paint 是透明的,那么会被染成下面的颜色 下面的 Xfermode 子类可以改变这种行为: AvoidXfermode 指定了一个颜色和容差

3、,强制 Paint 避免在它上面绘图(或者只在它上面绘图)。 PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素 XOR 操作。 PorterDuffXfermode 这是一个非常强大的转换模式,使用它,可以使用图像合成的 16 条Porter-Duff 规则的任意一条来控制 Paint 如何与已有的 Canvas 图像进行交互。这里不得不提到那个经典的图:上面的 16 种模式的说明如下:从上面我们可以看到 PorterDuff.Mode 为枚举类,一共有 16 个枚举值:1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上。2.PorterDuff.M

4、ode.SRC显示上层绘制图片 3.PorterDuff.Mode.DST显示下层绘制图片 4.PorterDuff.Mode.SRC_OVER正常绘制显示,上下层绘制叠盖。5.PorterDuff.Mode.DST_OVER上下层都显示。下层居上显示。6.PorterDuff.Mode.SRC_IN取两层绘制交集。显示上层。7.PorterDuff.Mode.DST_IN取两层绘制交集。显示下层。8.PorterDuff.Mode.SRC_OUT取上层绘制非交集部分。9.PorterDuff.Mode.DST_OUT取下层绘制非交集部分。10.PorterDuff.Mode.SRC_ATOP

5、取下层非交集部分与上层交集部分 11.PorterDuff.Mode.DST_ATOP取上层非交集部分与下层交集部分 12.PorterDuff.Mode.XOR异或:去除两图层交集部分 13.PorterDuff.Mode.DARKEN取两图层全部区域,交集部分颜色加深14.PorterDuff.Mode.LIGHTEN取两图层全部,点亮交集部分颜色 15.PorterDuff.Mode.MULTIPLY取两图层交集部分叠加后颜色 16.PorterDuff.Mode.SCREEN取两图层全部区域,交集部分变为透明色四、自定义圆形、圆角和椭圆的 ImageView 的实现1、测量 View

6、的大小,对圆形作特殊处理/* 测量 view 的大小*/Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) / TODO Auto-generated method stubsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);/如果类型是圆形,则强制设置 view 的宽高一致,取宽高的较小值 if(mType = TYPE_CIRCLE)int width = Math.min(getMeasuredWidth(),getMeasured

7、Height();setMeasuredDimension(width, width);2、绘制不同图形的 Bitmap,供 onDraw()绘制的时候用/* 绘制不同的图形 Bitmap*/private Bitmap getDrawBitmap()Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); pai

8、nt.setColor(Color.BLACK); if(mType = TYPE_CIRCLE)/绘制圆形 canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2, paint); else if(mType = TYPE_ROUND) /绘制圆角矩形canvas.drawRoundRect(new RectF(0, 0, getWidth(), getHeight(), mRoundBorderRadius, mRoundBorderRadius, paint); else if(mType = TYPE_OVAL

9、)/绘制椭圆canvas.drawOval(new RectF(0, 0, getWidth(), getHeight(), mPaint);return bitmap; 3、在 onDraw()中绘制出来/* 绘制 view 的内容*/Overrideprotected void onDraw(Canvas canvas) / TODO Auto-generated method stub/从缓存中取出 bitmapBitmap bmp = (mBufferBitmap = null ? null:mBufferBitmap.get();if(bmp = null | bmp.isRecyc

10、led()/如果没有缓存存在的情况/获取 drawableDrawable drawable = getDrawable();/获取 drawable 的宽高int dwidth = drawable.getIntrinsicWidth();int dheight = drawable.getIntrinsicHeight();Log.v(“czm“,“dwidth=“+dwidth+“,width=“+getWidth();if(null != drawable)bmp = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_88

11、88); float scale = 1.0f;/创建画布Canvas drawCanvas = new Canvas(bmp);/按照 bitmap 的宽高,以及 view 的宽高,计算缩放比例;因为设置的 src 宽高/比例可能和 imageview 的宽高比例不同,这里我们不希望图片失真; if(mType = TYPE_CIRCLE) /如果是圆形 scale = getWidth() * 1.0F / Math.min(dwidth, dheight); else if (mType = TYPE_ROUND | mType = TYPE_OVAL) /如果是圆角矩形或椭圆 / 如果

12、图片的宽或者高与 view 的宽高不匹配,计算出需要缩放的比例;/缩放后的图片的宽高,一定要大于我们 view 的宽高;所以我们这里取大值; scale = Math.max(getWidth() * 1.0f / dwidth, getHeight() * 1.0f / dheight); Log.v(“czm“,“scale=“+scale);/根据缩放比例,设置 bounds,即相当于做缩放图片 drawable.setBounds(0, 0, (int)(scale * dwidth), (int)(scale * dheight);drawable.draw(drawCanvas);

13、/获取 bitmap,即圆形、圆角或椭圆的 bitmapif(mMaskBitmap = null | mMaskBitmap.isRecycled()mMaskBitmap = getDrawBitmap();/为 paint 设置 Xfermode 渲染模式mPaint.reset();mPaint.setFilterBitmap(false);mPaint.setXfermode(mXfermode);/绘制不同形状drawCanvas.drawBitmap(mMaskBitmap, 0, 0,mPaint);mPaint.setXfermode(null);/将准备好的 bitmap

14、绘制出来 canvas.drawBitmap(bmp, 0, 0, null); /bitmap 缓存起来,避免每次调用 onDraw,分配内存 mBufferBitmap = new WeakReferenceBitmap(bmp); else/如果缓存还存在的情况mPaint.setXfermode(null); canvas.drawBitmap(bmp, 0.0f, 0.0f, mPaint); return; 4、因为使用了弱引用的缓存技术,所以需要在重写invalidate()方法中做些释放回收资源等处理:/* 因为使用了缓存技术,所以需要在 invalidate 中做些回收释放资

15、源的处理*/Overridepublic void invalidate() / TODO Auto-generated method stubmBufferBitmap = null;if(mMaskBitmap != null)mMaskBitmap.recycle();mMaskBitmap = null;super.invalidate();五、视图布局的实现:ScrollView xmlns:android=“http:/ com.czm.myroundimageview.XCRoundImageViewByXfermodeandroid:id=“+id/cicleImageView“android:layout_width=“150dp“android:layout

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号