如何改变Activity的显示方向

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何改变Activity的显示方向相关的知识,希望对你有一定的参考价值。

参考技术A 本示例演示如何通过Activity了的setRequestedOrientation()方法来设定Activity的显示方向。
本示例在Eclipse上编译测试。
1. 定义清单文件(androidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="my.android.test"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".ScreenOrientation"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="9" />
</manifest>
2. 定义字符串资源(strings.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, ScreenOrientation!</string>
<string name="app_name">ScreenOrientation</string>
<string name="screen_orientation_summary">Demonstrates the available screen
orientation modes. Often you want to set the desired mode in your manifest
instead of programmatically.</string>
<string name="screen_orientation">Screen Orientation</string>
</resources>
3. 定义数组资源(arrays.xml)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 下列控件应用的数组资源 -->
<string-array name="screen_orientations">
<item>UNSPECIFIED</item>
<item>LANDSCAPE</item>
<item>PORTRAIT</item>
<item>USER</item>
<item>BEHIND</item>
<item>SENSOR</item>
<item>NOSENSOR</item>
<item>SENSOR_LANDSCAPE</item>
<item>SENSOR_PORTRAIT</item>
<item>REVERSE_LANDSCAPE</item>
<item>REVERSE_PORTRAIT</item>
<item>FULL_SENSOR</item>
</string-array>
</resources>
4. 定义布局资源(screen_orientation.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:padding="4dip"
android:gravity="center_horizontal"
android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0"
android:paddingBottom="4dip"
android:text="@string/screen_orientation_summary"/>
<Spinner android:id="@+id/orientation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawSelectorOnTop="true"
android:prompt="@string/screen_orientation">
</Spinner>
</LinearLayout>
5. 创建Activity类(ScreenOrientation.java)
package my.android.test;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.AdapterView.OnItemSelectedListener;

publicclass ScreenOrientation extends Activity
//Activity中的调整列表。
Spinner mOrientation;
/**
* 设定Activity主窗口的方向,数组中的方向会设定给R.attr类中的screenOrientation属性,
* screenOrientation的属性值必须是以下常量值。
* ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED:
* 不指定方向,让系统决定Activity的最佳方向。
* ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE:
* 希望Activity在横向屏上显示,也就是说横向的宽度要大于纵向的高度,并且忽略方向传感器的影响。
* ActivityInfo.SCREEN_ORIENTATION_PORTRAIT:
* 希望Activity在纵向屏上显示,也就是说纵向的高度要大于横向的宽度,并且忽略方向传感器的影响。
* ActivityInfo.SCREEN_ORIENTATION_USER:
* 使用用户设备的当前首选方向。
* ActivityInfo.SCREEN_ORIENTATION_BEHIND:
* 始终保持与屏幕一致的方向,不管这个Activity在前台还是后台。
* ActivityInfo.SCREEN_ORIENTATION_SENSOR:
* Activity的方向由物理方向传感器来决定,按照用户旋转设备的方向来显示。
* ActivityInfo.SCREEN_ORIENTATION_NOSENSOR:
* 始终忽略方向传感器的判断,当用户旋转设备时,显示不跟着旋转。
* ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE:
* 希望Activity在横向屏幕上显示,但是可以根据方向传感器指示的方向来进行改变。
* ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT:
* 希望Activity在纵向屏幕上显示,但是可以根据方向传感器指示的方向来进行改变。
* ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE:
* 希望Activity在横向屏幕上显示,但与正常的横向屏幕方向相反。
* ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT:
* 希望Activity在纵向屏幕上显示,但与正常的纵向屏幕方向相反
* ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR:
* Activity的方向由方向传感器来决定,显示会根据用户设备的移动情况来旋转。
*/
finalstaticintmOrientationValues[] = newint[]
ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED,
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE,
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT,
ActivityInfo.SCREEN_ORIENTATION_USER,
ActivityInfo.SCREEN_ORIENTATION_BEHIND,
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,
;

/** 首次创建本Activity时,调用这个方法 */
@Override
publicvoid onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//填充布局
setContentView(R.layout.screen_orientation);
//查找下拉控件
mOrientation = (Spinner)findViewById(R.id.orientation);
//引用数组资源,创建字符数组适配器
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.screen_orientations,android.R.layout.simple_spinner_item);
//把数组适配器与下拉控件关联
mOrientation.setAdapter(adapter);
//给下拉控件设置时间监听器
mOrientation.setOnItemSelectedListener(
/**
* 列表项目选择监听器
* onItemSelected:有项目选择时要执行这个回调。
* onNothingSelected:没有选择任何项目时执行这个回调。
*/
new OnItemSelectedListener()
publicvoid onItemSelected(AdapterView<?> parent, View view, int position, long id)
//设置Activity的方向选项
setRequestedOrientation(mOrientationValues[position]);

publicvoid onNothingSelected(AdapterView<?> parent)
//不特定指定方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

);

iOS 4.2 如何在方向改变时显示不同的图像?

【中文标题】iOS 4.2 如何在方向改变时显示不同的图像?【英文标题】:iOS 4.2 How to Display a different image on orientation change? 【发布时间】:2011-07-30 04:19:41 【问题描述】:

iOS4.2 当我的应用程序启动时,我会显示一个在我的 web 视图加载之前可见的图像。在 webview 加载后,该图像被设置为隐藏。如何执行以下操作: 如果是纵向,则显示 DefaultPortrait.png 如果是横向则显示 DefaultLandscape.png?

如果设备是纵向的,则显示

self.view.backgroundColor = [UIColor blackColor];
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"Default2.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];

如果设备是横向的,则显示

CGRect myImageRect = CGRectMake(0.0f, 0.0f, 480f, 320.0f);
myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"Default2L.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];

【问题讨论】:

试试我的方法。将 viewDidRotateMethod 放入您的代码中。每当设备旋转时都会调用此函数.. 【参考方案1】:

您可以使用didRotateFromInterfaceOrientation 来实现您的代码。现在,当方向将从纵向更改时,实现您想要在设备处于横向模式时显示的代码,反之亦然。希望它能解决你的问题。

    - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
    if ((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) 

        // your method for landscape..

    
    if ((fromInterfaceOrientation == UIInterfaceOrientationLandscapeRight) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) 

        //your method for portrait
    

【讨论】:

谢谢,我选择不做我原本打算做的事情。【参考方案2】:

您可以在开始时使用它来获取当前方向:

   UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation] 

然后使用这个:

 if ((currentOrientation == UIInterfaceOrientationPortrait) || (currentOrientation == UIInterfaceOrientationPortraitUpsideDown)) 
self.view.backgroundColor = [UIColor blackColor];
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"Default2.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];

    
   else if ((currentOrientation == UIInterfaceOrientationLandscapeRight) || (currentOrientation == UIInterfaceOrientationLandscapeLeft)) 
self.view.backgroundColor = [UIColor blackColor];
CGRect myImageRect = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"Default2.png"]];
myImage.opaque = YES; // explicitly opaque for performance
[self.view addSubview:myImage];
[myImage release];

