开发者

Android draw border in ImageView

开发者 https://www.devze.com 2023-04-10 06:08 出处:网络
I want to draw a border around an image. But I can\'t align the border at the ImageView itself (like it is done mostly) because I translate and scale the image inside of the ImageView with the ImageMa

I want to draw a border around an image. But I can't align the border at the ImageView itself (like it is done mostly) because I translate and scale the image inside of the ImageView with the ImageMatrix (the Ima开发者_StackOverflow中文版geView itself is fill_parent / fills the whole screen). I had the idea to add a second image (which looks like a border) and translate & scale it in the same way as the image which should have a border, but it isn't very handy to do it this way. Has anybody a better idea to reach that goal?


There are two ways to achieve this: 1) add padding to the imageView and set a background color to it.

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) another option is to override the draw method of your view and there draw the border:

@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);
    }

}

Note that you are to give the middle of the line you want to draw(!) And also I haven't run, nor compiled this, so I'm not 100% sure it's correct, but these are the ways :) Rect bounds should be the bounding rect of your view - (0,0,width,height).


Alternatively, put the imageView in a layout of some sort and just set padding:

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);
        }
    }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号