2012-09-29 65 views
0

我有一个扩展了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); 
    ...  
} 

是否有我忽视的东西或者是视图中的画布始终是整个屏幕的宽度和高度?

的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

我认为你需要看看onMeasure,你有没有在Android Dev上看到自定义视图的文档? – Neil

+0

直到布局完成后,dv.getWidth()才会为零。请参阅http://developer.android.com/reference/android/view/ViewTreeObserver.html。请为RelativeLayout显示XML。 – Simon

+0

@Simon,在编辑中加入xml ... –

回答

0

啊,现在我把它:)

你有clipChildren =真实的,但适用于含布局。子视图可以绘制到父级边界之外,但绘图将简单地剪裁到父级维度。

看来,在这里,您正在使用的窗口管理器来构建你的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。

+0

谢谢... px是各种企图试图找出问题所在的遗留问题。实际上,我将WindowManager传递给该DrawView,因为它后面有一些信息,但我没有*以任何相关方式使用它来进行配置。然后,我将dv设置为一个childView,以XML格式显示(它定义了尺寸)。如果我不设置剪辑,它会在整个屏幕上绘制(这不是我想要的)。奇怪的是,它报告正确的坐标从父母坐的位置开始,因此,它正在履行xml的这部分内容,但是从右侧开始1280! –

+0

好的请显示您的构造函数。 AttributeSet是这里的关键。它从哪里获得?布局管理器提供它,因为视图是在layout.xml中定义的,或者是您构造的。 – Simon

相关问题