博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义圆形ImageView(解决Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();报错问题)
阅读量:5924 次
发布时间:2019-06-19

本文共 3063 字,大约阅读时间需要 10 分钟。

package com.bottle.bottlelilibrary.view;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PixelFormat;import android.graphics.PorterDuff.Mode;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;/** * 自定义ImageView,将图片转换为圆形 */public class XCRoundImageView extends android.support.v7.widget.AppCompatImageView {    private Paint paint;    public XCRoundImageView(Context context) {        this(context, null);    }    public XCRoundImageView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public XCRoundImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        paint = new Paint();    }    /**     * 绘制圆形图片     *     * @author caizhiming     */    @Override    protected void onDraw(Canvas canvas) {        Drawable drawable = getDrawable();        if (null != drawable) {//            Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();//此方法报错            Bitmap bitmap = drawableToBitmap(drawable);//使用此方法将drawable转换成bitmap            Bitmap b = getCircleBitmap(bitmap, 14);            final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());            final Rect rectDest = new Rect(0, 0, getWidth(), getHeight());            paint.reset();            canvas.drawBitmap(b, rectSrc, rectDest, paint);        } else {            super.onDraw(canvas);        }    }    /**     * 将Drawable转换成bitmap     *     * @param drawable     * @return     */    public static Bitmap drawableToBitmap(Drawable drawable) {        int w = drawable.getIntrinsicWidth();        int h = drawable.getIntrinsicHeight();        Bitmap.Config config =                drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888                        : Bitmap.Config.RGB_565;        Bitmap bitmap = Bitmap.createBitmap(w, h, config);        //注意,下面三行代码要用到,否则在View或者SurfaceView里的canvas.drawBitmap会看不到图        Canvas canvas = new Canvas(bitmap);        drawable.setBounds(0, 0, w, h);        drawable.draw(canvas);        return bitmap;    }    /**     * 获取圆形图片方法     *     * @param bitmap     * @param pixels     * @return Bitmap     * @author caizhiming     */    private Bitmap getCircleBitmap(Bitmap bitmap, int pixels) {        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),                bitmap.getHeight(), Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(output);        final int color = 0xff424242;        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());        paint.setAntiAlias(true);        canvas.drawARGB(0, 0, 0, 0);        paint.setColor(color);        int x = bitmap.getWidth();        canvas.drawCircle(x / 2, x / 2, x / 2, paint);        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));        canvas.drawBitmap(bitmap, rect, rect, paint);        return output;    }}

 

转载于:https://www.cnblogs.com/1925yiyi/p/9429865.html

你可能感兴趣的文章
spring-cloud: eureka之:ribbon负载均衡配置(一)
查看>>
英语语法总结---一、英语中定语放在哪
查看>>
[转]npm、 cnpm、yarn
查看>>
净推荐值(NPS):用户忠诚度测量的基本原理及方法
查看>>
我终于开通了微信公众号
查看>>
Spring3:AOP
查看>>
如何将本地的项目上传到git
查看>>
java结合testng,利用mysql数据库做数据源的数据驱动实例
查看>>
C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用...
查看>>
银行传统支付通道与支付平台结合
查看>>
activiti5/6 系列之--Activiti与BPMN2.0规范相关节点对应关系
查看>>
【译文】抽象漏洞法则
查看>>
获取音、视频时长(NAudio,Shell32,FFmpeg)
查看>>
SNMP协议
查看>>
大二结束前的一通胡言乱语
查看>>
sf.net zurückgekommen
查看>>
Java常见疑惑和陷阱
查看>>
关于nand flash的地址 A8,寻址
查看>>
Windows Azure Cloud Service (22) Web Role的Full IIS特性
查看>>
HtmlWeb类
查看>>