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代码实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)