为什么canvas与onDraw中的视图大小不同?(机器人)

Sui*_*tUp 9 android android-canvas

我试过这个

@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() + "");
}
Run Code Online (Sandbox Code Playgroud)

这就是结果:

canvas width: 320
view width: 480
canvas height: 533
view height: 300
canvas width: 320
view width: 480
canvas height: 533
view height: 300
Run Code Online (Sandbox Code Playgroud)

部分来自我的main.xml

    android:layout_width="480px"
    android:layout_height="300px"
Run Code Online (Sandbox Code Playgroud)

根据我的日志打印和我的部分xml,视图大小是正确的.我的设备是480x800,宽度和高度除以日志结果给出1.5(800/533 = 1.5和480/320 = 1.5),所以我似乎从整个屏幕上得到Canvas.为什么会这样,为什么它如此之小,我该怎样做以正常方式画画?

Fuz*_*gic 15

SuitUp,

视图管理的画布对象可能总是与您的屏幕大小不同.很大程度上取决于您使用上述逻辑的对象.这样做的原因是Android会创建一个新画布或重新使用旧画布,具体取决于父项和子项的呈现方式以及处理它的循环中的位置.当您覆盖行为并动态更改视图时,事情变得更加奇怪(特别是如果您在布局/测量/绘制周期中这样做).

这是为什么,为什么这么小......

画布的大小基于它所在对象的布局参数.如果覆盖onMeasure或onLayout,画布将仅重新调整只需要重新调整的内容.如果您遇到画布大小的问题,您真的想要查看您正在绘制的视图的布局参数.有时它会更大,有时会更小.它将永远只能是大小相同的顶级查看/ ViewGroup中具有屏幕match_parent(或fill_parent)为两个layout_width,并layout_height在全屏是(没有通知栏),而不是使用一个活动Theme.Dialog的风格.

......我该怎样做以正常方式画画?

这取决于你的正常意义和你的需求.如果您尝试手动管理整个UI,则必须控制顶级对象.这通常通过扩展顶级视图来完成,以便您可以覆盖该行为.启动器通过覆盖顶级FrameLayout然后覆盖其子视图来完成此操作.请注意,这可能会很昂贵,因为如果你有足够大的画布,你可以从屏幕上画出东西.

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

游戏使用全屏SurfaceView来满足他们的需求.这提供了一个非常灵活的画布,可以对手动和不断变化的演示进行优先级排序.有许多示例和教程说明了如何执行此操作.只需在Google上搜索即可SurfaceView.

通常,对于大多数视图,可以在其面向对象的性质中使用默认呈现和绘制方法.正确使用onMeasure和onLayout等功能通常可以达到预期的效果.如果不了解您的特定需求,这是最好的建议.

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

了解Android如何呈现视图对于实现理想结果至关重要.已经进入引擎必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现相同View的不同方式.我将研究如何利用布局参数来减少您必须完成的工作量.此外,有很多关于onMeasure,onLayout和onDraw之间关系的信息.在许多情况下,只需将正确的参数应用于正确的视图,就会对为正确渲染对象而必须采取的控制量产生巨大差异.

希望这可以帮助,

FuzzicalLogic