java教程之java法式編譯運轉圖解(java法式運轉)。本站提示廣大學習愛好者:(java教程之java法式編譯運轉圖解(java法式運轉))文章只能為提供參考,不一定能成為您想要的結果。以下是java教程之java法式編譯運轉圖解(java法式運轉)正文
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,用來繪制圖片。