如何在android相对布局周围放置边框?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10430392/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 03:43:05  来源:igfitidea点击:

how to put a border around an android relativelayout?

androidborderandroid-relativelayout

提问by AyaAndro

I've seen this subjectabout puting a border around an android textview, and I used it. But now, I would like to put a border around widgets which are situated into a relative layout. How can I do it?

我看过这个 关于在 android textview 周围放置边框的主题,我使用了它。但是现在,我想在位于相对布局中的小部件周围放置一个边框。我该怎么做?

回答by RWIL

  1. in your res/drawablefolder, create a new file background_border.xml
  1. 在您的res/drawable文件夹中,创建一个新文件background_border.xml

In this file, you will define the background for widget like this:

在此文件中,您将像这样定义小部件的背景:

<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. set the background of your widget to the drawable configuration you've just created
  1. 将小部件的背景设置为您刚刚创建的可绘制配置

eg. if you want to put your border on a relativelayout:

例如。如果你想把你的边框放在一个相对布局上:

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

回答by GAURAV KUMAR GUPTA

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

回答by mah

Create a FrameLayout that gets the background color of your border, and a margin or padding of your border width, and place that FrameLayout in your RelativeLayout. Place the TextView in your FrameLayout instead of directly in the RelativeLayout. poofinstant border.

创建一个 FrameLayout 来获取边框的背景颜色,以及边框宽度的边距或内边距,然后将该 FrameLayout 放在您的 RelativeLayout 中。将 TextView 放在 FrameLayout 中,而不是直接放在 RelativeLayout 中。瞬间边框。

回答by suulisin

Though all the provided answers work,they are very rigid.what if you want to customise border color,borderthickness for different screens. for that you should try my solution.We are going to follow three steps in creating a custom RelativeLayout that allow you to provide borderColor and Thickness for bottom border.

尽管所有提供的答案都有效,但它们非常僵化。如果您想为不同的屏幕自定义边框颜色、边框厚度怎么办。为此,您应该尝试我的解决方案。我们将按照三个步骤创建一个自定义的 RelativeLayout,允许您为底部边框提供 borderColor 和 Thickness。

1)Create a class that extends RelativeLayout and override on Draw method

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)Define stylable properties in attrs.xml

2) 在 attrs.xml 中定义样式属性

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

3) you are done and you can use it like

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>