10

我试过这个

@Override
protected void onDraw(Canvas canvas)
{
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
    super.onDraw(canvas);
    Log.e("TEST", "canvas width: " + canvas.getWidth() + "");
    Log.e("TEST", "view width: " + this.getWidth() + "");

    Log.e("TEST", "canvas height: " + canvas.getHeight() + "");
    Log.e("TEST", "view height: " + this.getHeight() + "");
}

这是结果:

canvas width: 320
view width: 480
canvas height: 533
view height: 300
canvas width: 320
view width: 480
canvas height: 533
view height: 300

部分来自我的 main.xml

    android:layout_width="480px"
    android:layout_height="300px"

根据我的日志打印和我的部分 xml,视图大小是正确的。我的设备是 480x800,宽度和高度除以 Log 结果为 1.5(800/533=1.5 和 480/320=1.5),所以我似乎从整个屏幕上得到了画布。为什么会这样,为什么这么小,我应该怎么做才能以正常方式绘制?

4

1 回答 1

15

西装,

视图管理的画布对象可能总是与您的屏幕尺寸不同。很大程度上取决于您使用上述逻辑的对象。这样做的原因是,Android 创建一个新的画布或重用旧的画布,这取决于您的父母和孩子的渲染方式以及在处理周期中调用它的位置。当您覆盖行为并动态更改视图时,事情会变得更加奇怪(尤其是在布局/测量/绘制周期中这样做时。

为什么会这样,为什么这么小……

画布的大小基于它所在对象的布局参数。如果覆盖 onMeasure 或 onLayout,画布将仅重新调整需要重新调整的内容。如果你对画布大小有疑问,你真的想看看你正在绘制的视图的布局参数。有时它会更大,有时它会更小。它只会与顶级 View/ViewGroup 中的屏幕大小相同,该 View/ViewGroup 具有match_parent(或fill_parent)用于全屏(无通知栏)且不使用样式的 Activitylayout_width和Activity。layout_heightTheme.Dialog

...我应该怎么做才能以正常方式绘制?

这取决于您所说的正常以及您的需求是什么。如果您尝试手动管理整个 UI,那么您必须控制顶级对象。这通常是通过扩展顶级视图来完成的,以便您可以覆盖该行为。启动器通过覆盖顶层 FrameLayout 及其子视图来实现这一点。请注意,这可能会很昂贵,因为如果你有足够大的画布,你可以从屏幕上画出东西。

大多数程序利用子视图并简单地覆盖它们绘制的方式,理解子视图不应该控制父视图的绘制方式。在这种情况下,画布很小且有限,但它优化了逻辑并允许对象相应地移动,同时保持渲染稳定。

游戏使用全屏SurfaceView来满足他们的需求。这提供了一个非常灵活的画布,优先考虑手动和不断变化的演示文稿。有许多示例和教程展示了如何执行此操作。只需在 Google 中搜索SurfaceView.

通常,对于大多数视图,可以在其面向对象的性质中使用默认的渲染和绘图方法。正确使用 onMeasure 和 onLayout 等函数通常可以达到预期的效果。在不了解您的特定需求的情况下,这是可以给出的最佳建议。

更多信息(不确定相关性)

了解 Android 如何呈现视图对于实现理想的结果至关重要。引擎中包含了太多内容,以至于它必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现相同视图的不同方式。我会研究如何利用布局参数来减少你必须做的工作量。此外,还有很多关于 onMeasure、onLayout 和 onDraw 之间关系的信息。在许多情况下,只需将正确的参数应用到正确的视图中,就会对正确渲染对象所需的控制量产生巨大影响。

希望这可以帮助,

模糊逻辑

于 2012-06-08T23:24:57.000 回答