1. 程式人生 > >android 圓角圖片的實現和封裝

android 圓角圖片的實現和封裝

最近被人問起圓角圖片的實現,花了一點時間鼓搗了下,下面簡單分享下。

先上效果圖

全部為圓角.jpg
頂部為圓角.jpg
底部為圓角.jpg
只有左上角為圓角.jpg

下面為主要原始碼,實現了 Picasso 中的 Transformation 介面。

public class RoundCornersTransformation implements Transformation {

    private float mRadius;

    private DrawCornerImage mDrawCornerImage;

    private Paint mPaint;


    public RoundCornersTransformation
(float radius, DrawCornerImage drawCornerImage) { mRadius = radius; mDrawCornerImage = drawCornerImage; mPaint = new Paint(); mPaint.setAntiAlias(true); } @Override public Bitmap transform(Bitmap source) {//這裡為主要邏輯,原理可以套用在其他地方,比如 Glide int width = source.getWidth(); int
height = source.getHeight(); Bitmap newSource = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(newSource); mPaint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); source.recycle(); //畫圓角的邏輯程式碼,交給 DrawCornerImage 介面的具體實現類
mDrawCornerImage.drawCornerImage(canvas, mPaint, mRadius, width, height); return newSource; } @Override public String key() { return RoundCornersTransformation.class.toString(); } }

定義 DrawCornerImage 介面將變化的部分抽離出來

public interface DrawCornerImage {
    void drawCornerImage(Canvas canvas, Paint paint,float radius, int right, int bottom);
}

DrawTopCornerImage 為 DrawCornerImage 的一個實現類,負責具體的圓角邏輯:只有頂部為圓角

public class DrawTopCornerImage implements DrawCornerImage {

    @Override
    public void drawCornerImage(Canvas canvas, Paint paint, float radius, int right, int bottom) {
        //繪製一個全部圓角的矩形區域長寬分別為 right 和 bottom
        canvas.drawRoundRect(new RectF(0, 0, right, bottom), radius, radius, paint);
        //繪製一個矩形長寬分別為 right 和  bottom-radius,相當於底部和上面對齊而高度差個 radius, 和上面所繪製的並集,即為圖片的可見區域。並集即為上部為圓角而底部是直角的一個區域
        canvas.drawRect(new RectF(0, radius, right, bottom), paint);

    }
}

原理簡單來講,就是所繪製區域的並集為可見區域,注意是並集不是交集。

使用起來還是比較方便的:

Picasso.with(this)
                .load(R.drawable.ic_girl)
                .transform(new RoundCornersTransformation(corner, new DrawTopLeftCornerImage()))// here change draw strategy:DrawAllCornerImage ,DrawBottomCornerImage etc.
                .into(iv);

其他的圓角邏輯可以自行發揮,上面的原理不侷限於 Picasso 完全也可以用在 Glide 或則其他地方,結合圖片庫的封裝可以對上面繼續進行一次封裝。

有一點提一下如果你的 ImageView 有用 android:scaleType=”centerCrop” 屬性,可能上面方法就有點不合適了,centerCrop 屬性會擷取圖片的中心區域展示很可能圓角就不在展示範圍了。但是大多場景 UI 給出的設計尺寸和圖片比例應該是一致的,上面的適用範圍還是很大的。

如果你想達到 centerCrop 屬性的效果,也不是不可以,只是不適合封裝在 Picasso 的內部邏輯中了。因為我們需要知道 ImageView 的寬高,這其實更合適封裝成一個自定義 View。

