Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么画布与onDraw中的视图大小不同?(安卓)_Android_Android Canvas - Fatal编程技术网

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之间关系的信息。在许多情况下,只要将正确的参数应用于正确的视图,就可以在正确渲染对象所需的控制量上产生巨大的差异

希望这有帮助

模糊逻辑