Android 为什么画布与onDraw中的视图大小不同?(安卓)
我试过这个Android 为什么画布与onDraw中的视图大小不同?(安卓),android,android-canvas,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(
@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
部分来自my main.xml
android:layout_width="480px"
android:layout_height="300px"
根据我的日志打印和部分xml,视图的大小是正确的。
我的设备是480x800,宽度和高度除以日志结果得到1.5(800/533=1.5和480/320=1.5),所以看起来我可以从整个屏幕上画画布。为什么是这个,为什么它这么小,我应该怎么做才能以正常的方式绘制呢?SuitUp
视图管理的画布对象可能总是与屏幕大小不同。很大程度上取决于使用上述逻辑的对象。原因是Android会创建一个新画布或重用旧画布,具体取决于父母和孩子的渲染方式以及处理周期中调用画布的位置。当您重写行为并动态更改视图时(尤其是在布局/测量/绘制周期中这样做时),情况变得更加奇怪
为什么是这个,为什么它这么小
画布的大小基于其所在对象的布局参数。如果覆盖onMeasure或onLayout,画布将只重新调整需要重新调整的内容。如果画布大小有问题,您确实希望查看正在绘制的视图的布局参数。有时,它会更大有时它会更小。它只会与顶级视图/视图组中的屏幕大小相同,在全屏活动(无通知栏)中,该视图/视图组的匹配父视图
(或填充父视图
)的布局宽度
和布局高度
并且不使用主题对话框
样式
…我应该怎么做才能以正常方式绘制
这取决于“正常”的含义和您的需求。如果您试图手动管理整个UI,则必须控制顶级对象。这通常通过扩展顶级视图来实现,以便您可以覆盖行为。启动器通过覆盖顶级FrameLayout及其子视图来实现s、 请注意,这可能是昂贵的,因为如果你有足够大的画布,你可以从屏幕上画东西
大多数程序都利用子视图,并简单地覆盖它们的绘制方式,了解子视图不应控制父视图的绘制方式。在这种情况下,画布很小且有限,但它优化了逻辑并允许对象相应地移动,同时保持渲染稳定
游戏利用全屏SurfaceView
来满足他们的需求。这提供了一个非常灵活的画布,在手册和不断变化的演示文稿上具有优先级。有许多示例和教程演示了如何做到这一点。只需在谷歌中搜索SurfaceView
一般来说,对于大多数视图,默认的渲染和绘制方法可以在其面向对象的特性中使用。正确地使用onMeasure和onLayout等函数通常可以获得所需的结果。在不了解您的特定需求的情况下,这是可以给出的最佳建议
更多信息(不确定相关性)
理解Android如何呈现视图对于获得理想的结果至关重要。引擎中已经投入了太多的精力,以至于它必须考虑多个屏幕,以及在给定许多不同参数的情况下呈现同一视图的不同方式。我将研究如何利用布局参数来减少所需的工作量。进一步,有很多关于onMeasure、onLayout和onDraw之间关系的信息。在许多情况下,只要将正确的参数应用于正确的视图,就可以在正确渲染对象所需的控制量上产生巨大的差异
希望这有帮助
模糊逻辑