下面還是直接以上面的程式碼,寫個示例,並不合適使用在實際專案中,僅為了說明原理。

    @Override
    public Bitmap transform(Bitmap source) {
        float ivWidth = 600;//600 為佈局中,在我測試機中 ImageView 的畫素大小
        float ivHeight = 600;//600 為佈局中, 在我測試機中 ImageView 的畫素大小
        int width = source.getWidth();
        int height = source.getHeight();
        //按照 ImageView 的大小建立一個 Bitmap
        Bitmap newSource = Bitmap.createBitmap(ivWidth , ivHeight , Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(newSource);
        BitmapShader bitmapShader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        float scale;
       // ImageView 和原圖片的寬高比,取其大值為了放大後能夠完全覆蓋 ImageView 的大小
        scale = Math.max(ivWidth / width, ivHeight / height);
       //利用 Matrix 矩陣進行縮放和居中操作
        mShaderMatrix.reset();
        mShaderMatrix.setScale(scale, scale);
       //將放大後的圖片向上移動,達到中心位置(實際情況根據圖片的各種大小,有可能也會在 x 軸方向進行移動,這裡僅作示例演示)
        mShaderMatrix.postTranslate(0, -(height * scale - ivHeight) / 2.0f);
        bitmapShader.setLocalMatrix(mShaderMatrix);
        mPaint.setShader(bitmapShader);
        source.recycle();
        mDrawCornerImage.drawCornerImage(canvas, mPaint, mRadius, ivWidth, ivHeight);
        return newSource;
    }

QQ圖片20170425144636.jpg

大家閱讀它的原始碼會發現原理是一樣的,大家有什麼其他需要可以直接使用
RoundedImageView

相關推薦

android 圓角圖片實現封裝

最近被人問起圓角圖片的實現,花了一點時間鼓搗了下,下面簡單分享下。 先上效果圖 下面為主要原始碼,實現了 Picasso 中的 Transformation 介面。 public class RoundCornersTransfor

Android--›圓角圖片,圓角任意View,圓角父佈局Layout(任意形狀的View且超簡潔實現)

相信大家對圓角圖片已經非常熟悉了,但是圓角任意View,和圓角父佈局,甚至是任意形狀的View,肯定還是比較陌生的. 今天就揭開她的面紗. //通常情況下,圓角圖片是這樣的... public static Bitmap getRoundedCornerBit

Android平滑圖片載入快取庫 Glide 使用詳解

一、簡介在泰國舉行的谷歌開發者論壇上,谷歌為我們介紹了一個名叫 Glide的圖片載入庫,作者是bumptech。這個庫被廣泛的運用在google的開源專案中,包括2014年google I/O大會上釋出的官方app。二、 使用dependencies {    compile

Android圓角圖片最佳方案

基礎腦補: 點陣圖:256位對比32位,儲存資訊量大但是佔用記憶體也大, 影象質量較高。 ARGB:A=Alpha, R=Red, G=Green,B=Blue ARGB_8888:8888意味著它們都用8個位來顯示,32位的點陣圖。 ARGB_4444:邏輯同上,16位的點陣圖。 RGB_565

Android平滑圖片載入快取庫Glide使用詳解

在圖片載入庫爛大街的今天,選擇一個適合自己使用的圖片載入庫已經成為了每一個Android開發者的必經之路。現在市面上知名的圖片載入庫有UIL,Picasso,Volley ImageLoader,Fresco以及我們今天的主角Glide。它們各有千秋,不能評定誰

Android國際化-圖片國際化文字字元國際化

en 英文en_US 英文 (美國)ar 阿拉伯文ar_AE阿拉伯文 (阿拉伯聯合大公國)ar_BH 阿拉伯文 (巴林)ar_DZ 阿拉伯文 (阿爾及利亞)ar_EG 阿拉伯文 (埃及)ar_IQ 阿拉伯文 (伊拉克)ar_JO 阿拉伯文 (約旦)ar_KW 阿拉伯文 (科威特)ar_LB 阿拉伯文 (黎

優雅地實現Android主流圖片加載框架封裝,可無侵入切換框架

ror 要去 out drawable 如果 jpg gre cached square 項目開發中,往往會隨著需求的改變而切換到其它圖片加載框架上去。如果最初代碼設計的耦合度太高,那麽恭喜你,成功入坑了。至今無法忘卻整個項目一行行去復制粘貼被支配的恐懼。:) 那麽是否存在

Glide 圓形圖片圓角圖片實現

一、背景前言 在Android APP的設計中圓角和圓形圖片的設計是必須的,網上關於圓形和圓角圖片的實現方案也已經有很多,但是那都是人家的,因此在此總結一下,方便後續設計中的查閱,希望對需要幫助的你也有用。 二、方案的實現 2.1 方案一 使用RoundedBitmapDraw

Android 使用Glide動態載入圓形圖片圓角圖片

Glide我們都不陌生了,有時我們需要把載入下來的圖片轉成圓角或者圓形的圖片,怎麼處理呢,Glide原生沒有這個方法,於是我拓展了BitmapTransformation來實現這個功能。 效果圖: Glide是預設本地儲存的,但重複載入的時候,是不需要重

Android開發:仿微信QQ空間發說說相簿讀取、拍照、圖片裁剪圖片上傳伺服器等功能的實現

第一步:新增依賴包: dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.1' compile project('

Android開發:相簿讀取、拍照、圖片裁剪圖片上傳伺服器等功能的實現

修改日誌 2016.05.12 之前的程式存在兩個問題: 1)從相簿選擇的圖片如果比較大,會失敗; 2)無法拍照上傳照片。 修改了這兩個bug,之前的程式碼已經被覆蓋掉了,留著太誤人子弟了。同時修改了一下標題和文章的文字描述 拍照示意 相簿示

