如何在android relativelayout周围放置边框?

时间:2012-05-03 11:26:25

标签: android border android-relativelayout

我已经看到这个subject关于在an​​droid textview周围放置边框,我用过它。但现在,我想在小部件周围放置边框,这些小部件位于相对布局中。我该怎么办?

4 个答案:

答案 0 :(得分:44)

  1. 在您的res/drawable文件夹中,创建一个新文件background_border.xml
  2. 在此文件中,您将为此窗口小部件定义背景:

    <shape xmlns:android="http://schemas.android.com/apk/res/android"
           android:shape="rectangle" >
        <!-- This is the stroke you want to define -->
        <stroke android:width="1dp" 
                android:color="@color/color_stroke"/>
    
        <!-- Optional, round your corners -->
        <corners android:bottomLeftRadius="0dp"
                 android:topLeftRadius="5dp"
                 android:bottomRightRadius="5dp"
                 android:topRightRadius="0dp" />
    
        <!-- Optional, fill the rest of your background with a color or gradient, use transparent if you only want the border to be displayed-->
        <gradient android:startColor="@android:color/transparent"
                  android:endColor="@android:color/transparent"
                  android:angle="90"/>
    </shape>
    
    1. 将窗口小部件的背景设置为您刚刚创建的可绘制配置
    2. 例如。如果你想把你的边框放在relativelayout上:

      <RelativeLayout            
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:background="@drawable/background_border"
                  android:padding="15dp">
          ...
      </RelativeLayout>
      

答案 1 :(得分:11)

RelativeLayout layout = (RelativeLayout) view.findViewById(R.id.borderEffect); // id fetch from xml
ShapeDrawable rectShapeDrawable = new ShapeDrawable(); // pre defined class

// get paint
Paint paint = rectShapeDrawable.getPaint();

// set border color, stroke and stroke width
paint.setColor(Color.GRAY);
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(5); // you can change the value of 5
layout.setBackgroundDrawable(rectShapeDrawable);

答案 2 :(得分:1)

创建一个FrameLayout,它获取边框的背景颜色,边框宽度的边距或填充,并将FrameLayout放在RelativeLayout中。将TextView放在FrameLayout中,而不是直接放在RelativeLayout中。 poof 即时边框。

答案 3 :(得分:-1)

虽然所提供的所有答案都有效,但它们非常严格。如果你想为不同的屏幕定制边框颜色,borderthickness,那该怎么办呢?为此您应该尝试我的解决方案。我们将按照三个步骤创建一个自定义RelativeLayout,允许您为底部边框提供borderColor和Thickness。

1)创建一个扩展RelativeLayout的类并覆盖Draw方法

public class BorderRelativeLayout extends RelativeLayout {

  private float borderThickness;
  private int borderColor;

  public BorderRelativeLayout(Context context) {
    this(context, null, 0);
  }

  public BorderRelativeLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public BorderRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs);
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    Rect rect = new Rect();
    Paint paint = new Paint();
    paint.setColor(borderColor);
    paint.setStrokeWidth(borderThickness);
    getLocalVisibleRect(rect);
    canvas.drawLine(rect.left, rect.bottom, rect.right, rect.bottom, paint);
  }

  private void init(Context context, AttributeSet attrs) {
    setWillNotDraw(false);

    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.BorderRelativeLayout);

    borderThickness = array.getDimension(R.styleable.BorderRelativeLayout_borderThickness, 0.5f);
    borderColor = array.getColor(R.styleable.BorderRelativeLayout_borderColor,
        ContextCompat.getColor(context, R.color.colorPrimary));
  }
}

2)在attrs.xml中定义stylable属性

<declare-styleable name="BorderRelativeLayout">
    <attr name="borderThickness" format="dimension"/>
    <attr name="borderColor" format="color"/>
  </declare-styleable>

3)你完成了,你可以像

一样使用它
<com.spacewek.spacewek.controls.BorderRelativeLayout
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:id="@+id/headLayout"
      app:borderThickness="2dp"
      app:borderColor="@color/divider_new_color">

 </com.spacewek.spacewek.controls.BorderRelativeLayout>