我试过这个
@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,宽度和高度除以日志结果给出1.5(800/533 = 1.5和480/320 = 1.5),所以我似乎从整个屏幕上得到Canvas。为什么会这样,为什么它如此之小,我该怎样做以正常的方式画画?
答案 0 :(得分:15)
SuitUp,
视图管理的画布对象可能总是与您的屏幕大小不同。很大程度上取决于您使用上述逻辑的对象。这样做的原因是Android会创建一个新画布或重新使用旧画布,具体取决于父项和子项的呈现方式以及处理它的循环中的位置。当您覆盖行为并动态更改视图时,事情变得更加奇怪(特别是如果您在布局/测量/绘制周期中这样做。
为什么会这样,为什么这么小......
画布的大小基于它所在对象的布局参数。如果覆盖onMeasure或onLayout,画布将只调整重新调整所需的内容。如果您遇到画布大小的问题,您真的想要查看您正在绘制的视图的布局参数。有时它会更大,有时会更小。它只会与活动中match_parent
和fill_parent
layout_width
(或layout_height
}的顶级视图/ ViewGroup中的屏幕大小相同这是全屏(没有通知栏)而不使用Theme.Dialog
样式。
......我该怎样做以正常方式画画?
这取决于您的正常意义以及您的需求。如果您尝试手动管理整个UI,则必须控制顶级对象。这通常通过扩展顶级视图来完成,以便您可以覆盖该行为。启动器通过覆盖顶级FrameLayout然后覆盖其子视图来完成此操作。请注意,如果你有一个足够大的画布,你可以把它从屏幕上拉出来,这可能会很昂贵。
MOST程序利用子视图并简单地覆盖它们绘制的方式,理解子视图不应该控制父视图绘制的方式。在这种情况下,画布很小且有限,但它优化了逻辑并允许对象相应地移动,同时保持渲染稳定。
游戏使用全屏SurfaceView
来完成他们的需求。这提供了一个非常灵活的画布,可以对手动和不断变化的演示进行优先级排序。有许多示例和教程说明了如何执行此操作。只需在Google中搜索SurfaceView
。
通常,对于大多数视图,默认渲染和绘图方法可以在其面向对象的性质中使用。正确使用onMeasure和onLayout等功能通常可以达到预期的效果。如果不了解您的特殊需求,这是最好的建议。
更多信息(不确定相关性)
了解Android如何呈现视图对于实现理想结果至关重要。已经进入引擎必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现相同View的不同方式。我将研究如何利用布局参数来减少您必须完成的工作量。此外,有很多关于onMeasure,onLayout和onDraw之间关系的信息。在许多情况下,只需将正确的参数应用于正确的视图,就会对为正确渲染对象而必须采取的控制量产生巨大的差异。
希望这有帮助,
FuzzicalLogic