Fresco 圖片圓角實現原理及 Android圖片圓角實現方法

上篇文章 介紹了 Fresco 基礎使用和實現圖片圓角的方法,可以通過兩種方式來實現圓角:BITMAP_ONLY 模式和 OVERLAY_COLOR 模式。本文通過分析 Fresco 原始碼來介紹這兩種方式實現圓角的原理,並總結 Android 中常用的實現圖

Android selector 最佳寫法 用一張圖片實現按鈕按下普通效果的樣式

第一種方法(強烈推薦) 方法:selector做遮罩,原圖做background。 我們做按鈕的時候經常需要用兩個圖片來實現按鈕點選和普通狀態的樣式,這就需要提供兩種圖片,而且每個解析度下還有多

Android BitmapShader 實戰 實現圓形、圓角圖片

轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/41967509,本文出自:【張鴻洋的部落格】1、概述記得初學那會寫過一篇部落格Android 完美實現圖片圓角和圓形(對實現進行分析),主要是個自定View加

android實現圖片圓角實現三種方法

方法一 自定義ImageView /** * 自定義的圓角矩形ImageView,可以直接當元件在佈局中使用。 * @author caizhiming * */ public class

Android Xfermode 實戰 實現圓形、圓角圖片

1、概述其實這篇本來準備Android BitmapShader 實戰 實現圓形、圓角圖片放到一篇裡面,結果由於篇幅原因就獨立出來了~在很久以前也寫過一個利用Xfermode 實現圓形、圓角圖片的,但是那個繼承的是View,其實繼承ImageView能方便點,最起碼省去了on

Android使用ViewPager實現圖片輪播手勢滑動

ViewPager常用來實現圖片的輪播,比如淘寶首頁,會把一些促銷的商品的圖片和描述資訊來回的播放,這就是典型的使用ViewPager實現的。 ViewPager屬於佈局管理器,允許使用者通過頁面翻轉檢視左右的資料,下面通過一個例項來講解ViewPager實現圖片輪播和手

android RoundedBitmapDrawable最簡單方式實現圓角圖片(一)

一次偶然的機會,讓我發現了新大陸RoundedBitmapDrawable,不難看出他的作用是圓角圖片。今天來看下史上最簡單的方式,為啥說最簡單呢,因為系統supportV4已經提供了api,你只需一句話呼叫就完事,你說能不簡單嗎。。 先看如何使用,效果圖我放

android progressbar 使用自定義圖片時的左右兩端圓角效果實現

              前幾天一直在折騰progressbar的圓角進度條動畫,各種爬貼摸索,幾經折騰找到一種比較方便的方法實現,這裡做下筆記,避免下次折騰。原生的progressbar的條形進度條的進度左右是直角的,沒有圓角效果的。首先我們來認識一下progressb

android 在 button、textview等控制元件按下選中的時候改變顏色或圖片實現方法

首先,在res資料夾下新建一個資料夾drawable,這是無關解析度的: 在下面建立一個xml檔案:select.xml 方法1 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android