1

我有一个扩展我绘制的 View 的类。

尽管视图被设置为具有特定尺寸的 RelativeLayout 的子视图,但视图的画布报告它是 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);
    ...     
}

有没有我忽略的东西,或者视图中的画布总是整个屏幕的宽度和高度?

相对布局的 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"           
        />  
4

1 回答 1

0

啊,现在我明白了:)

您有 clipChildren = true 但这适用于包含布局。子视图可以在其父视图的范围之外绘制,但绘图将被简单地裁剪到父尺寸。

似乎在这里,您正在使用窗口管理器来构建您的 DrawView

dv = new DrawView(this, getWindowManager());
dv.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

没有看到构造函数,我猜测后面的 setLayoutParams 使用的是 FILL_PARENT,即整个屏幕。

如果我是你,我会为你的 DrawView 实现标准构造函数,然后将它放在布局 XML 中。这是“安卓”的方式。您还可以覆盖 onMeasure() 以跟踪 DrawView 的大小,将 x 和 y 存储在内部字段中,您可以使用它们进行所需的任何缩放。这样,如果您的布局每次更改(方向更改、不同的分辨率支持、新版本),您的代码就不需要更改。

最后,永远不要(除非你真的知道为什么)在布局中使用 PX。请改用 DIP。

于 2012-09-29T09:29:42.733 回答