Android中通過(guò)反射實(shí)現(xiàn)圓角ImageView代碼實(shí)例
private void init(){ paint = new Paint(Paint.ANTI_ALIAS_FLAG); roundRect = new RectF(0, 0, getWidth() , getHeight()); radius = 40; mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ; }
繼承ImageView,在構(gòu)造方法中調(diào)用,初始化Paint和Xfermode。
protected void onDraw(Canvas canvas) { int sc = canvas.saveLayer(0, 0, getWidth() , getHeight(), null, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG); roundRect.set(0, 0, getWidth(), getHeight()); canvas.drawRoundRect(roundRect, radius, radius, paint); reflectSetXfermod(); super.onDraw(canvas); canvas.restoreToCount(sc); }
重寫(xiě)ImageView的onDraw方法,通過(guò)xfermode實(shí)現(xiàn)圓角
private void reflectSetXfermod(){ Drawable drawable = getDrawable(); if(drawable == null){ return; } Class bsClass = null; Class[] innerClasses = BitmapDrawable.class.getDeclaredClasses(); for(Class innerClass :innerClasses) { String name = innerClass.getName(); System.out.println("-----innerClass---"+name); if(name.equals("android.graphics.drawable.BitmapDrawable$BitmapState")) { bsClass = innerClass; } } if(bsClass!= null){ try { Field mPaintField = bsClass.getDeclaredField("mPaint"); mPaintField.setAccessible(true); ConstantState constantState = ((BitmapDrawable)drawable).getConstantState(); Paint paint = (Paint)mPaintField.get(constantState); paint.setXfermode(mPorterDuffXfermode); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
通過(guò)反射的方法將xfermode設(shè)置到BitmapDrawable 里面的內(nèi)部類(lèi)BitmapState里的對(duì)象mPaint,用來(lái)繪制圖片。
- Android 利用反射+try catch實(shí)現(xiàn)sdk按需引入依賴(lài)庫(kù)的方法
- Android 反射注解與動(dòng)態(tài)代理綜合使用詳解
- Android編程實(shí)現(xiàn)通過(guò)反射獲取資源Id的方法
- Android基于反射技術(shù)實(shí)現(xiàn)的加減乘除運(yùn)算示例
- Android通過(guò)反射實(shí)現(xiàn)強(qiáng)制停止應(yīng)用程序的方法
- 詳解Java編程中的反射在Android開(kāi)發(fā)中的應(yīng)用
- java反射android的r文件的示例
- Android依據(jù)名字通過(guò)反射獲取在drawable中的圖片
- Android 繞過(guò)反射黑名單的方法
相關(guān)文章
Android TabLayout(選項(xiàng)卡布局)簡(jiǎn)單用法實(shí)例分析
這篇文章主要介紹了Android TabLayout(選項(xiàng)卡布局)簡(jiǎn)單用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android選項(xiàng)卡布局的界面布局與功能實(shí)現(xiàn)具體相關(guān)技巧,需要的朋友可以參考下2016-01-01Kotlin Flow常見(jiàn)場(chǎng)景下的使用實(shí)例
這篇文章主要為大家介紹了Kotlin Flow常見(jiàn)場(chǎng)景下的使用實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Android shell命令行中過(guò)濾adb logcat輸出的方法
本文主要介紹Android shell命令行中過(guò)濾adb logcat輸出,這里詳細(xì)說(shuō)明了shell 命令過(guò)濾logcat 輸出內(nèi)容,有需要的小伙伴可以參考下2016-08-08Android實(shí)現(xiàn)圓形純數(shù)字按鈕
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形純數(shù)字按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Android實(shí)現(xiàn)Flip翻轉(zhuǎn)動(dòng)畫(huà)效果
這篇文章主要介紹了Android實(shí)現(xiàn)Flip翻轉(zhuǎn)動(dòng)畫(huà)效果,對(duì)Android程序設(shè)計(jì)人員有很好的參考借鑒價(jià)值,需要的朋友可以參考下2014-08-08Android開(kāi)發(fā)listview選中高亮簡(jiǎn)單實(shí)現(xiàn)代碼分享
這篇文章主要介紹了Android開(kāi)發(fā)listview選中高亮簡(jiǎn)單實(shí)現(xiàn)代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Kotlin學(xué)習(xí)筆記之const val與val
這篇文章主要給大家介紹了關(guān)于Kotlin學(xué)習(xí)筆記之const val與val的相關(guān)資料,并給大家介紹了const val和val區(qū)別以及Kotlin中var和val的區(qū)別,需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05android編程實(shí)現(xiàn)添加文本內(nèi)容到sqlite表中的方法
這篇文章主要介紹了android編程實(shí)現(xiàn)添加文本內(nèi)容到sqlite表中的方法,結(jié)合實(shí)例較為詳細(xì)的分析了Android針對(duì)txt文本文件的讀取及SQL數(shù)據(jù)庫(kù)操作的相關(guān)技巧,需要的朋友可以參考下2015-11-11