Android draw border in ImageView

后端 未结 2 1473
面向向阳花
面向向阳花 2020-12-17 00:36

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

相关标签:
2条回答
  • 2020-12-17 00:54

    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).

    0 讨论(0)
  • 2020-12-17 01:08

    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 讨论(0)
提交回复
热议问题