android 自定義圓角ImageView(圓形,其他形狀雷同)

前言:
1.有句話說得好,好記性不如爛筆頭,寫博客其實主要還是給以後的自己看的(喂,我是以前的你,還能看得懂嗎?)
2.程序員寫代碼,能用一句話別那麼多廢話。自定義圓角控件(包括其他自定義代碼等等),網上很多,一搜一大坨,但是真正好的很少很少,都是抄,抄,抄,(咳咳....當然了我這個是借鑒,咳咳,借鑒哈)。對別人的代碼一定要理解,如果別人寫的不好,或者啰嗦的地方,用自己的理解去重新實現他,如下:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.master.basecommon.other.utils.BitmapUtils;

/**
 * 项 目 名: zing-android-reconfiguration<br>
 * 版 权: Anhui 行云天下 Intelligent Technology CO.,LTD. Copyright YYYY-YYYY, All rights reserved<br>
 * 修 改 人: gq<br>
 * 修改时间: 2017/8/2<br>
 * 功能描述:自定义控件实现圆角
 */
public class RoundAngleImageView extends ImageView
{
    
    /**
     *
     * 这个是画圆的半径
     */
    private int roundSize = 20;
    
    public RoundAngleImageView(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
    }
    
    public RoundAngleImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }
    
    public RoundAngleImageView(Context context)
    {
        super(context);
    }
    
    @Override
    public void onDraw(Canvas canvas)
    {
        Drawable drawable = getDrawable();
        if (null != drawable)
        {
            Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap();

            Bitmap b = BitmapUtils.getRoundBitmap(bitmap, roundSize);

            final Rect rectSrc = new Rect(0, 0, getWidth(), getHeight());
            canvas.drawBitmap(b, rectSrc, rectSrc, null);
        }
        else
        {
            super.onDraw(canvas);
        }
    }
}
 
自己新建一個BitmapUtils,加入getRoundBitmap,製作圓角方法:
/**
 * 获取圆角矩形图片方法
 * 
 * @param bitmap
 * @param roundPx,一般设置成14
 */
public static Bitmap getRoundBitmap(Bitmap bitmap, int roundPx)
{
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);
    
    Paint paint = new Paint();
    paint.setColor(Color.BLUE);
    paint.setAntiAlias(true);// 抗锯齿
    
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);
    canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    
    paint.reset();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));// 取上层和下层交集上層
    canvas.drawBitmap(bitmap, rect, rect, paint);
    return output;
    
}

本人如此之帥,代碼如此清晰還用解釋嗎:so easy!!!

注意:這裡需要說明下,很嚴重的問題就是paint.setXfermode,即繪製的兩個圖層交集模式問題,個人強烈建議對上層的進行操作(例如,圓角矩形和bitmap交集取上層,SRC_IN),因為如果取下層,比如把bitmap放在下層,圓角矩形放在上層,使用DST_IN(上下交集取下層),按字面上理解應該是去了圓角的bitmap了,但是顯示的是圓角全部
如下圖所示:
         
              
  圖1(SRC_IN)        圖2(DST_IN

圖1:是canvas先畫圓角矩形,然後畫bitmap---正常
圖2:先畫bitmap再畫圓角矩形,初步判斷:實際圓角bitmap應該已經取出,但是下層非交集處也被展示出來。
 
 
註解:還有一個更簡便的圓角(圓形)方法
思路:
在imageview的src屬性和background屬性想辦法,因為src在background上面,所以我們可以把需要設置圓角的圖片設置為background,src配置遮蓋(自己網上搜一下,通過xml配置)成圓角就ok。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值