Android自定义圆形图片

2016-05-09 / 3 阅读 / Android

刚开始制作前以为很容易,以为对draw()有一点了解,只是重写一下就会实现。不过现实是,搞了两三天,才写出来的。
不过也并不是没有收获。对Bitmap对象到是了解的更深了。还有对图片相交模式也是初次相识。以后要仔细对相交模式研究下,确实是强大功能。

参考技术博客
图片相交模式讲解

参考

效果图:

以下是实现代码,考虑可以使用到系统ImageView定义的方法和属性,选择直接继承ImageView。
当然,需要整成控件宽度高度可能还要做较复杂的判断。这边只记录了最核心的实现原理。

public class RoundImageView extends ImageView {

    @Override
    protected void onDraw(Canvas canvas) {
        int width = getWidth();
        int height = getHeight();
        //通过查看ImageView源码,可以知道最终图片会转成Drawable对象
        //获取ImageView源drawable,并转换为Bitmap对象
        Bitmap bitMap = ((BitmapDrawable) getDrawable()).getBitmap();

        //图片缩放至当前控件大小
        Bitmap srcBitmap = Bitmap.createScaledBitmap(bitMap, width, height, true);

        //创建需要的形状
        Bitmap shapeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        //在中心画个默认颜色的圆,其他部分是透明
        Canvas shapeCanvas = new Canvas(shapeBitmap);
        shapeCanvas.drawCircle(width / 2, height / 2, width / 2, new Paint());

        //下面是比较重要的一步,new一个画笔,
        // 并设置相交模式为SRC_IN
        //什么意思
        //-->现在用一个形状去切原图片,那么相切之后的图片怎么显示了
        //-->SRC代表将要切得原图
        //-->DST代表当前主动去切的形状图
        //-->IN表示两者交集
        //-->SRC_IN 则表示两者交集,且在原图的部分
        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        shapeCanvas.drawBitmap(srcBitmap, 0, 0, paint);

        canvas.drawBitmap(shapeBitmap, 0, 0, new Paint());
    }
}

代码中基本都做了注释,还是比较详细的,个人觉得应该最简单的代码量的。如果上面原理懂了话,其他任何图形应该都不是难事。

 

相关推荐