频道栏目
首页 > 程序开发 > 移动开发 > Android > 正文
android 自定義圓角圖片控件
2017-08-10 11:07:22      个评论    来源:fei810711peng的博客  
收藏   我要投稿
android 自定義圓角圖片控件:
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

 * 版 权: Anhui 行云天下 Intelligent Technology CO.,LTD. Copyright YYYY-YYYY, All rights reserved

 * 修 改 人: gq

 * 修改时间: 2017/8/2

 * 功能描述:自定义控件实现圆角
 */
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應該已經取出,但是下層非交集處也被展示出來。
点击复制链接 与好友分享!回本站首页
上一篇:android 获取手机位置信息
下一篇:cocos2dx+vs2013生成的安卓项目,编译时提示环境变量 ANDROID SDK_ROOT 没有定义
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站