一个良好的播放器应该能够很好地随着用户的视角而改变播放的角度,也就是说能够实现自动旋转。今天,费了好长时间才弄懂屏幕的自动旋转,现在来做个总结。

实现屏幕的手动旋转

在activity中有个方法,setRequestedOrientation,通过这个方法,可以改变屏幕的方向。里面可以设置的参数是有约束的,都在ActivityInfo这个类里面,先给出四个。
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
查一下这几个单词的意思REVERSE反向,LANDSCAPE景观(就是横屏啦,老外就喜欢这么玩),PORTRAIT肖像(就是竖屏了,想像一下挺符合意境的),那么
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE横屏
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT竖屏
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT横屏反向
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE竖屏反向(这个设置之后好像实现不了,不知道为啥)

若直接设置的话,在屏幕旋转之后,是会重新启动activity的,想要让它不重启的话,需要在Activity 的配置文件里添加属性: android:configChanges=”orientation|keyboardHidden|navigation”
可以在activity中重载onConfigurationChanged方法,根据不同旋转方向做其他动作,如下:

        @Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//更新屏幕布局,而不执行onCreate()方法            }

好了,来做个测试:
先来看布局文件,很简单,只有几个button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.gesturedetectortest.test.Main5Activity"><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/shang"android:text="上"/><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/xia"android:text="下"/><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/zuo"android:text="左"/><Button
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/you"android:text="右"/>
</LinearLayout>

再来看看代码:

public class Main5Activity extends AppCompatActivity implements View.OnClickListener{private Button shang,xia,zuo,you;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main5);initView();}private void initView() {shang = (Button) findViewById(R.id.shang);xia = (Button) findViewById(R.id.xia);zuo = (Button) findViewById(R.id.zuo);you = (Button) findViewById(R.id.you);shang.setOnClickListener(this);xia.setOnClickListener(this);zuo.setOnClickListener(this);you.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.shang:shangClick();break;case R.id.xia:xiaClick();break;case R.id.zuo:zuoClick();break;case R.id.you:youClick();break;}}private void shangClick(){this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}private void xiaClick(){this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}private void zuoClick(){this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);}private void youClick(){this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);}
}

很简单,有木有,只是那个ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE好像不起作用,不知道为啥。

实现屏幕的自动旋转

