真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android如何自定義View繪制圓形頭像功能-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)Android如何自定義View繪制圓形頭像功能,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

西工ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!

自定義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);  }}

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

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

首先我們?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)行打印日志如下:

結(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)思想,通常我們遇到問(wèn)題的時(shí)候,并不是Google不到,而是壓根就不知道這個(gè)問(wèn)題該去如何Google,如果知道了問(wèn)題所產(chǎn)生的原因,其實(shí)問(wèn)題已經(jīng)迎刃而解了,最怕的是不知道問(wèn)題為什么會(huì)產(chǎn)生。

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

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

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

獲取原有頭像的bitmap

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

drawable = this.getDrawable();

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

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

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

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

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

通過(guò)上面的代碼,我們得到了原有的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繪制出來(lái)即可

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));

關(guān)于“Android如何自定義View繪制圓形頭像功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。


文章標(biāo)題:Android如何自定義View繪制圓形頭像功能-創(chuàng)新互聯(lián)
鏈接地址:http://weahome.cn/article/ccpjoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部