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

我试过这个

@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的一部分,视图的大小是正确的。 我的设备是480×800,宽度和高度除以Log结果给出1.5(800/533 = 1.5和480/320 = 1.5),所以看起来我从整个屏幕画画画。 这是为什么,为什么这么小,我该怎么做,以正常的方式绘制?

Solutions Collecting From Web of "为什么canvas与onDraw中的视图大小不一样? (机器人)"

SuitUp,

视图pipe理的canvas对象可能总是与您的屏幕大小不同。 很大程度上取决于您使用上述逻辑的哪个对象。 这是因为Android会创build一个新的canvas或者重新使用旧的canvas,这取决于您的父母和孩子是如何渲染的以及处理循环中的哪个位置。 当你覆盖行为并dynamic改变视图时(特别是在布局/测量/绘制循环期间这样做的话),事情变得更加陌生。

这是为什么,为什么这么小…

canvas的大小取决于所在对象的布局参数。如果您重写onMeasure或onLayout,canvas将只重新调整重新调整所需的参数。 如果您在canvas尺寸方面遇到问题,那么您确实需要查看您所绘制视图的布局参数。有时会更大,有时会更小。 它只会与顶级View / ViewGroup中的屏幕具有相同的大小,该顶级View / ViewGroup对于全屏(无通知栏)活动中的layout_widthlayout_height都具有match_parent (或fill_parent ),并且不使用Theme.Dialog样式。

…我应该怎么做以正常的方式画画?

这取决于你的意思是什么,你的需求是什么。 如果您尝试手动pipe理整个用户界面,则必须控制顶层对象。 这通常是通过扩展顶层视图来完成的,以便覆盖行为。 启动器通过覆盖最顶层的FrameLayout,然后覆盖其子视图来实现这一点。 请注意,如果您有足够大的canvas,则可能会花费很多,因为您可以从屏幕上划出东西。

大多数程序使用子视图并简单地覆盖它们绘制的方式,理解子视图不应该控制父视图绘制的方式。 在这种情况下,canvas小而有限,但是它优化了逻辑并允许对象相应地移动,同时保持渲染稳定。

游戏利用全屏SurfaceView来完成他们的需求。 这提供了一个非常灵活的canvas,在手动和不断变化的演示文稿上确定优先级。 有一些示例和教程显示如何做到这一点。 只需在Google中searchSurfaceView

一般来说,对于大多数视图,默认的渲染和绘图方法可以用于面向对象的特性。 正确使用onMeasure和onLayout等function通常可以达到理想的效果。 不知道更多关于您的特殊需求,这是最好的build议,可以给。

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

了解Android呈现视图对于获得理想的结果至关重要。 如此多的进入引擎,它必须考虑多个屏幕,以及不同的方式来渲染相同的视图给出了许多不同的参数。 我会研究如何利用布局参数来减less你必须做的工作量。 此外,关于onMeasure,onLayout和onDraw之间的关系还有很多信息。 在许多情况下,只要将正确的参数应用于正确的视图,就会使控件的数量发生巨大的变化,为了正确呈现对象,您必须采取相应的控制措施。

希望这可以帮助,

FuzzicalLogic