我正在创建一个自定义视图,它将有一个位图,以便用户可以在其中绘制,并在底部使用一些普通的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>
我还应该做些什么?
答案 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()
不完整,还应考虑模式(UNSPECIFIED
,EXACTLY
,AT_MOST
)。文档说onMeasure()
可能会多次被调用,即使是0-0尺寸的版本,也可以查看视图的大小。请参阅View,布局部分。无需拨打super.onMeasure()
。
如果您的自定义视图仅包含绘图区域或者您正在为按钮充气(我的猜测是第一种情况),我不会得到,但尝试层次结构查看器,它将会帮助您了解视图的布局方式(因此在某些情况下,您会看到图纸,有时不会看到图纸)。