要实现屏幕的自动旋转,就需要使用加速度传感器了。
先来看看加速度传感器的使用:

   @Overrideprotected void onResume() {super.onResume();//传感器管理器sensorEventListener = new SensorEventListener(){@Overridepublic void onSensorChanged(SensorEvent event) {Log.i("---","---");//这儿就是加速度传感器产生的事件,我们需要对传感器变化后的处理逻辑需要写在这儿}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//注册传感器(sensor.TYPE_ORIENTATION(方向传感器);SENSOR_DELAY_GAME(20,000延时);// SENSOR_DELAY_GAME(20,000毫秒延迟)、SENSOR_DELAY_UI(60,000毫秒延迟)))sensorManager.registerListener(sensorEventListener,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);}@Overrideprotected void onDestroy() {super.onDestroy();sensorManager.unregisterListener(sensorEventListener);}

再来看一个对象,OrientationEventListener(方向事件监听),这个对象里面封装了对加速度传感器使用。

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main4);final TextView textView = (TextView) findViewById(R.id.textview);orientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {@Overridepublic void onOrientationChanged(int orientation) {textView.setText(orientation+"");//每次旋转屏幕就会产生一个值,在0-360之间的一个值,代表的我们屏幕的方向}};orientationEventListener.enable();}

想要的旋转屏幕的处理,只需要对抽象方法实现即可。
现在就差连接传感器事件与屏幕旋转了,这段代码我就不贴了,因为别人写的,我也没看懂,也就不好贴了。不过想要实现屏幕旋转的可以自己试着写一下,相信聪明的你是可以轻松实现的(就是对角度值的一些过滤,不会让它老是转屏就可以了),或者继续向下看。
前面说了四个setRequestedOrientation方法里面的参数,其实不止这么多。

ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED,//未指定,此为默认值。由Android系统自己选择合适的方向。

ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,//横屏

ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,//竖屏

ActivityInfo.SCREEN_ORIENTATION_USER,//用户当前的首选方向

ActivityInfo.SCREEN_ORIENTATION_BEHIND,//继承Activity堆栈中当前Activity下面的那个Activity的方向

ActivityInfo.SCREEN_ORIENTATION_SENSOR,//由物理感应器决定显示方向(测试时竖屏反向达不到效果)

ActivityInfo.SCREEN_ORIENTATION_NOSENSOR,//忽略物理感应器——即显示方向与物理感应器无关

ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE,//横屏会自动旋转
ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT,//竖屏会自动旋转(测试时达不到效果)
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE,//横屏相反
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT,//竖屏相反(测试时达不到效果)
ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR,//和SCREEN_ORIENTATION_SENSOR相似,不过这个四个方向都可以旋转

哈哈,其实自动屏幕旋转一句话就可以了setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR)有了这么多的参数,选择将会更多。至于前面的一些代码,明白就行,看看热闹,熟悉一些实现。

Android之随用户的角度旋转屏幕相关推荐

  1. android设置自动旋转屏幕,android怎样实现关闭系统自动旋转屏幕时能够自动横竖屏...

    android 系统关闭系统自动旋转屏幕情况下利用设备感应器(方向传感器)实现横竖屏切换 2.SensorManager sm=(SensorManager)getSystemService(SENS ...

  2. Android 简单跟踪重力传感器方向旋转屏幕framework的代码

    一.当旋转设备时候屏幕显示方向也改变,会打印下面的log,可以看到非常关键的一行log WindowOrientationListener: Proposed rotation changed! pr ...

  3. android某个活动全屏,android – 重新组合活动布局,以便在旋转屏幕时全屏播放视频...

    我终于找到了做到这一点的好方法. 在 Android文档中,指定当您需要处理修改(方向,键盘--)而不重新创建新Activity时,您应该通过覆盖Activity类的onConfigurationCh ...

  4. Xamarin.Android 开发中遇到旋转屏幕错误

    错误信息 : System.NotSupportedException: Unable to find the default constructor on type App5.MyFragment. ...

  5. Android 禁止屏幕旋转 旋转屏幕时保持Activity内容

    Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容 1.在应用中固定屏幕方向. 在AndroidManifest.xml的activity中加入:            an ...

  6. 让android程序根据重力感应旋转屏幕(支持4个方向旋转)

    最近公司在做一个软件,用户要求软件能随着手机转动自动切换横屏和竖屏,而且要求就算是手机头下脚上的倒个个软件也要能自适应的变成合适的方向.熟悉android的人都知道,android系统的手机绝大部分只 ...

  7. android 屏幕旋转不重新加载,Android webview旋转屏幕导致页面重新加载问题解决办法...

    Android webview旋转屏幕导致页面重新加载问题解决办法 1. 在create时候加个状态判断 protected void onCreate(Bundle savedInstanceSta ...

  8. android旋转屏幕 简册,[Android][旋转屏幕]

    1.落笔缘由 最近在研究旋转屏幕,网上可以找到资料,发现他们基本都是在Activity的基础上进行旋转.自己也想研究一下,能不能实现只旋转屏幕的内容,而不旋转屏幕上的菜单.例如,我点击屏幕上的按钮,页 ...

  9. 在Android的 设置-显示 中增加控制屏幕旋转方向的选项

    在Android的 设置->显示 中增加控制屏幕旋转方向的选项 参考博文 实现目标 效果局限 代码实现 配置资源文件 界面搭建 功能实现 默认值修改 其他情况 结语 参考博文 Android-x ...

最新文章

  1. DataGrid连接Access的快速分页法(1)——需求与现状
  2. 中国机器翻译的世纪回顾
  3. 树莓派slam_SLAM+语音机器人DIY系列:(五)树莓派3开发环境搭建——6.树莓派USB与tty串口号绑定...
  4. Spring Boot零散知识总结
  5. mysql55和57的区别_技术分享 | MySQL:count(*)、count(字段) 实现上区别
  6. java创建单线程计时器_我们如何在Java中实现计时器线程?
  7. 【LeetCode】4月2日打卡-Day18-矩阵操作
  8. listctrl 优化_上海SEO整站优化公司_新站整站快速排名优化
  9. eclipse启动时JDK环境变量报错
  10. cmd cvf war包
  11. [No000083]文件与文件夹操作
  12. angular-输入验证
  13. 20.go vet 和 go tool vet
  14. python随机抽号_Python基础:手把手以实例教你学随机数产生和字符/ASCII码转换
  15. 谷歌浏览器刷新快捷键
  16. python语言提供的数字类型有哪些_Python语言中数字类型有哪些?
  17. Python | 小白的 Asyncio 教程
  18. Codeforces Round #439 (Div. 2) E. The Untended Antiquity(二维BIT)
  19. IoT黑板报0112:谷歌关闭Titan无人机上网项目
  20. 几张趣图带你了解程序员眼中的世界

热门文章

  1. 声明式事务(Transactional)的工作原理
  2. Excel如何批量间隔删除指定行
  3. 如果改计算机用户密码,修改电脑密码(忘记了电脑管理员密码)
  4. 【学习资源】机器学习相关的数学参考资料
  5. Hadoop 压缩文件命令
  6. 贪吃小怪兽介绍之动画同步
  7. 网易云信联手LOOK直播,互动直播提升音乐人体验
  8. 耐压绝缘测试仪的校准规范
  9. 论文阅读 QA与QG联合学习
  10. Visual Studio调试报错-找不到dll文件的解决办法