- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试过这个
@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,宽度和高度除以日志结果得到 1.5(800/533=1.5 和 480/320=1.5),所以我似乎从整个屏幕上获取 Canvas 来绘制。为什么会这样,为什么这么小,正常画图应该怎么办?
最佳答案
西装,
View 管理的 Canvas 对象可能总是与您的屏幕尺寸不同。很大程度上取决于您使用上述逻辑的对象。这样做的原因是 Android 会创建一个新 Canvas 或重用旧 Canvas ,具体取决于您的 parent 和 child 的渲染方式以及在处理周期中调用它的位置。当您覆盖行为并动态更改 View 时,事情会变得更加奇怪(特别是如果您在布局/测量/绘制周期期间这样做。
Why is this, and why is it so small...
Canvas 的大小取决于它所在对象的布局参数。如果您覆盖 onMeasure 或 onLayout, Canvas 将仅重新调整需要重新调整的部分。如果您对 Canvas 大小有疑问,您真的需要查看您正在绘制的 View 的布局参数。有时它会更大,有时会更小。它只会与顶层 View / View 组中的屏幕大小相同,顶层 View / View 组具有 layout_width
的 match_parent
(或 fill_parent
)和 layout_height
在全屏(无通知栏)且未使用 Theme.Dialog
样式的 Activity 中。
... what should I do to draw in normal way?
这取决于您所说的“正常”是什么意思以及您的需求是什么。如果您试图手动管理整个 UI,那么您必须控制顶级对象。这通常是通过扩展顶级 View 来完成的,以便您可以覆盖该行为。启动器通过覆盖顶级 FrameLayout 然后是它的 subview 来做到这一点。请注意,这可能代价高昂,因为如果您有足够大的 Canvas ,您可以从屏幕上绘制东西。
大多数程序利用 subview 并简单地覆盖它们的绘制方式,理解 subview 不应控制父 View 的绘制方式。在这种情况下, Canvas 很小且有限,但它优化了逻辑并允许对象相应地移动,同时保持渲染稳定。
游戏使用全屏 SurfaceView
来满足他们的需求。这提供了一个非常灵活的 Canvas ,可以优先考虑手动和不断变化的演示文稿。有许多示例和教程展示了如何执行此操作。只需在 Google 中搜索 SurfaceView
。
一般来说,对于大多数 View ,默认的渲染和绘制方法可以在它们面向对象的性质中使用。正确使用 onMeasure 和 onLayout 等功能通常可以达到预期的效果。在不了解您的特定需求的情况下,这是可以提供的最佳建议。
更多信息(不确定相关性)
了解 Android 如何呈现 View 对于实现理想结果至关重要。引擎中的内容如此之多,以至于它必须考虑多个屏幕,以及在给定许多不同参数的情况下以不同的方式呈现相同的 View 。我会研究如何利用布局参数来减少您必须做的工作量。此外,关于 onMeasure、onLayout 和 onDraw 之间的关系有很多信息。在许多情况下,只需将正确的参数应用于正确的 View ,就会对正确呈现对象所必须采取的控制量产生巨大的影响。
希望对您有所帮助,
模糊逻辑
关于android - 为什么 canvas 和 onDraw 中的 view 大小不一样? (安卓),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10954798/
我是一名优秀的程序员,十分优秀!