Подтвердить что ты не робот

Граница над растровым изображением с закругленными углами в Android

Я использовал ниже, чтобы сделать растровое изображение с закругленными углами. Теперь я хочу нарисовать линию вокруг растрового изображения.

private BitmapDrawable roundCornered(BitmapDrawable scaledBitmap, int i) {

        Bitmap bitmap = scaledBitmap.getBitmap();

        result = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
                Bitmap.Config.ARGB_8888);
        canvas = new Canvas(result);

        color = 0xff424242;
        paint = new Paint();
        rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
        rectF = new RectF(rect);
        roundPx = i;
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(Color.BLUE);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, rect, rect, paint);
        BitmapDrawable finalresult = new BitmapDrawable(result);
        return finalresult;
    }

Я получил снимок ниже, но моя фактическая потребность в том, что я должен нарисовать границу вокруг изображения.

4b9b3361

Ответ 1

Я поставил для себя следующее.

public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int color, int cornerDips, int borderDips, Context context) {
    Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(output);

    final int borderSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) borderDips,
            context.getResources().getDisplayMetrics());
    final int cornerSizePx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, (float) cornerDips,
            context.getResources().getDisplayMetrics());
    final Paint paint = new Paint();
    final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
    final RectF rectF = new RectF(rect);

    // prepare canvas for transfer
    paint.setAntiAlias(true);
    paint.setColor(0xFFFFFFFF);
    paint.setStyle(Paint.Style.FILL);
    canvas.drawARGB(0, 0, 0, 0);
    canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint);

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

    // draw border
    paint.setColor(color);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth((float) borderSizePx);
    canvas.drawRoundRect(rectF, cornerSizePx, cornerSizePx, paint);

    return output;
}

Кредиты, конечно, http://ruibm.com/?p=184

Ответ 2

Как подготовить 9-патч-образ, как показано ниже, и установить его в качестве фона с помощью android:background

enter image description here

Ответ 3

Я использую BitmapShader и drawRoundRect, и он работает для меня, посмотрите на скриншот

enter image description here

RectF roundRect; // the Rect you have to draw into
Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

// draw the border at bottom
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mBorderColor);
canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint);

// ------------------ draw scheme bitmap
roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
mPaint.setShader(shader);
canvas.drawRoundRect(roundRect, mRadius, mRadius, mPaint);
mPaint.setShader(null);

Ответ 4

К сожалению, в Android нет хорошего и аккуратного параметра "border", но самый простой способ сделать это - заключить в другой макет, установить фон родительского макета на свой цвет рамки/вырезаемый, а затем установить дополнение на Это. Отступы появятся вокруг вашего BitmapDrawable.

Ответ 5

Я много искал, чтобы реализовать этот эффект по коду, прежде чем я нашел другой способ, но он недостаточно совершенен, вы можете увидеть неровный угол в каждом углу, я установил Paint.setAntiAlias ​​(true), Paint.setDither(true), Paint.setFilterBitmap(true), но это не работает, поэтому я надеюсь, что кто-то может мне помочь. enter image description here

RectF roundRect = new RectF(itemRect);

Bitmap bitmap = scheme.getSchemeBitmap(getResources());

mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mSchemeSelectedColor);
canvas.drawRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, mPaint);

roundRect.set(itemRect.left + mBorderSize, itemRect.top + mBorderSize, itemRect.right - mBorderSize, itemRect.bottom - mBorderSize);
Path clipPath = new Path();
clipPath.addRoundRect(roundRect, mSchemeCornerRadius, mSchemeCornerRadius, Path.Direction.CW);
canvas.save(Canvas.CLIP_SAVE_FLAG);
canvas.clipPath(clipPath);
canvas.drawBitmap(bitmap, null, roundRect, mPaint);
canvas.restore();

Ответ 6

мой путь:

 public static Bitmap getRoundedCornerBitmap1(Bitmap bitmap, int color, int cornerDips, int borderDips) {


            Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+2*borderDips,
                    bitmap.getHeight()+2*borderDips,
                    Bitmap.Config.ARGB_8888);

            Canvas canvas = new Canvas(output);

            canvas.drawColor(Color.TRANSPARENT);

            final RectF rectF = new RectF(0, 0, output.getWidth(), output.getHeight());
            final Paint paint = new Paint();
            // prepare canvas for transfer
            paint.setAntiAlias(true);
            paint.setStrokeWidth((float) borderDips);
            paint.setColor(Color.WHITE);
            paint.setStyle(Paint.Style.FILL);

            canvas.drawRoundRect(rectF, borderDips, borderDips, paint);

            canvas.drawBitmap(bitmap, borderDips, borderDips, null);
            bitmap.recycle();
            return output;
        }

Результат

введите описание изображения здесь