Android:使用按钮实现自定义视图

时间:2011-05-15 12:24:55

标签: android

我正在创建一个自定义视图,它将有一个位图,以便用户可以在其中绘制,并在底部使用一些普通的Android按钮进行用户交互。

要调整我的位图大小(绘图区域的高度应为50%)我将覆盖

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
    this.setMeasuredDimension(widthMeasureSpec, (int)(parentHeight * 0.50));
super.onMeasure(widthMeasureSpec, (int)(parentHeight * 0.50));
} 

这给了我一个例外 “java.lang.IllegalArgumentException:width和height必须是> 0”

如果我设置了super.onMeasure(widthMeasureSpec,heightMeasureSpec); 我无法看到我的按钮位于底部。

如果我不写super.onMeasure(),一旦我释放鼠标,我看不到任何东西。

我正在使用xml文件进行布局:

<view class="com.my.CustomView" android:id="@+id/myView"
    android:layout_width="fill_parent" android:layout_height="wrap_content"/>
<LinearLayout android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:orientation="horizontal">
    <Button android:layout_height="wrap_content"
        android:text="B1" android:layout_width="wrap_content"/>
    <Button android:layout_height="wrap_content"
        android:layout_width="wrap_content" android:text="B2"/>
</LinearLayout>

我还应该做些什么?

2 个答案:

答案 0 :(得分:1)

在dp中为自定义视图提供大小会更容易。然后,您可以在设计模式下查看布局。然后使用onSizeChanged找出画布的大小。

onMeasure通常在画布大小取决于运行时值时使用,例如游戏结果或加载项目数等。

这是一个有效的例子:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {     
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);      
        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);     
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);      
        int newH = (int) (parentHeight / 1.5f);
        this.setMeasuredDimension(parentWidth, newH );
    }

自定义vuew的构造函数也必须包含属性集:

public CustomView(Context context, AttributeSet attrs) {     
    super(context, attrs); 
} 

答案 1 :(得分:1)

您的onMeasure()不完整,还应考虑模式(UNSPECIFIEDEXACTLYAT_MOST)。文档说onMeasure()可能会多次被调用,即使是0-0尺寸的版本,也可以查看视图的大小。请参阅View布局部分。无需拨打super.onMeasure()

如果您的自定义视图仅包含绘图区域或者您正在为按钮充气(我的猜测是第一种情况),我不会得到,但尝试层次结构查看器,它将会帮助您了解视图的布局方式(因此在某些情况下,您会看到图纸,有时不会看到图纸)。