我尝试了这个
@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_parent
和layout_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/