我尝试过这个
@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),所以看起来我从整个屏幕获取 Canvas 来绘制。为什么会这样,为什么它这么小,我应该怎么做才能以正常方式绘制?
SuitUp,
视图管理的画布对象可能始终与您的屏幕尺寸不同。很大程度上取决于您使用上述逻辑的对象。原因是 Android 创建一个新的画布或重用旧的画布,具体取决于父级和子级的渲染方式以及处理周期中的调用位置。当您覆盖行为并动态更改视图时,事情会变得更加奇怪(特别是如果您在布局/测量/绘制周期期间这样做)。
为什么会这样,为什么这么小……
画布的大小基于其所在对象的布局参数。如果您覆盖 onMeasure 或 onLayout,画布将仅重新调整需要重新调整的部分。如果您对画布尺寸有疑问,您确实需要检查正在绘制的视图的布局参数。有时它会更大,有时会更小。它只会与具有以下内容的顶级视图/视图组中的屏幕大小相同match_parent
(or fill_parent
)对于两个layout_width
and layout_height
在全屏(无通知栏)的活动中并且不使用Theme.Dialog
style.
...我应该怎么做才能以正常方式绘制?
这取决于您所说的正常是什么意思以及您的需求是什么。如果您尝试手动管理整个 UI,那么您必须控制顶层对象。这通常是通过扩展顶级视图来完成的,以便您可以覆盖该行为。启动器通过覆盖顶级 FrameLayout 及其子视图来实现此目的。请注意,这可能会很昂贵,因为如果你有足够大的画布,你可以从屏幕上绘制东西。
大多数程序都使用子视图并简单地覆盖它们的绘制方式,并理解子视图不应控制父视图的绘制方式。在这种情况下,画布很小且有限,但它优化了逻辑并允许对象相应移动,同时保持渲染稳定。
游戏使用全屏SurfaceView
以实现他们的需求。这提供了一个非常灵活的画布,优先考虑手动和不断变化的演示。有许多示例和教程展示了如何执行此操作。只需在 Google 中搜索SurfaceView
.
一般来说,对于大多数视图,可以利用其面向对象的特性来使用默认的渲染和绘制方法。正确利用 onMeasure 和 onLayout 等函数通常可以达到预期的效果。在不了解更多关于您的特殊需求的情况下,这是可以给出的最佳建议。
更多信息(不确定相关性)
了解 Android 如何呈现视图对于获得理想的结果至关重要。引擎中包含了如此多的内容,以至于它必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现同一视图的不同方式。我会研究如何利用布局参数来减少您必须做的工作量。此外,还有很多关于onMeasure、onLayout和onDraw之间关系的信息。在许多情况下,只需将正确的参数应用于正确的视图,就会对正确渲染对象所需的控制量产生巨大的影响。
希望这可以帮助,
模糊逻辑
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)