国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中通過反射實(shí)現(xiàn)圓角ImageView代碼實(shí)例

2020-04-11 11:35:05
字體:
供稿:網(wǎng)友
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);  }

重寫ImageView的onDraw方法,通過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();      }    }  }

通過反射的方法將xfermode設(shè)置到BitmapDrawable 里面的內(nèi)部類BitmapState里的對象mPaint,用來繪制圖片。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高阳县| 宁陕县| 镇康县| 广水市| 瑞丽市| 富平县| 屏南县| 报价| 元朗区| 宜良县| 石家庄市| 鄂州市| 玛纳斯县| 石嘴山市| 浙江省| 醴陵市| 文昌市| 吉木萨尔县| 醴陵市| 漯河市| 兖州市| 新郑市| 博爱县| 五峰| 衡水市| 辰溪县| 嘉兴市| 太仆寺旗| 合阳县| 札达县| 祥云县| 禄丰县| 东台市| 平湖市| 鄂托克旗| 南雄市| 义马市| 灵寿县| 葫芦岛市| 萨迦县| 时尚|