我有一个扩展我绘制的View的类。
尽管视图被设置为具有特定尺寸的RelativeLayout的子视图,但View的画布报告它是1280宽(与设备一样宽)。
我正在努力理解我需要做些什么才能让画布受到其视图尺寸的限制(正如常识所指示的那样)。
好奇我忽略的......这里是相关的代码片段......
dv = new DrawView(this, getWindowManager());
dv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
//this wrapper is 500x500
((RelativeLayout)findViewById(R.id.drawWrapper)).addView(dv);
L.log("DRAWVIEW WIDTH = " + dv.getWidth()); //this reports 0... why?
在DrawView中......
@Override
public void onDraw(Canvas canvas) {
L.log("CANVAS WIDTH ON DRAW = " + canvas.getWidth()); //this always reports 1280 on xoom
this.canvas = canvas;
drawElementsOntoCanvas(canvas, true, false);
...
}
我有什么东西可以忽略,或者是View中的画布总是整个屏幕的宽度和高度?
相对布局的XML:
<RelativeLayout
android:id="@+id/drawWrapper"
android:layout_width="500px"
android:layout_height="500px"
android:layout_centerHorizontal="true"
android:layout_marginTop="50dip"
android:clipChildren="true"
android:background="@drawable/cut_out_frame"
/>
答案 0 :(得分:0)
啊,现在我明白了:)
您有clipChildren = true但这适用于包含布局。子视图可以在其父级的边界之外绘制,但绘图将简单地剪切到父级维度。
似乎在这里,您正在使用窗口管理器来构建DrawView
dv = new DrawView(this, getWindowManager());
dv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
在没有看到构造函数的情况下,我猜测后续的setLayoutParams正在使用FILL_PARENT,即整个屏幕。
如果我是你,我会为你的DrawView实现标准构造函数,然后将它放在布局XML中。这是“Android”的方式。您还可以覆盖onMeasure()以跟踪DrawView的大小,将x和y存储在内部字段中,您可以使用它来进行所需的任何缩放。这样,如果您的布局每次更改(方向更改,不同分辨率支持,新版本),您的代码都不需要更改。
最后,从不(除非你真的知道为什么)在布局中使用PX。改为使用DIP。