最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View之繪制圓形頭像功能

 更新時(shí)間:2019年09月17日 09:35:58   作者:黃林晴  
這篇文章主要介紹了Android自定義View之繪制圓形頭像功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

做APP應(yīng)用開發(fā)的時(shí)候,用戶頭像肯定是必不可少的,但是90%以上的需求頭像都是圓形的。那么,如何通過自定義View的方式實(shí)現(xiàn)圓形頭像呢,那么,本片博文會(huì)告訴你不僅僅是實(shí)現(xiàn)過程。一定會(huì)有意想不到的收獲哦!

最終效果

國際慣例,我們先來看最終實(shí)現(xiàn)的效果圖

自定義RoundImageView繼承自ImageView  

public class RoundImageView extends ImageView {
  public RoundImageView(Context context) {
    super(context);
  }
  public RoundImageView(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
  }
  public RoundImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }
}

 不知你是否注意過每當(dāng)我們繼承自View的時(shí)候,系統(tǒng)都會(huì)提示我們覆蓋重寫4個(gè)構(gòu)造方法,這里我們只覆蓋了三個(gè),然后就開始在每個(gè)構(gòu)造方法中進(jìn)行初始化,那么,是不是每次都會(huì)調(diào)用所有的構(gòu)造方法呢,如果不是,這三個(gè)構(gòu)造方法又會(huì)什么時(shí)候調(diào)用呢?下面我們來通過例子來驗(yàn)證。

使用自定義View無非就兩種情況下,第一種就是直接在xml布局中使用,另一種就是在Activity中new出來,下面我們分別使用上述兩種方式,為了便于觀察我們在三個(gè)構(gòu)造方法中分別加入一行打印。

首先我們在xml直接使用,運(yùn)行打印如下:

com.example.roundimageview D/RoundImageView: RoundImageView: 兩個(gè)參數(shù)的構(gòu)造方法

然后我們在Activity中,new一個(gè)RoundImageView

roundImageView = RoundImageView(this@MainActivity)
roundImageView = RoundImageView(this@MainActivity, null)
roundImageView = RoundImageView(this@MainActivity, null,0)

運(yùn)行打印日志如下:

結(jié)論:自定義View當(dāng)在xml中使用,使用的是第二個(gè)構(gòu)造方法,當(dāng)在Activity中使用時(shí),實(shí)例化時(shí)傳入幾個(gè)參數(shù)調(diào)用的就是含有幾個(gè)參數(shù)的構(gòu)造方法。

實(shí)現(xiàn)圓形頭像的思想

我始終認(rèn)為自定義View的難度只在于它的實(shí)現(xiàn)思想,通常我們遇到問題的時(shí)候,并不是Google不到,而是壓根就不知道這個(gè)問題該去如何Google,如果知道了問題所產(chǎn)生的原因,其實(shí)問題已經(jīng)迎刃而解了,最怕的是不知道問題為什么會(huì)產(chǎn)生。

實(shí)現(xiàn)圓形頭像的思想一個(gè)簡單的圖就可以表示了。

矩形區(qū)域是完整的圖片,圓形區(qū)域就是我們最終顯示的頭像區(qū)域,那么就很簡單了,圓形區(qū)域與矩形區(qū)域相交,取并集區(qū)域?在矩形中畫一個(gè)與矩形長或?qū)捪嗲械膱A,而圓的直徑是長或?qū)捿^短的一邊。

編碼實(shí)現(xiàn)

獲取原有頭像的bitmap

    首先我們需要獲取設(shè)置頭像的bitmap,我們可以直接通過API來獲取設(shè)置的圖片資源,

drawable = this.getDrawable();

  再將圖片資源轉(zhuǎn)化為bitmap

  首先我們判斷drawable是否為空,如果為空說明用戶沒有設(shè)置,拋出資源未找到的異常。

if (drawable == null) {
  throw new Resources.NotFoundException("Image resource not set");
}

  如果不為空,我們創(chuàng)建一個(gè)與圖片資源大小相等的bitmap,并將bitmap繪制出來,代碼如下所示:

bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
    Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
    drawable.getIntrinsicHeight());
drawable.draw(canvas);

繪制圓形bitmap

     通過上面的代碼,我們得到了原有的bitmap圖像,緊接著我們需要繪制圓形的bitmap,與上面類似,首先創(chuàng)建一個(gè)和bitmap大小一致的位圖

circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);

我們畫一個(gè)與bitmap等大的矩形

Paint paint = new Paint();
Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
canvas.drawRect(rect,paint);
RectF rectF = new RectF(rect);

  將較短的一邊設(shè)置圓的半徑

float roundRa = 0.0f;
if (bitmap.getWidth() > bitmap.getHeight()) {
  roundRa = bitmap.getHeight() / 2.0f;
} else {
  roundRa = bitmap.getWidth() / 2.0f;
}

   設(shè)置paint和canvas屬性

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(Color.WHITE);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

canvas.drawARGB將繪制裁剪設(shè)為透明,paint.setXfermode中的PorterDuffXfermode類很強(qiáng)大,后面我們會(huì)單獨(dú)一篇文章講解。

