Android:如何为LinearLayout绘制边框


197

我有三个文件。XML,绘图功能和主要活动。LinearLayout我的XML文件中有一些。

<LinearLayout android:orientation="horizontal"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:layout_weight="1">
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#ef3"
                  android:id="@+id/img01"/>
    <LinearLayout android:layout_width="fill_parent"
                  android:layout_height="fill_parent"
                  android:layout_weight="1"
                  android:background="#E8A2B4"
                  android:id="@+id/img02"/>
</LinearLayout>

这是绘制函数:

public class getBorder extends TextView {
    public getBorder(Context context) {
        super(context);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();

        paint.setColor(android.graphics.Color.RED);

        canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint);
        canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint);
        canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1,
            this.getHeight() - 1, paint);
        canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1,
            this.getHeight() - 1, paint);
    }
}

这是主要的活动:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    final getBorder getBorder = new getBorder(this);
    final LinearLayout img01 = (LinearLayout) findViewById(R.id.img01);
    img01.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            getBorder.setWidth(100);
            getBorder.setHeight(100);
            img01.addView(getBorder);
        }
    });       
}

该程序可以绘制边框,但尺寸不合适LinearLayout。当我LinearLayout再次单击时,程序崩溃。

另一件事,我想在的中心绘制两个圆LinearLayout,但是我如何找出中心坐标呢?

Answers:


458

您真的需要以编程方式执行此操作吗?

仅考虑标题:您可以将ShapeDrawable用作android:background…

例如,让我们定义res/drawable/my_custom_background.xml为:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
  <corners
      android:radius="2dp"
      android:topRightRadius="0dp"
      android:bottomRightRadius="0dp"
      android:bottomLeftRadius="0dp" />
  <stroke
      android:width="1dp"
      android:color="@android:color/white" />
</shape>

并定义android:background =“ @ drawable / my_custom_background”。

我没有测试过,但是应该可以。

更新:

我认为,如果适合您的需求,最好利用xml shape可绘制资源。使用“从头开始”项目(针对android-8),定义res / layout / main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/border"
    android:padding="10dip" >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
    [... more TextView ...]
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Hello World, SOnich"
        />
</LinearLayout>

和一个 res/drawable/border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
   <stroke
        android:width="5dip"
        android:color="@android:color/white" />
</shape>

报告在姜饼设备上工作。请注意,您需要android:padding将LinearLayout与android:width形状/笔触的值相关联。请不要@android:color/white在最终应用中使用,而应使用项目定义的颜色。

您可以android:background="@drawable/border" android:padding="10dip"从提供的示例中将其应用于每个LinearLayout。

至于其他与将某些圆显示为LinearLayout的背景相关的帖子,我正在使用Inset / Scale / Layer可绘制资源(请参阅Drawable资源以获取更多信息),以使某些东西可以在LinearLayout的背景中显示完美的圆,但是失败了在这一刻…

您的问题显然在于使用getBorder.set{Width,Height}(100);。为什么要使用onClick方法呢?

我需要进一步的信息,以免遗漏关键点:为什么要以编程方式做到这一点?您需要动态行为吗?您输入的可绘制图形是png还是ShapeDrawable是可接受的?等等

待续(也许明天,一旦您对要实现的目标提供更多的精确度)…



@Renaud是否有办法问题地更改边框颜色?
user1940676

12
不知道为什么会这样,但是当我在a上使用它时,LinearLayout我会从边框颜色中获得纯色填充,除非我将以下子shape元素添加到元素中:<solid android:color="@android:color/transparent" />
dahvyd 2013年

2
对我来说是一样的,我不得不添加,<solid android:color="@color/lighter_gray" />否则我有一个黑色的背景
Panciz

1
这种方法非常有效;但是,即使将背景设置为“ null”或“ transparent”,它也会创建两层“ Overdraw”,这对性能确实不利。谁能建议解决此问题的方法?
Sam Ramezanli

16

扩展LinearLayout / RelativeLayout并直接在XML上使用它

package com.pkg_name ;
...imports...
public class LinearLayoutOutlined extends LinearLayout {
    Paint paint;    

    public LinearLayoutOutlined(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        paint = new Paint();
    }
    public LinearLayoutOutlined(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        setWillNotDraw(false) ;
        paint = new Paint();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        /*
        Paint fillPaint = paint;
        fillPaint.setARGB(255, 0, 255, 0);
        fillPaint.setStyle(Paint.Style.FILL);
        canvas.drawPaint(fillPaint) ;
        */

        Paint strokePaint = paint;
        strokePaint.setARGB(255, 255, 0, 0);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeWidth(2);  
        Rect r = canvas.getClipBounds() ;
        Rect outline = new Rect( 1,1,r.right-1, r.bottom-1) ;
        canvas.drawRect(outline, strokePaint) ;
    }

}

<?xml version="1.0" encoding="utf-8"?>

<com.pkg_name.LinearLayoutOutlined
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
    android:layout_width=...
    android:layout_height=...
   >
   ... your widgets here ...

</com.pkg_name.LinearLayoutOutlined>

34
请不要在onDraw()方法中分配内存,不要在init()由构造函数调用的方法中创建对象,并在onDraw()方法中重用它们。分配onDraw()(每秒调用60次)会导致性能下降,电池耗电等
路易CAD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.