当前位置: 移动技术网 > IT编程>移动开发>Android > Android中通过反射实现圆角ImageView代码实例

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

湖南二本,杨培安图片,梅丽莎特里奥

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,在构造方法中调用,初始化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实现圆角

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,用来绘制图片。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网