【讨论】:

earthHappens.com/eHap.html 我将 myviewController .h .m 文件放在我的服务器上。我没有收到错误代码,但是当方向改变时我的图像没有改变。我被难住了 谢谢,我选择不做我原本打算做的事情。【参考方案3】:

如果您想在两种模式下显示相同的图像,那么首先您在应用程序委托文件中声明一个布尔类型变量并在应用程序委托 .m 文件中定义。 IF 纵向模式变量为 true,横向则为 false。现在在

_(void)viewDidLoad
              if (Boolean variable == TRUE )
                                         //display portrait mode 
                 else 
                      //display landscape mode

【讨论】:

2 张不同的图片 Default2.png 和 Default2L.png 纵向显示 Default2.png,横向显示 Default2L.png。 earthHappens.com/eHap.html 我将 myviewController .h .m 文件放在我的服务器上。我没有收到错误代码,但我的图像在方向发生变化时没有改变。我被难住了 在 app delegate.h 文件中你声明一个布尔类型变量,你检查你的设备是否可以检查方向变化 在 appdelegate.h 文件中声明为 Bool IsLandscape;在 app delegate.m 文件中你合成它。在旋转函数中,你定义为 if ((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) IsLandScape = False; if ((fromInterfaceOrientation == UIInterfaceOrientationLandscapeRight) || (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) IsLandScape=TRUE;

以上是关于如何改变Activity的显示方向的主要内容,如果未能解决你的问题,请参考以下文章

Android中Activity运行时屏幕方向与显示方式详解

Android旋转屏幕时阻止activity重建

屏幕方向 横竖屏切换

四大组件之Activity(上)——Activity的生命周期系统回收系统配置改变的影响

即使 Activity 已销毁,AsyncTask 也不会停止

十分钟掌握Activity的生命周期与启动模式