2013-10-09 25 views
1

我有圓角方法的位圖:位圖瓷磚模式重複和圓角

代碼:

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) { 
     Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); 
    BitmapDrawable TileMe = new BitmapDrawable(output); 
    TileMe.setTileModeX(Shader.TileMode.REPEAT); 
    TileMe.setTileModeY(Shader.TileMode.REPEAT); 
     Canvas canvas = new Canvas(TileMe); 

     final int color = 0xff424242; 
     final Paint paint = new Paint(); 
     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     final RectF rectF = new RectF(rect); 
     final float roundPx = pixels; 

     paint.setAntiAlias(true); 
     canvas.drawARGB(0, 0, 0, 0); 
     paint.setColor(color); 
     canvas.drawRoundRect(rectF, roundPx, roundPx, paint); 

     paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 
     canvas.drawBitmap(bitmap, rect, rect, paint); 

     return output; 
     } 

這僅與圓角使圖像也邊角不光滑,現在我怎樣才能使它重複模式與圓角一起平鋪?

回答

1

試試與延伸BitmapDrawable並重寫paint()方法設置在瓷磚模式下的圖像:

在該方法中,我們避免創建具有視圖的大小的新位圖。

class MyBitmapDrawable extends BitmapDrawable { 
    private Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG | Paint.DITHER_FLAG); 
    private boolean mRebuildShader = true; 
    private Matrix mMatrix = new Matrix(); 

    @Override 
    public void draw(Canvas canvas) { 
     Bitmap bitmap = getBitmap(); 
     if (bitmap == null) { 
      return; 
     } 

     if (mRebuildShader) { 
      mPaint.setShader(new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT)); 
      mRebuildShader = false; 
     } 

     // Translate down by the remainder 
     mMatrix.setTranslate(0, getBounds().bottom % getIntrinsicHeight()); 
     canvas.save(); 
     canvas.setMatrix(mMatrix); 
     canvas.drawRect(getBounds(), mPaint); 
     canvas.restore(); 
    } 
} 

它可以設置爲這樣的觀點:

view.setBackgroundDrawable(new MyBitmapDrawable(getResources().getDrawable(R.drawable.smiley).getBitmap())); 

退房其參考HERE

+0

但是,這會給我像圓角和平鋪模式重複的效果嗎? – Goofy

+0

你想在圖像上的效果?這隻會產生效果。你沒有指定你想要兩個效果? – GrIsHu

+0

謝謝,但請參閱我已經提到它「與瓦片模式重複和圓角的位圖」 – Goofy

3

最後我已經解決了它!

class CurvedAndTiled extends Drawable { 

    private final float mCornerRadius; 
    private final RectF mRect = new RectF(); 
    private final BitmapShader mBitmapShader; 
    private final Paint mTilePaint;   

    CurvedAndTiled(
      Bitmap bitmap, 
      float cornerRadius) { 
     mCornerRadius = cornerRadius; 

     mBitmapShader = new BitmapShader(bitmap, 
       Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 

     mTilePaint = new Paint(); 
     mTilePaint.setAntiAlias(true); 
     mTilePaint.setShader(mBitmapShader);    
    } 

    @Override 
    protected void onBoundsChange(Rect bounds) { 
     super.onBoundsChange(bounds); 
     mRect.set(0, 0, bounds.width(), bounds.height()); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     canvas.drawRoundRect(mRect, mCornerRadius, mCornerRadius, mTilePaint);   
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.TRANSLUCENT; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     mTilePaint.setAlpha(alpha); 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
     mTilePaint.setColorFilter(cf); 
    }  
} 

也適用於您的圖像視圖。

backgroundImage.setBackgroundDrawable(new CurvedAndTiled(((BitmapDrawable) drawable).getBitmap(), 45)); 

希望它能幫助未來的人。

快樂編碼:)

+0

+1看起來不錯... –