我有一个自定义布局,在其子项下方绘制一个透明的圆角矩形。问题是当我尝试将其添加到我的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);
}
}
答案 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的说明进行操作