Android中通过反射实现圆角ImageView代码实例

Android中通过反射实现圆角ImageView代码实例,第1张

概述privatevoidinit(){paint=newPaint(Paint.ANTI_ALIAS_FLAG);roundRect=newRectF(0,getWidth(),getHeight());
private voID init(){    paint = new Paint(Paint.ANTI_AliAS_FLAG);        roundRect = new RectF(0,getWIDth(),getHeight());    radius = 40;    mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ;  }

继承ImageVIEw,在构造方法中调用,初始化Paint和Xfermode。

 protected voID onDraw(Canvas canvas) {        int sc = canvas.saveLayer(0,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,getHeight());    canvas.drawRoundRect(roundRect,radius,paint);        reflectSetXfermod();        super.onDraw(canvas);        canvas.restoretoCount(sc);  }

重写ImageVIEw的onDraw方法,通过xfermode实现圆角

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设置到BitmapDrawable 里面的内部类BitmapState里的对象mPaint,用来绘制图片。

总结

以上是内存溢出为你收集整理的Android中通过反射实现圆角ImageView代码实例全部内容,希望文章能够帮你解决Android中通过反射实现圆角ImageView代码实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1141404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存