Android Shaper: Paint.Xfermode和Path,实现图片圆角效果
2015-10-23 10:32
435 查看
以前不论是圆角图片还是圆形图片,一般都是通过重新创建一个对应形状的Bitmap,然后重新设置。现在找到了一个好的方法,就是利用Xfermode的图片渲染合成原理,然后使用Path构造我们需要的效果范围,在onDraw的时候,将范围外的所有部分过滤掉。看效果图:
![](http://img.blog.csdn.net/20151023102309625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151023102351809?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20151023102410394?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其实实现原理非常简单,并且可以无限扩展。
下面是圆角矩形的实现:
OK,so easy!
源码:https://github.com/PoetKing/Shaper
其实实现原理非常简单,并且可以无限扩展。
<pre name="code" class="java">public abstract class Shaper { private Paint mPaint; private Path mPath; public Shaper(View view) { view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.TRANSPARENT); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); mPath = new Path(); } protected abstract boolean isSquare(); protected abstract void onShape(float left, float top, float right, float bottom, Path path); public void shape(Canvas canvas) { float left = 0, top = 0, right = canvas.getWidth(), bottom = canvas.getHeight(); if (isSquare() && canvas.getWidth() != canvas.getHeight()) { if (canvas.getWidth() > canvas.getHeight()) { float d = canvas.getWidth() - canvas.getHeight(); left = d / 2; right = canvas.getWidth() - d / 2; } else { float d = canvas.getHeight() - canvas.getWidth(); top = d / 2; bottom = canvas.getHeight() - d / 2; } } mPath.reset(); onShape(left, top, right, bottom, mPath); mPath.setFillType(FillType.INVERSE_EVEN_ODD); canvas.drawPath(mPath, mPaint); } public void setBlankColor(int color) { mPaint.setColor(color); } }
下面是圆角矩形的实现:
public class RoundRectShaper extends Shaper { private float radius; public RoundRectShaper(View view, float radius) { super(view); this.radius = radius; } @Override public boolean isSquare() { return false; } @Override public void onShape(float left, float top, float right, float bottom, Path path) { float width = right - left; float height = bottom - top; path.addRoundRect(new RectF(0, 0, width, height), radius, radius, Direction.CCW); } }使用方式:
public class ShaperImageView extends ImageView { private Shaper mShaper; public ShaperImageView(Context context) { super(context); } public ShaperImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (mShaper != null) { mShaper.shape(canvas); } } public void setShaper(Shaper shaper) { mShaper = shaper; } }
OK,so easy!
源码:https://github.com/PoetKing/Shaper
相关文章推荐
- Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)
- Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)
- Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)
- Binder和SurfaceFlinger以及SystemServer介绍-android学习之旅(79)
- Android studio、idea中svn不停输入用户密码
- android launchmode singleinstance后台切换问题
- 【FastDev4Android框架开发】Android首页图片自动无限循环轮播Gallery+FlowIndicator(二)
- Android 的NumberPicker相关问题
- 使用aapt查看apk包名和启动的activity
- Android textview 显示不全的问题
- Android开发中无处不在的设计模式——原型模式
- Android官方提供的支持不同屏幕大小的全部方法
- Android开发总结笔记 四大组件之ContentPovider(下) 1-2-9
- 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文
- 【Android应用开发】Android Studio 错误集锦 -- 将所有的 AS 错误集合到本文
- android比较时间
- Android 线程池及多线程下载,Progressbar动态更新以及文件保存sd卡
- Android 线程池及多线程下载,Progressbar动态更新以及文件保存sd卡
- AndroidScreenSlide项目切换view动画效果《IT蓝豹》
- Android--Activity简介及生命周期