如何framework层任意设置Android屏幕的旋转方向

作者&投稿:贸傅 (若有异议请与网页底部的电邮联系)
如何framework层任意设置Android屏幕的旋转方向~

设备平放,屏幕朝正上方。以下四个常量分别代表:
private static final int ROTATION_0 = 0;//初始情况。这个时候设备是横屏还是竖屏与硬件设备安装时默认的显示方向有关。
private static final int ROTATION_90 = 1;//设置屏幕方向自动旋转后,右侧翻起侧立时,屏幕会旋转到这个方向。
private static final int ROTATION_270 = 2;//设置屏幕方向自动旋转后,左侧翻起度侧立时,屏幕会旋转到这个方向。
private static final int ROTATION_180 = 3;//设置屏幕方向自动旋转后,屏幕底部侧立时,屏幕会旋转到这个方向。

再看两个数组:
view plain
private static final int[][][] THRESHOLDS_WITH_180 = new int[][][] {
{{60, 165}, {165, 195}, {195, 300}},
{{0, 30}, {165, 195}, {195, 315}, {315, 360}},
{{0, 45}, {45, 165}, {165, 195}, {330, 360}},
{{0, 45}, {45, 135}, {225, 315}, {315, 360}},
};
private static final int[][] ROTATE_TO_WITH_180 = new int[][] {
{ROTATION_90, ROTATION_180, ROTATION_270},
{ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0},
{ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0},
{ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0},
};

当前屏幕旋转方向为ROTATION_0时,取int[][] threshold=THRESHOLDS_WITH_180[0];
当前屏幕旋转方向为ROTATION_90时,取int[][] threshold=THRESHOLDS_WITH_180[1];
当前屏幕旋转方向为ROTATION_270时,取int[][] threshold=THRESHOLDS_WITH_180[2];
当前屏幕旋转方向为ROTATION_180时,取int[][] threshold=THRESHOLDS_WITH_180[3];

其中,threshold中的每一个元素由两个值构成,用来表示一个范围。

