2013-10-09 22 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看起来不错... –