Android:动态更改选项菜单的位置

时间:2011-02-18 04:45:40

标签: android orientation sensor options-menu

我有一个绘图活动,可以创建一个占据整个屏幕的自定义“画布”视图,允许用户在其上绘图。我需要将Activity锁定为纵向方向,因为绘图应用程序是草图板替换,并且用户需要旋转“pad”以在没有垫在其上翻转的情况下进行绘制。这当然意味着选项菜单也被锁定到该方向,并且根据用户的不同,菜单可能会从顶部,底部或侧面弹出。我希望选项菜单始终位于相对于用户的底部...我正在考虑的一些选项,并希望得到任何建议或信息:

  1. 允许方向更改,因此菜单会根据需要移动,然后使用SensorManager侦听方向,并手动将画布视图旋转回“正确”方向(纵向)。这将是丑陋的,因为画布的旋转可能会有延迟,并且由于X / Y被交换,它会引入一些可能很复杂的计算等。
  2. 限制方向更改,然后使用SensorManager收听方向,并手动将选项菜单旋转回底部。不知道这是否可能。
  3. 锁定方向,并创建一个截取菜单按钮的自定义视图,并显示我需要管理的“假”选项菜单等。真的不想更换内置的操作系统功能,可能是对未来不同版本的操作系统进行维护的噩梦等等。
  4. 任何人对如何处理这个有任何想法?如果#2有可能,我会很高兴,但找不到任何相关内容。

    谢谢,

    编辑:

    已经确认#2不可能,所以我猜我的选项是#1,#3,除非其他人有任何想法?

1 个答案:

答案 0 :(得分:0)

我的解决方案如下:

  • 允许Android Manifest中的正常方向更改。
  • 在自定义“画布”视图构造函数中,启动跟踪字段mDisplay,该字段通过以下方式获取显示信息:

代码:

mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
  • 在onDraw()中,检查显示旋转是否为0以外的值,然后将画布旋转回0旋转值:

代码:

if (mDisplay.getRotation() > 0) {
    canvas.save(Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
    canvas.rotate(-mDisplay.getRotation(), px, py);
    ...
    do stuff
    ...
    canvas.restore();
}

不确定这是最好的解决方案,但似乎有效。