在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation=”landscape” 属性。参数说明:landscape = 横向portrait = 纵向避免在转屏时重启Activityandroid中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上 android:configChanges=”keyboardHiddenorientation”属性)。在需要控制屏幕显示方向的Activity中重写 onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。

  设备平放,屏幕朝正上方。以下四个常量分别代表:
  private static final int ROTATION_0 = 0;//初始情况。这个时候设备是横屏还是竖屏与硬件设备安装时默认的显示方向有关。
  private static final int ROTATION_90 = 1;//设置屏幕方向自动旋转后,右侧翻起侧立时,屏幕会旋转到这个方向。
  private static final int ROTATION_270 = 2;//设置屏幕方向自动旋转后,左侧翻起度侧立时,屏幕会旋转到这个方向。
  private static final int ROTATION_180 = 3;//设置屏幕方向自动旋转后,屏幕底部侧立时,屏幕会旋转到这个方向。

  再看两个数组:
  view plain
  private static final int[][][] THRESHOLDS_WITH_180 = new int[][][] {
  {{60, 165}, {165, 195}, {195, 300}},
  {{0, 30}, {165, 195}, {195, 315}, {315, 360}},
  {{0, 45}, {45, 165}, {165, 195}, {330, 360}},
  {{0, 45}, {45, 135}, {225, 315}, {315, 360}},
  };
  private static final int[][] ROTATE_TO_WITH_180 = new int[][] {
  {ROTATION_90, ROTATION_180, ROTATION_270},
  {ROTATION_0, ROTATION_180, ROTATION_90, ROTATION_0},
  {ROTATION_0, ROTATION_270, ROTATION_180, ROTATION_0},
  {ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_0},
  };

  当前屏幕旋转方向为ROTATION_0时,取int[][] threshold=THRESHOLDS_WITH_180[0];
  当前屏幕旋转方向为ROTATION_90时,取int[][] threshold=THRESHOLDS_WITH_180[1];
  当前屏幕旋转方向为ROTATION_270时,取int[][] threshold=THRESHOLDS_WITH_180[2];
  当前屏幕旋转方向为ROTATION_180时,取int[][] threshold=THRESHOLDS_WITH_180[3];

  其中,threshold中的每一个元素由两个值构成,用来表示一个范围。

  WindowOrientationListener会注册一个Accelerator类型的SensorEventListener,当有新的SensorEvent产生时,调用filterOrientation产生一个int orientation值。这个值会在threshold的各个元素表示的范围中匹配,看会落在哪个范围。假设当前屏幕方向为ROTATION_0,那么threshold={{60, 165}, {165, 195}, {195, 300}},假设这个时候把屏幕左侧翻起90度。filterOrientation计算出的orientation值落在了第三个元素范围内,那么去ROTATE_TO_WITH_180中寻找与它对应的值,发现是ROTATION_270,那么就把当前屏幕旋转方向改变为270度。threshold的取值就变成了THRESHOLDS_WITH_180[2]。当把屏幕再次放平时,filterOrientation计算出的orientation值会落在第一个元素表示的范围内。去ROTATE_TO_WITH_180中寻找与它对应的值,发现是ROTATION_0,那么当前屏幕旋转方向被改变为0度。
  还有一个变量比较重要,mAllow180Rotation,这个变量设置为false时,就不使用THRESHOLDS_WITH_180和ROTATE_TO_WITH_180这一对数组来做上面这些变的了,就使用THRESHOLDS和ROTATE_TO。
  其实,我研究了半天也没有搞清filterOrientation的算法以及THRESHOLDS_WITH_180和THRESHOLDS这两个数组里面的每个数字代表的具体意义。最后只搞清了上面的这个流程,还有ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_180这四个角度分别代表哪四个方向。但这足以应付我们要做的事情了。
  比如,我想让屏幕最多只旋转90度和180度,不让它有旋转270度的机会。那就把ROTATE_TO_WITH_180里面的ROTATION_270全部变成90度。这样,应该旋转到270度时,就会旋转到90度了。如果不想让屏幕旋转,把所有值都改成ROTATION_0就可以了。

  再深入挖掘一下这个话题
  PhonwWindowManager是唯一实现WindowOrientationListener接口的类,它管理着整个设备界面的显示。当PhonwWindowManager通过WindowOrientationListener知道屏幕方向发生旋转时,会告诉WindowManagerService:
  mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);
  而WindowManagerService得到这个通知后,会做两个比较重要的事情:
  1、Surface.setOrientation(0, rotation, animFlags);
  2、mRotationWatchers.get(i).onRotationChanged(rotation);
  我们知道,每个Activity都有一个View树,每个View树都是绘画在一个Surface上面的。通过上面这两步,先把Surface给旋转了,再告诉Activity重新绘制View树,就完了整个屏幕的旋转。


ATI显卡驱动装不上~!
1. 你的显卡是老显卡或笔记本显卡,新版驱动或台式驱动无法支持。2. 不排除笔记本显卡冒充台式机显卡,也就是假显卡,设备ID是刷的,不在公版驱动支持范围,驱动精灵提供的驱动没法用。不管何种情况,你需要针对设备ID来修改inf以驱动显卡。1. 下载AMD官方驱动最新版,这个根据你的显卡新旧 http:\/\/suppo...

php开发需要框架吗?
php中也存在框架,如国内比较常用的thinkphp、brophp。国外的Laravel。但使用其也用利弊,分析如下:框架是非常好的,它能让决定更连贯。框架能避免我们写一大堆自定义模块来实现这些性能,我们所需要做的就是将这些共用模块放在框架中实现。框架节省了我们不少的时间和精力,并且让扩展变得更容易。但是这...

php开发需要框架吗?
另一种常见的错误是没有确保数据库和网站服务器兼容特定的框架。例如Seagull PHP Framewor推荐如下配置:PHP: PHP 4.3.0 是最低配置,之后的版本也支持,PHP 5.1.1 及更高版本也可以。请避免任何 5.0.x 系列的东西。MySQL: MySQL 4.0.x, 4.1.x 和 5.0.x 都支持,你也可以使用 3....

