【问题标题】:Android: Drawing and rotating on a canvasAndroid:在画布上绘图和旋转
【发布时间】:2011-01-28 18:37:59
【问题描述】:

我正在为平板电脑创建绘图应用程序,并且对如何最好地处理与屏幕方向更改相关的绘图画布感兴趣。绘图程序跟踪用户输入并将它们存储为向量,由 X、Y 坐标锚定。

该问题与纵向/横向模式下 X、Y 的不同大小有关。如果用户有一个填满屏幕的画布(减去通知栏和标题栏),并且在纵向模式下在画布底部附近绘制(比如在 320x480 屏幕上的点 140,460 处),当屏幕翻转为横向并从我存储的 X,Y 向量,140,460 处的点现在超出了屏幕的范围(因为屏幕现在是 480x320)。同样,如果他们在靠近屏幕右侧边缘的横向画点并翻转回纵向,这些点将超出边界。

我已经查看了解决方案,显而易见的解决方案似乎是将屏幕锁定到特定方向。我从 Marketplace 下载的许多绘图应用程序都是这样处理的。

当我为平板电脑设计这个时,我想让用户可以根据自己的喜好灵活绘制,同时在屏幕边界等方面保持一定的理智。

我曾经/尝试过的想法包括:

  • 锁定到特定方向 - 可以,但讨厌强迫用户使用特定偏好
  • 锁定到特定方向并隐藏标题和通知栏,因此用户只看到一个大的空白画布,他们可以随意使用 - 但讨厌通知栏被隐藏

我考虑过隐藏标题栏、显示通知、允许更改方向,然后如果屏幕旋转为横向,将画布旋转回纵向,但是当导航栏从顶部移动时在纵向到横向的右侧,我仍然会遇到相同的 X、Y 边界问题,只是程度要小得多(通知栏的宽度有效)。

对此有解决方案的想法吗?

谢谢。

【问题讨论】:

    标签: android canvas coordinates screen-rotation


    【解决方案1】:

    实现滚动/平移,让绘图表面任意大于父视图的尺寸。那么设备是纵向还是横向都没有关系。您只需将视图作为绘图表面特定部分的窗口。

    【讨论】:

    • 有趣...关于如何创建任意大小的画布(在我的例子中,画布保存在框架布局中)的任何指针?
    • 您根本不创建画布。您创建大小为 N x N 的屏幕外位图,其中 N = max(View.width, View.height)。您将用户触摸事件映射到从 Canvas c = new Canvas(offscreenBitmap) 派生的画布上的绘制调用。然后,您只需将屏幕外位图绘制到自定义 onDraw 中提供给您的画布上。平移涉及将屏幕外位图绘制到 onDraw 画布上的不同位置。
    • 知道了。我遇到的问题是我在 SurfaceView/线程中绘制到画布,其中画布本身是通过 canvas = mSurfaceHolder.lockCanvas(null); 从 SurfaceHolder 返回的。我不确定在哪里可以将两者联系在一起。
    • 你还想明白了吗?如果您需要提示,我可以详细说明。
    猜你喜欢
    • 2016-11-21
    • 2021-08-24
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多