我尝试了这个

@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的一部分, View 的大小是正确的。
我的设备是480x800,宽度和高度均除以Log结果得出1.5(800/533 = 1.5和480/320 = 1.5),因此看来我可以从整个屏幕上绘制 Canvas 了。为什么会这样,为什么会这么小,我应该怎么做才能正常绘制呢?

最佳答案

SuitUp,

View 管理的 Canvas 对象可能总是与您的屏幕尺寸不同。在很大程度上取决于您使用上述逻辑的对象。原因是Android会创建新的 Canvas 或重用旧的 Canvas ,具体取决于您的 parent 和 child 的渲染方式以及在处理循环中的哪个位置进行调用。当您覆盖行为并动态更改 View 时,事情变得更加奇怪(尤其是如果您在布局/度量/绘制周期中这样做的话)。



Canvas 的大小基于其所在对象的布局参数。如果覆盖onMeasure或onLayout,则 Canvas 将仅重新调整需要进行调整的内容。如果 Canvas 尺寸有问题,您确实要查看要绘制的 View 的布局参数。有时它会更大,有时会更小。它只会与全屏(无通知栏)且未使用match_parent样式的Activity中的fill_parentlayout_width都具有layout_height(或Theme.Dialog)的顶级View/ViewGroup中的屏幕大小相同。



这取决于您通常所说的是什么以及您的需求是什么。如果尝试手动管理整个UI,则必须控制顶级对象。通常,这是通过扩展顶级 View 来完成的,以便您可以覆盖行为。启动程序通过覆盖顶级FrameLayout及其 subview 来实现此目的。请注意,如果您有足够大的 Canvas ,可以从屏幕上画些东西,这可能会很昂贵。

MOST程序利用 subview 并简单地覆盖它们的绘制方式,因为要理解 subview 不应控制父 View 的绘制方式。在这种情况下, Canvas 很小且受限制,但是它可以优化逻辑并允许对象相应地移动,同时保持渲染稳定。

游戏使用全屏SurfaceView来满足其需求。这提供了一个非常灵活的 Canvas ,并且在手动和不断变化的演示文稿上具有优先级。有许多示例和教程显示了如何执行此操作。只需在Google中搜索SurfaceView即可。

通常,对于大多数 View ,可以以其面向对象的性质使用默认的渲染和绘制方法。正确使用诸如onMeasure和onLayout之类的功能通常可以达到所需的结果。在不了解您的特定需求的情况下,这是可以提供的最佳建议。

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

了解Android如何呈现 View 对于实现理想结果至关重要。引擎已经投入了太多东西,以至于它必须考虑多个屏幕,并且在给定许多不同参数的情况下,呈现同一View的方法也有所不同。我将研究如何利用Layout参数来减少您要做的工作量。此外,关于onMeasure,onLayout和onDraw之间的关系,有很多信息。在许多情况下,仅将正确的参数应用于正确的 View 将对为正确呈现对象而必须采取的控制量产生巨大的影响。

希望这可以帮助,

模糊逻辑

关于android - 为什么 Canvas 的大小与onDraw中的 View 大小不同? (安卓),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10954798/

10-12 00:27
查看更多