php开发需要框架吗?
什么是PHP开发框架?\\x0d\\x0a有太多的原因使得PHP成为世界上最受欢迎的脚本语言——高度灵活、简单易用——不过写PHP(或者任何这种语言)代码时,人们常常陷入单调重复而令人生厌的体力活动的窘境。而这正是PHP开发框架大显身手的地方。\\x0d\\x0a通过提供一个开发Web程序的基本架构,PHP开发框架把PHPW...

南城县18843628915: 如何framework层任意设置Android屏幕的旋转方向 -
琴春益中: 设备平放,屏幕朝正上方.以下四个常量分别代表:private static final int ROTATION_0 = 0;//初始情况.这个时候设备是横屏还是竖屏与硬件设备安装时默认的显示方向有关.private static final int ROTATION_90 = 1;//设置屏幕方向自动旋转...

南城县18843628915: 如何调试Android Framework -
琴春益中: 其实整个调试过程非常简单:在你要调试进程的合适位置打上断点 跟踪代码(Step in/out/over等等) 在展开讲述这两方面之前,有必要先简单了解下调试的基础知识.Java平台的调试是有一个规范化的标准的,那就是JPDA(Java Platform ...

南城县18843628915: CoreSurface.framework怎么使用
琴春益中: 微软的.NET Framework 4主要为用户提供了以下新功能和改进: *.NET Framework 4与 Framework 3.5 SP1并行工作.在旧版的Framework中可以运行的应用程序,将继续能够运行在.NET Framework 4上. *在Visual Basic和C #语言中有所创新...

南城县18843628915: Android的framework层是如何进行音量调整的 -
琴春益中: 因此,调整音量是通过AudioManager间接调用AudioService.adjustStreamVolume方法完成. 音量调整分为两步:先查看模式(Ring mode)是否需要调整,如果不需要调整模式,当前模式一定是正常模式(Normal mode),那就需要调整音量...

南城县18843628915: 如何从app层直接调用自己在framework层定义的函数 -
琴春益中: 编译带有资源的jar包,需要更改frameworks层,方法如下: 一.增加png类型的图片资源 1.将appupdate模块所有用到的png格式图片拷贝到framework/base/core/res/res/drawable-mdpi里.但是要确保没有与原生的没有重名文件.2.在framework/...

南城县18843628915: android 怎么调用framework层 -
琴春益中: :如何从app层直接调用自己在framework层定义的函数 编程语言函数App 分享到: ...从framework.jar中拷贝出android文件夹,从framework-res.apk拷贝出res文件夹,然后..

南城县18843628915: android怎么快速调试framework -
琴春益中: 这里先把代码再放出来 ZygoteInit.java [java] view plaincopy public static List readCommandOutput(String command) {Runtime rt =Runtime.getRuntime();java.lang.Processproc;try {proc =rt.exec(command); if (proc.waitFor() != 0) {return null;}...

南城县18843628915: tensorflow环境各种属性错误怎么解决 -
琴春益中: 1.出现的问题:tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable 运行sess.run()前要记得初始化所有的变量:init_op = tf.initialize_local_variables() sess.run(init_op)2.类似Cannot feed ...

南城县18843628915: ios怎么导入framework -
琴春益中: 1,打开项目的TARGETS2,选择Build Phases选项3,选择Link Binary With Libraries, 如下图4, 点击Link Binary With Libraries 左下角 + 号,弹出framework搜索框,如下图5,搜索或选择自己要添加的 framework, 点击右下角add即可,或点击add Other, 添加其他外部framework

南城县18843628915: 有人对Android的 Framework层进行过重新编译码?..我需要修改Framework层的一些东西 不知道怎么编译. -
琴春益中: 如果版本正确的话,可以重新new啊,看你修改的哪些文件了,但是重新new是肯定可以的,然后在build/target/product/***(项目脚本文件名,一般)/,目录下执行cp E* M* *.img *.bin,拷出来的东西就可以用烧写工具重新给真机烧系统了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网