1.落笔缘由

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

2.具体实践

下面的代码是每调用一次就旋转90度,它是在Ac。

public class Test extends Activity implements OnClickListener {

private LinearLayout body = null;

private LinearLayout.LayoutParams params = null;

private LinearLayout innerBody = null;

private TextView tv = null;

private Button btn1 = null;

private SharedPreferences preferences = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initView();

setContentView(body);

preferences = getSharedPreferences("test",Context.MODE_PRIVATE);

Editor editor=preferences.edit();

editor.putFloat("degree", 0);

editor.commit();

}

private void initView() {

try {

body = new LinearLayout(this);

if (body != null) {

body.setOrientation(LinearLayout.VERTICAL);

params = new LayoutParams(LayoutParams.MATCH_PARENT,

LayoutParams.MATCH_PARENT);

if (params != null) {

body.setLayoutParams(params);

}

innerBody = new LinearLayout(this);

if (innerBody != null) {

innerBody.setOrientation(LinearLayout.VERTICAL);

params = new LayoutParams(LayoutParams.MATCH_PARENT,

LayoutParams.MATCH_PARENT);

if (params != null) {

innerBody.setLayoutParams(params);

}

body.addView(innerBody);

tv = new TextView(this);

if (tv != null) {

tv.setTextSize(40);

tv.setText("测试一下");

innerBody.addView(tv);

}

btn1 = new Button(this);

if (btn1 != null) {

btn1.setTextSize(40);

btn1.setText("Button1");

innerBody.addView(btn1);

btn1.setOnClickListener(this);

}

}

}

} catch (Exception e) {

}

}

/**

* 本来想通过Property Animation动画来实现旋转屏幕,但是发现有好多事情要处理。

* 例如旋转屏幕后,你要重新计算body的大小;还要注意当打开设置里的自动选择按钮后,当界面随平板旋转的时候,我们要重新设置保存在

* SharedPreferences里的值

* @param view

*/

private void animRoateScreen(View view)

{

float startDegree = 0;

if (preferences.getFloat("degree", 0)==0) {

startDegree = 90f;

}

else if (preferences.getFloat("degree", 0)==90f) {

startDegree = 180f;

}

else if (preferences.getFloat("degree", 0)==180f) {

startDegree = 270f;

}

else if (preferences.getFloat("degree", 0)==270f) {

startDegree = 0f;

}

Editor editor=preferences.edit();

editor.putFloat("degree", startDegree);

editor.commit();

ObjectAnimator animatorx = ObjectAnimator

.ofFloat(view, "rotation", startDegree,startDegree+90f);

animatorx.start();

}

/*

* 在一些特殊的情况中,你可能希望当一种或者多种配置改变时避免重新启动你的activity。你可以通过在manifest中设置android

* :configChanges属性来实现这点。

* 你可以在这里声明activity可以处理的任何配置改变,当这些配置改变时不会重新启动activity,而会调用activity的

* onConfigurationChanged

* (Resources.Configuration)方法。如果改变的配置中包含了你所无法处理的配置(在android

* :configChanges并未声明),

* 你的activity仍然要被重新启动,而onConfigurationChanged(Resources.

* Configuration)将不会被调用。

*

* 其次:android:configChanges=""中可以用的值:keyboard|mcc|mnc|locale|touchscreen|

* keyboardHidden|navigation|orientation…… Configuration

* 类中包含了很多种信息,例如系统字体大小,orientation,输入设备类型等等.(如上图)

* 比如:android:configChanges="orientation|keyboard|keyboardHidden"

*

*

* 1.需要在AndroidMenifast对应的Activity配置android:configChanges=

* "orientation|screenSize" 2.需要在AndroidMenifast配置权限

* android:name="android.permission.CHANGE_CONFIGURATION" >

*/

@Override

public void onConfigurationChanged(Configuration newConfig) {

super.onConfigurationChanged(newConfig);

Log.i("lgy", "onConfigurationChanged========");

if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {

} else {

}

}

private void rotationScreen(Context mContext) {

Activity activity = null;

if (mContext instanceof Activity) {

activity = (Activity) mContext;

}

if (0 == getDisplayRotation(activity)) {

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

} else if (90 == getDisplayRotation(activity)) {

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);

} else if (180 == getDisplayRotation(activity)) {

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);

} else if (270 == getDisplayRotation(activity)) {

activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

}

}

/**

* 获取当前屏幕旋转角度

*

* @param activity

* @return 0表示是竖屏; 90表示是左横屏; 180表示是反向竖屏; 270表示是右横屏

*/

