湖南二本,杨培安图片,梅丽莎特里奥
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,用来绘制图片。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio 解决logcat无过滤工具栏的操作
Android Studio 恢复小窗口停靠模式(Docked Mode)
Android studio保存logcat日志到本地的操作
Android Studio快捷键生成TAG、Log.x日志输出介绍
网友评论