最終我們重新將bitmap繪制出來即可

canvas.drawBitmap(bitmap, rect, rect, paint);

繪制部分完整代碼如下所示:

 

* 獲取圓形裁剪的bitmap
 *
 * @param bitmap 原bitmap
 */
private Bitmap getCircleBitmap(Bitmap bitmap) {
  circleBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(circleBitmap);
  Paint paint = new Paint();
  Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
  RectF rectF = new RectF(rect);
  float roundRa = 0.0f;
  if (bitmap.getWidth() > bitmap.getHeight()) {
    roundRa = bitmap.getHeight() / 2.0f;
  } else {
    roundRa = bitmap.getWidth() / 2.0f;
  }
  paint.setAntiAlias(true);
  canvas.drawARGB(0, 0, 0, 0);
  paint.setColor(Color.GRAY);
  canvas.drawRoundRect(rectF, roundRa, roundRa, paint);
  paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
  canvas.drawBitmap(bitmap, rect, rect, paint);
  return circleBitmap;
}

設(shè)置最終的bitmap

    得到bitma后我們直接重新設(shè)置即可顯示

 setImageBitmap(getCircleBitmap(bitmap));

   本實(shí)例較為簡單,就不貼所有代碼了,如有需要留言郵箱即可,如有紕漏之處,歡迎指正!晚安!

   9.15 22:17 更新

   代碼已上傳github:https://github.com/huanglinqing123/RoundImageView 

總結(jié)

以上所述是小編給大家介紹的Android自定義View之繪制圓形頭像功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Android Compose學(xué)習(xí)之繪制速度表盤

    Android Compose學(xué)習(xí)之繪制速度表盤

    這篇文章主要為大家詳細(xì)介紹了Android Compose繪制速度表盤的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • 自定義搜索功能Android實(shí)現(xiàn)

    自定義搜索功能Android實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了自定義搜索功能,由Android代碼實(shí)現(xiàn),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android編程四大組件之BroadcastReceiver(廣播接收者)用法實(shí)例

    Android編程四大組件之BroadcastReceiver(廣播接收者)用法實(shí)例

    這篇文章主要介紹了Android編程四大組件之BroadcastReceiver(廣播接收者)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了BroadcastReceiver的功能.定義,用法及相關(guān)使用技巧,需要的朋友可以參考下
    2016-01-01
  • 如何設(shè)置Android studio 3.0顯示光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo)

    如何設(shè)置Android studio 3.0顯示光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo)

    這篇文章主要介紹了如何設(shè)置Android studio 3.0顯示光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo) 很多朋友反映剛升級(jí)了Android studio 3.0,發(fā)現(xiàn)光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo)沒有了,下文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2017-11-11
  • Android getJSONObject與optJSONObject的區(qū)別結(jié)合源碼分析

    Android getJSONObject與optJSONObject的區(qū)別結(jié)合源碼分析

    這篇文章主要介紹了Android getJSONObject與optJSONObject的區(qū)別,結(jié)合源碼分析的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Android自定義控件ListView下拉刷新的代碼

    Android自定義控件ListView下拉刷新的代碼

    今天小編就為大家分享一篇關(guān)于Android自定義控件ListView下拉刷新的代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Kotlin類的繼承實(shí)現(xiàn)詳細(xì)介紹

    Kotlin類的繼承實(shí)現(xiàn)詳細(xì)介紹

    這篇文章主要介紹了Kotlin類的繼承,在Java中類的繼承默認(rèn)是繼承父類的方法和參數(shù)的,但是在kotlin中默認(rèn)是不繼承的,那么我們接下來來驗(yàn)證
    2022-09-09
  • viewPager+fragment刷新緩存fragment的方法

    viewPager+fragment刷新緩存fragment的方法

    這篇文章主要介紹了viewPager+fragment刷新緩存fragment的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • 如何安裝adb工具及常用的adb命令

    如何安裝adb工具及常用的adb命令

    ADB全稱為Android Debug Bridge,起到調(diào)試橋的作用,是一個(gè)客戶端-服務(wù)器端程序,ADB 也是 Android SDK 中的一個(gè)工具,可以直接操作管理 Android 模擬器或者真實(shí)的 Android 設(shè)備,本文介紹如何安裝adb工具及常用的adb命令,感興趣的朋友一起看看吧
    2024-01-01
  • SpringBoot 打包文件名增加編譯時(shí)間

    SpringBoot 打包文件名增加編譯時(shí)間

    這篇文章主要為大家介紹了SpringBoot 打包編譯時(shí)間實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評論

平利县| 峨眉山市| 乐陵市| 涟水县| 文登市| 连云港市| 娱乐| 舟山市| 班玛县| 收藏| 健康| 新和县| 庆云县| 色达县| 搜索| 福安市| 綦江县| 灵武市| 泸溪县| 巴塘县| 南阳市| 洪泽县| 原平市| 贵德县| 甘肃省| 会东县| 宁国市| 进贤县| 满城县| 怀来县| 洱源县| 安远县| 阿合奇县| 唐山市| 石渠县| 当涂县| 石楼县| 石阡县| 丹阳市| 中超| 浏阳市|