2011-10-02 81 views
3

我想在图像周围绘制边框。但我无法在ImageView自身对齐边框(就像它主要完成的那样),因为我用ImageMatrix翻译和缩放ImageView内部的图像(ImageView本身是fill_parent /填充整个屏幕)。我有想法添加第二个图像(看起来像一个边框),并翻译&缩放,它应该像应该有一个边框的图像相同的方式,但这样做并不是很方便。 有没有人有更好的主意来实现这一目标?安卓在ImageView中绘制边框

谢谢!

回答

17

有两种方法可以实现这一点: 1)为图像添加填充并为其设置背景颜色。

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,width,height )。

+1

我用第二个选项。当我拖动图像时,其边框停留在其坐标处。我添加了一个CustomView.setBorder方法,其边界更新(与ImageMatrix更新并行),但不起作用。我是否需要调用draw-method或什么? 啊。似乎它做错了什么。现在它的工作。 – andineupert

0

或者,把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); 
     } 
    }