private int getDisplayRotation(Activity activity) {

if (activity == null)

return 0;

int rotation = activity.getWindowManager().getDefaultDisplay()

.getRotation();

switch (rotation) {

case Surface.ROTATION_0:

return 0;

case Surface.ROTATION_90:

return 90;

case Surface.ROTATION_180:

return 180;

case Surface.ROTATION_270:

return 270;

}

return 0;

}

@Override

public void onClick(View v) {

if (v == btn1) {

// rotationScreen(this);

animRoateScreen(body);

}

}

}

3.总结

经过粗糙的研究,发现没那么简单实现,还是等到有时间或者有其他思路再研究。

4.参考文章

5.源码地址

android旋转屏幕 简册,[Android][旋转屏幕]相关推荐

  1. android自动登录简书,Android开发之简单登录界面

    用户界面基础 Android系统的四大组件分别是活动(Activity).服务(Service).广播接收器(Broadcast Receiver).内容提供器(Content Provider). ...

  2. android 读写文件 简书,Android 中的文件操作

    Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...

  3. android四大组件 简书,android四大组件

    android有四大组件,分别是Activity, Service(服务),Content Provider(内容提供者),BoadcastReceiver广播接收器. Activity 一个Acti ...

  4. android波浪动画简书,Android贝塞尔曲线————波浪效果(大波浪)

    Hello大家好,很高兴又一次与大家见面,今天是农历丁酉鸡年(大年初四),现在跟大家拜年有点晚,算是拜晚年,祝大家晚年幸福. 这么快大伙都到了晚年了,Android贝塞尔曲线我也准备以一个大波浪来结束 ...

  5. android运行过程简书,Android系统的启动流程

    Android系统有哪些进程 在Linux系统启动时,会读取init.rc,里面配置了一些需要启动的进程.注意:SystemServer进程不在init.rc里,因为SystemServer进程是由z ...

  6. android 开发环境简书,Android Studio 开发环境快速搭建

    目录 - 1.下载JDK.AS - 1.1 JDK下载 - 1.2 AS下载 - 1.3 百度云资源统一下载 - 2.安装JDK - 3.配置JDK及JAVA的环境 - 3.1 打开系统环境 - 3. ...

  7. android 辅助服务 简书,Android AccessibilityService使用

    测试demo主要使用了Android 的无障碍辅助服务(AccessibilityService),主要注意是 1. 开启服务,绑定目标app的监听(demo中根据包命绑定了体积计算的app),需要在 ...

  8. android 存储方式简书,Android的多种数据存储方式

    1. 简介 作为一个完整的应用程序,数据存储操作是必不可少的.现在Android的离线缓存就是通过网络良好状态时将从服务器收到的数据保存到本地.Android系统中主要提供了3种方式进行数据存储,分别 ...

  9. android权限适配 简书,Android动态权限适配

    最近APP里面要添加动态权限,网上找了不少例子并经过一定的测试,基本流程有了一定的认识,需要注意的地方记录下来以备以后查阅. 一 各大手机厂商的适配 依据各大手机Rom的不同表现,可以分为三种不同的模 ...

最新文章

  1. 利用UDEV服务解决RAC ASM存储设备名
  2. Android 开源框架Universal-Image-Loader学习
  3. [html] HTML5如何监听video的全屏和退出全屏?
  4. vue+filter过滤器(多参数)传参 - 代码篇
  5. 虚拟机安装菜鸟教程(2)——CentOS8系统安装 网络 时间配置
  6. 扬州打工人租房编年史
  7. python工资一般多少-Python工资一般是多少 看完吓你一跳
  8. 【bzoj3676】
  9. 在kali下对Windows 卷没有写权限的解决办法
  10. java点名程序界面设计_用Java语言编写一个班级点名的程序
  11. 折腾AX2012,安装成功,发帖庆祝
  12. NBU备份软件实施过程的注意事项
  13. matlab显示图像频谱
  14. linux 下载工具
  15. 13.56MHz 天线设计
  16. win10删除右键菜单的办法
  17. 云巡店php源码,云巡店™〡连锁版正式上线开放注册〡《系统使用手册 1.0》
  18. error converting to execution character set illegal byte sequence报错解决办法
  19. 由swr_get_delay想到的
  20. 【基础】Linux 常用操作

热门文章

  1. 飞秋2010下载在未来讲差异化
  2. ^_-诚征BLOG友情连接
  3. 对于我这个软妹子来说,为什么python编程课会越学越有趣呢?
  4. 再来一波不错的学习资源
  5. 官方:Angular 5 推迟到10月底发布
  6. 为什么链接oracle报错,PG连接Oracle报错解决
  7. 解决“Class org.apache.hadoop.hdfs.DistributedFileSystem not found“问题
  8. 送你一个在线机器学习网站,真香!
  9. [perl]perl界大牛唐凤传说
  10. ps眼睛糖果滤镜插件 - Alien Skin Eye Candy 7 for Mac