2013-10-09 3 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)); 

Надеюсь, что это поможет кому-то в будущем.

Happy Coding :)

+0

+1 выглядит неплохо... –

Смежные вопросы