[Android][旋转屏幕]

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配置权限<uses-permission
     * 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.参考文章

http://www.cnblogs.com/lijunamneg/archive/2013/03/26/2982461.html

5.源码地址

http://download.csdn.net/download/lgywsdy/9947941

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容