我的视图中的画布设置为全屏尺寸,而不是查看尺寸...为什么?

时间:2012-09-29 08:15:19

标签: android canvas

我有一个扩展我绘制的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"           
        />  

1 个答案:

答案 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。