前言:今天偶然看到我之前写过的一篇博客 Android项目中遇到的坑之(Android圆角圆形图 一),我在想,这不就是在模仿ImageView么,我为什么要模仿,直接拿来用不是更好么?我能直接在ImageView的源码上去改改代码? 于是就有了下面这篇文章了。
先上一张效果图:
效果还是很不错的,代码更简单哦~~~
但凡搞过android的童鞋一定都知道ImageView,既然ImageView已经处理好了各种缩放问题,然后兼容性就更不用说了是吧,好歹别人也是一个系统组件,那显示图片等一系列的任务ImageView都帮我们实现好了,我们无非就是在它的基础上添加一个显示圆角圆形的功能,所以我们看看它的源码..
其它的源码我们就不看了,我们重点看它的onDraw方法:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mDrawable == null) {
return; // couldn't resolve the URI
}
if (mDrawableWidth == 0 || mDrawableHeight == 0) {
return; // nothing to draw (empty bounds)
}
if (mDrawMatrix == null && mPaddingTop == 0 && mPaddingLeft == 0) {
mDrawable.draw(canvas);
} else {
final int saveCount = canvas.getSaveCount();
canvas.save();
if (mCropToPadding) {
final int scrollX = mScrollX;
final int scrollY = mScrollY;
canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop,
scrollX + mRight - mLeft - mPaddingRight,
scrollY + mBottom - mTop - mPaddingBottom);
}
canvas.translate(mPaddingLeft, mPaddingTop);
if (mDrawMatrix != null) {
canvas.concat(mDrawMatrix);
}
mDrawable.draw(canvas);
canvas.restoreToCount(saveCount);
}
}
代码还是很简单的,相比小伙伴都看得懂,我简单的说一下,当我们设置了ImageView的scaleType后,imageview会通过算法依据我们传递的scaletype类型转换成Matrix对象,我们可以看到这么一段代码:
if (mDrawMatrix != null) {
canvas.concat(mDrawMatrix);
}
转换成Matrix对象后,直接设给了当前画布,然后把我们传递给ImageView的图片显示出来:
mDrawable.draw(canvas);
canvas.restoreToCount(saveCount);
是的,没错就是这么简单~~~
然后我们需要做什么呢?
首先定一个attrs文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="RoundImageView">
<attr name="type" format="enum">
<enum name="circle" value="1"/>
<enum name="round" value="2"/>
</attr>
<attr name="radius" format="dimension"/>ssss
</declare-styleable>
</resources>
首先我们定义一个view叫RoundImageView,然后继承ImageView,重写其构造方法:
public class RoundImageView extends ImageView {
/**
* 圆形模式
*/
private static final