本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出。于是自己自定义了个View,实现图片的圆角以及圆形效果。效果图:
第一个是原图,第二个是圆形效果,第三第四设置了不同的圆角大小。
准备改变一个博客的风格,首先给大家讲一下原理,让大家明白了,然后再贴代码,不然可以直接看那么长的代码也比较痛苦,核心代码其实就那么几行:
核心代码分析:
- /**
- * 根据原图和变长绘制圆形图片
- *
- * @param source
- * @param min
- * @return
- */
- private Bitmap createCircleImage(Bitmap source, int min)
- {
- final Paint paint = new Paint();
- paint.setAntiAlias(true);
- Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
- /**
- * 产生一个同样大小的画布
- */
- Canvas canvas = new Canvas(target);
- /**
- * 首先绘制圆形
- */
- canvas.drawCircle(min / 2, min / 2, min / 2, paint);
- /**
- * 使用SRC_IN
- */
- paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
- /**
- * 绘制图片
- */
- canvas.drawBitmap(source, 0, 0, paint);
- return target;
- }
从Android的示例中,给大家证明一下:
下面有一张PorterDuff.Mode的16中效果图,咱们的只是其一:
源码咱们只关心谁先谁后绘制的:
- canvas.translate(x, y);
- canvas.drawBitmap(mDstB, 0, 0, paint);
- paint.setXfermode(sModes[i]);
- canvas.drawBitmap(mSrcB, 0, 0, paint);
- paint.setXfermode(null);
- canvas.restoreToCount(sc);
好了,原理和核心代码解释完成。下面开始写自定义View。
1、自定义属性:
- /**
- * TYPE_CIRCLE / TYPE_ROUND
- */
- private int type;
- private static final int TYPE_CIRCLE = 0;
- private static final int TYPE_ROUND = 1;
- /**
- * 图片
- */
- private Bitmap mSrc;
- /**
- * 圆角的大小
- */
- private int mRadius;
- /**
- * 控件的宽度
- */
- private int mWidth;
- /**
- * 控件的高度
- */
- private int mHeight;
- public CustomImageView(Context context, AttributeSet attrs)
- {
- this(context, attrs, 0);
- }
- public CustomImageView(Context context)
- {
- this(context, null);
- }
- /**
- * 初始化一些自定义的参数
- *
- * @param context
- * @param attrs
- * @param defStyle
- */
- public CustomImageView(Context context, AttributeSet attrs, int defStyle)
- {
- super(context, attrs, defStyle);
- TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle, 0);
- int n = a.getIndexCount();
- for (int i = 0; i
关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录