为android编写自定义LinearLayout

时间:2010-07-26 19:26:39

标签: android android-layout

我有一个自定义布局,在其子项下方绘制一个透明的圆角矩形。问题是当我尝试将其添加到我的xml文件时,它不会显示。此外,当我尝试向其添加参数(即android:layout_width)时,弹出窗口显示它们都不可用。我添加的任何子视图都会发生同样的事情。有人可以帮忙吗?

public class RoundRectLayout extends LinearLayout 
{ 
 private RectF shape;
 public RoundRectLayout(Context context)
 {
  super(context);
  LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  layoutInflater.inflate(R.layout.settings, this);
  shape = new RectF();
 }

 public RoundRectLayout(Context context, AttributeSet attrs)
 {
  super(context, attrs);
  LayoutInflater layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  layoutInflater.inflate(R.layout.settings, this);
  shape = new RectF();
 }

 @Override
 protected void onSizeChanged(int w, int h, int oldw, int oldh)
 {
  shape = new RectF(0, 0, w - 5, h - 5);
  super.onSizeChanged(w, h, oldw, oldh);
 }

 @Override
 protected void dispatchDraw(Canvas canvas)
 {
  Paint temp = new Paint();
  temp.setAlpha(125);
  canvas.drawRoundRect(shape, 10f, 10f, temp);
  super.dispatchDraw(canvas);
 }
}

3 个答案:

答案 0 :(得分:8)

如果您只想要LinearLayout的圆角矩形背景,可以在“res / drawable /”中的xml文件中定义可绘制的形状:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <solid android:color="#50000000"/>    
    <stroke android:width="3dp"
            android:color="#ffffffff"/>
    <padding android:left="5dp"
             android:top="5dp"
             android:right="5dp"
             android:bottom="5dp"/> 
    <corners android:bottomRightRadius="7dp"
             android:bottomLeftRadius="7dp" 
             android:topLeftRadius="7dp"
             android:topRightRadius="7dp"/> 
</shape>

然后将布局的背景设置为可绘制xml文件的名称。如果将其命名为round_border.xml,请将背景设置为:

<LinearLayout
   android:background="@drawable/round_border"
   ...

透明度设置如下......

<solid android:color="#50000000"/>    

前2位表示透明度,后6位是颜色。

答案 1 :(得分:1)

这个tuto真的帮助了我的问题

首先,您必须在文件res / values / attrs.xml中定义要传递给自定义布局的字段

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="MyLayout">
        <attr name="text" format="string" />
    </declare-styleable>
</resources>

现在准备构造函数以重用这些属性

public RoundRectLayout(Context context, AttributeSet attrs) {
    super(context, attrs);

    TypedArray a = context.obtainStyledAttributes(attrs,
            R.styleable.MyLayout);
    CharSequence s = a.getString(R.styleable.RoundRectLayout_text);
    if (s != null) {
        mText = s.toString();
    }
    a.recycle();
}

然后在layout.xml中添加一个命名空间,以便android konws查找您的自定义布局。 “mi.pakage”是你自定义布局的java包。

获得命名空间后,您的类只需调用您在attrs.xml中设置的属性

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:myapp="http://schemas.android.com/apk/res/mi.pakage"
    android:id="@+id/root"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#fff">

    <com.example.MyLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        myapp:text="My Special Text String"/>

</RelativeLayout>

但是如果你只是想绘制一个矩形,你可以使用另一个答案中的sugested方法

答案 2 :(得分:0)

我认为这是插件失败但你可以指定android:layout_ *,它会被考虑在内。无论如何,如果您只想绘制圆形矩形布局,请按照Marco的说明进行操作