Android рисует границу в ImageView - PullRequest
6 голосов
/ 02 октября 2011

Я хочу нарисовать границу вокруг изображения. Но я не могу выровнять границу в самом ImageView (как это обычно делается), потому что я перевожу и масштабирую изображение внутри ImageView с помощью ImageMatrix (сам ImageView является fill_parent / заполняет весь экран). У меня была идея добавить второе изображение (которое выглядит как граница) и перевести и масштабировать его так же, как изображение, которое должно иметь рамку, но это не очень удобно делать таким образом. У кого-нибудь есть лучшая идея для достижения этой цели?

Ответы [ 2 ]

20 голосов
/ 02 октября 2011

Есть два способа добиться этого: 1) добавить отступ для imageView и установить для него цвет фона.

final ImageView imageView = new ImageView(context);
imageView.setPadding(2*border,2*border,0,0);
final ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(width,height);
params.leftMargin = marginYouWouldSet + border;
params.topMargin = marginYouWouldSet + border;
imageView.setBackgroundDrawable(drawable);
imageView.setBackgroundColor(borderColor);
addView(imageView, params);

2) другой вариант - переопределить метод рисования вашего вида, и тамНарисуйте границу:

@Override
protected void dispatchDraw(Canvas canvas)
{
 borderDrawable.draw(canvas);
 super.dispatchDraw(canvas);
}
...
public class BorderDrawable extends Drawable{

    private Rect mBounds;
    private Paint mBorderPaint;

    public BorderDrawable(Rect bounds, int thickness, int color) {
        mBounds = bounds;
        mBorderPaint = new Paint();
        mBorderPaint.setStrokeWidth(thickness);
        mBorderPaint.setColor(color);
    }

    @Override
    public void draw(Canvas canvas) {
        //left border
        canvas.drawLine(
                mBounds.left - thickness/2, 
                mBounds.top,
                mBounds.left - thickness/2,
                mBounds.bottom,
                mBorderPaint);
        //top border
        canvas.drawLine(
                mBounds.left, 
                mBounds.top - thickness/2,
                mBounds.right, 
                mBounds.top - thickness/2, 
                mBorderPaint);
        //right border
        canvas.drawLine(
                mBounds.right + thickness/2, 
                mBounds.top,
                mBounds.right + thickness/2,
                mBounds.bottom, 
                mBorderPaint);
        //bottom border
        canvas.drawLine(
                mBounds.left, 
                mBounds.bottom + thickness/2, 
                mBounds.right, 
                mBounds.bottom + thickness/2, 
                mBorderPaint);
    }

}

Обратите внимание, что вы должны указать середину линии, которую хотите нарисовать (!). А также я не запускал и не компилировал это, поэтому я не на 100%конечно, это правильно, но это так :) Границы прямоугольника должны быть ограничивающим прямоугольником вашего вида - (0,0, ширина, высота).

0 голосов
/ 22 мая 2015

В качестве альтернативы, поместите imageView в какой-то макет и просто установите отступ:

static class BorderView extends FrameLayout
    {
        public ImageView imageView;

        public BorderView(Context context)
        {
            super(context);

            setLayoutParams(//wrap content)
            imageView = new ImageView(context);//set image and so forth
            addView(imageView);
        }

        public void addSelectionBorder()
        {
            int border = 8;
            setPadding(border,border,border,border);
            setBackgroundColor(Color.BLUE);
        }

        public void removeSelectionBorder()
        {
            int border = 0;
            setPadding(border,border,border,border);
            setBackgroundColor(Color.BLACK);
        }
    }
...