欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

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

這篇文章主要介紹Android自定義View之如何繪制圓形頭像功能,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)建站專注于永安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都商城網(wǎng)站開發(fā)。永安網(wǎng)站建設(shè)公司,為永安等地區(qū)提供建站服務(wù)。全流程按需定制,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)

前言

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

最終效果

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

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

自定義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出來,下面我們分別使用上述兩種方式,為了便于觀察我們?cè)谌齻€(gè)構(gòu)造方法中分別加入一行打印。

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

首先我們?cè)趚ml直接使用,運(yùn)行打印如下:

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

然后我們?cè)贏ctivity中,new一個(gè)RoundImageView

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

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

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

結(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è)簡(jiǎn)單的圖就可以表示了。

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

矩形區(qū)域是完整的圖片,圓形區(qū)域就是我們最終顯示的頭像區(qū)域,那么就很簡(jiǎn)單了,圓形區(qū)域與矩形區(qū)域相交,取并集區(qū)域?在矩形中畫一個(gè)與矩形長(zhǎng)或?qū)捪嗲械膱A,而圓的直徑是長(zhǎng)或?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));

Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

以上是“Android自定義View之如何繪制圓形頭像功能”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文名稱:Android自定義View之如何繪制圓形頭像功能
文章起源:http://aaarwkj.com/article14/igdede.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、虛擬主機(jī)、App開發(fā)、網(wǎng)站內(nèi)鏈、建站公司、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
国产精品一区二区麻豆本子| 欧美日韩国产免费,日日骚| 另类亚洲欧美专区第一页| 成熟性性生活免费视频| 精品国产女同一区二区| 伊人99热这里只有精品| 玩弄丰满熟妇班主任老师| 日本精品亚洲一区二区三区| 日韩精品一二三黄色一级| 中文字幕一区二区三区不卡日日| 永久免费成人在线视频| 极品女神福利视频久久| 欧美激情一区二区亚洲专区| 国内精日韩欧中文的话| 国产区二区三区在线视频| 免费观看黄片视频在线播放| 日本欧美精品一区二区三区| 国产成人色污在线观看| 欧美亚洲国产日韩在线高清| 国产精品色呦呦一区二区| 日韩福利成人av在线| 中文字幕乱码日韩一区| 亚洲激情在线观看一区| 亚洲av中文久久精品国内| 青青草国产自拍在线视频| 日本又色又爽又黄又高潮| 91精品人妻互换一区二区| 日韩亚洲欧洲一区二区三区| 青青操国产在线自偷自拍| 国产成人公开免费视频| 无码精品人妻一区二区三区中 | 中文字幕国产精品资源| 免费无码不卡av一区二区| 国内自拍一区二区三区| av在线手机中文字幕| 亚洲视一区二区三区四区| av国产一区二区在线| 久久精品国产亚洲av麻| 日本视频免费一区二区| av影片免费网址大全| 青青草视频在线好好热|