android旋轉180度
Ⅰ 如何讓Android屏幕只能上下翻轉
讓安卓屏幕只能上下翻轉需要設置。
步驟為:
進入設置選項。
進入顯示選項。
勾選「自動旋轉屏幕」選項
在「旋轉模式」中勾選「0度」和「180度」選項
這樣就可以讓安卓屏幕只能上下翻轉了。
Ⅱ 如何讓安卓手機判定屏幕旋轉90度 how to make android mobile phone to determine
在介紹之前,我們需要先了解默認情況下android屏幕旋轉的機制:
默認情況下,當用戶手機的重力感應器打開後,旋轉屏幕方向,會導致當前activity發生onDestroy-> onCreate,這樣會重新構造當前activity和界面布局,如果在Camera界面,則表現為卡頓或者黑屏一段時間。如果是在橫豎屏UI設計方面,那麼想很好地支持屏幕旋轉,則建議在res中建立layout-land和layout-port兩個文件夾,把橫屏和豎屏的布局文件分別放入對應的layout文件夾中。
了解了這些以後,我們對android的屏幕旋轉方法進行如下總結:
1. AndroidManifest.xml設置
如果單單想設置橫屏或者豎屏,那麼只需要添加橫豎屏代碼:
android:screenOrientation="landscape"橫屏設置;
android:screenOrientation="portrait"豎屏設置;
這種方法的優點:即使屏幕旋轉,Activity也不會重新onCreate。
缺點:屏幕只有一個方向。
2. 代碼動態設置
如果你需要動態改變橫豎屏設置,那麼,只需要在代碼中調用setRequestedOrientation()函數:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//橫屏設置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//豎屏設置
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
//默認設置
這種方法優點:可以隨意動態設置,滿足我們人為改變橫豎屏的要求,同時滿足橫豎屏UI不同的設計需求;
缺點:如果改變設置,那麼,Activity會被銷毀,重新構建,即重新onCreate;
3. 重寫onConfigurationChanged
如果你不希望旋轉屏幕的時候Activity被不斷的onCreate(這種情況往往會造成屏幕切換時的卡頓),那麼,可以使用此方法:
首先,在AndroidMainfest.xml中添加configChanges:
<activity android:name=".Test"
android:configChanges="orientation|keyboard">
</activity>
注意,keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發API等級等於或高於13,還需要設置screenSize,因為screenSize會在屏幕旋轉時改變;
android:configChanges="keyboardHidden|orientation|screenSize"
然後,在Activity中重寫onConfigurationChanged方法,這個方法將會在屏幕旋轉變化時,進行監聽處理:
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stubsuper.onConfigurationChanged(newConfig);
if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
// Nothing need to be done here
} else {
// Nothing need to be done here
}
}
這個方法的優點:我們可以隨時監聽屏幕旋轉變化,並對應做出相應的操作;
缺點:它只能一次旋轉90度,如果一下子旋轉180度,onConfigurationChanged函數不會被調用。
4. 結合OrientationEventListener,自定義旋轉監聽設置
如果你想更加完美,更加完全的掌控監聽屏幕旋轉變化,比如,轉屏時不想重新onCreate,尤其是在Camera界面,不想出現旋轉preview時屏幕的卡頓、黑屏等問題,那麼,可以嘗試:
首先,創建OrientationEventListener對象:
private OrientationEventListener mOrientationListener;
// screen orientation listener
private boolean mScreenProtrait = true;
private boolean mCurrentOrient = false;
然後,自定義屏幕變化回調介面
abstract protected void OrientationChanged(int orientation);
//screen orientation change event
最後,自定義監聽類
private final void () {
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int rotation) {
if (((rotation >= 0) && (rotation <= 45)) || (rotation >= 315)||((rotation>=135)&&(rotation<=225))) {//portrait
mCurrentOrient = true;
if(mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Log.d(TAG, "Screen orientation changed from Landscape to Portrait!");
}
}
else if (((rotation > 45) && (rotation < 135))||((rotation>225)&&(rotation<315))) {//landscape
mCurrentOrient = false;
if(mCurrentOrient!=mScreenProtrait)
{
mScreenProtrait = mCurrentOrient;
OrientationChanged(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
Log.d(TAG, "Screen orientation changed from Portrait to Landscape!");
}
}
}
};
mOrientationListener.enable();
}
在onCreate()中調用:
();
這個方法的優點:你可以任意隨時准確的監聽屏幕旋轉變化的狀態,可以隨時動態改變橫豎屏狀態;
註:對於Camera來說,你可以設置初始化為橫屏或者豎屏,然後對外提供旋轉監聽,這樣,既可以獲得屏幕旋轉狀態,讓你做出相應的操作,又不會出現重新onCreate當前Activity造成的卡頓與短暫的黑屏切換。
Ⅲ 如何使控制項或者layout旋轉180度
控制項旋轉:將android:rotation="180"寫在layout下的.xml文件中對應的控制項里
layout旋轉:將android:screenOrientation="landscape"寫在AndroidManifest.xml文件中對應的Activity里
Ⅳ android開發中如何旋轉布局
樓主你好,這個可以通過動畫來達到這個效果的,代碼如下:
只要把您的layout對象傳進去就行了
public void showAnimation(View mView)
{
final float centerX = mView.getWidth() / 2.0f;
final float centerY = mView.getHeight() / 2.0f;
//這個是設置需要旋轉的角度,我設置的是180度
RotateAnimation rotateAnimation = new RotateAnimation(0, 180, centerX,
centerY);
//這個是設置通話時間的
rotateAnimation.setDuration(1000*3);
rotateAnimation.setFillAfter(true);
mView.startAnimation(rotateAnimation);
}
Ⅳ 有什麼軟體可以讓安卓手機屏幕旋轉180度的求大神啊●^●
你好,沒有的。現在是有一些這樣的手機,但是那是手機里自帶的重力感應裝置比較好,現在好多手機還沒有這么好
-- 猴島游戲論壇為您解答
Ⅵ 如何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中的每一個元素由兩個值構成,用來表示一個范圍。
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樹,就完了整個屏幕的旋轉。
Ⅶ 請問安卓系統玩游戲時怎樣旋轉屏幕我是用安卓模擬器在電腦模擬的!
android 屏幕旋轉 屏是LANDSCAPE的,要讓它默認顯示為PORTRAIT. 1.kernel里要旋轉FrameBuffer. 啟動參數里加入fbcon=rotate:1 (0:正常屏; 1:順時鍾轉90度; 2:轉180度; 3:順時鍾轉270度;) 最後生成的autoconf.h里有類似項: #define CONFIG_CMDLINE "console=ttySAC0,115200 fbcon=rotate:1" 此項的解析在$(kernel)/drivers/video/console/fbcon.c static int __init fb_console_setup(char *this_opt); 只是去初始化變數initial_rotation,然後initial_rotation會傳遞給其他需要的結構。 注意:參考$(kernel)/documentation/fb/fbcon.txt 2.android OS旋轉屏幕 系統默認是針對豎屏的,而MID使用的是橫屏,所以需要做一個轉換的動作。 PORTRAIT LANDSCAPE <------屏幕顯示方式 ROTATION_0 ROTATION_90 ROTATION_90 ROTATION_180 ROTATION_180 ROTATION_270 ROTATION_270 ROTATION_0 而source code里對ROTATION_180和ROTATION_270的處理比較少,只在sensor和KeyQueue部分,所以如果只是要讓系統顯示為豎屏,將android中的Surface.ROTATION_0改為Surface.ROTATION_90,而Surface.ROTATION_90改為Surface.ROTATION_0。 這樣,啟動後的屏幕就是豎屏的了。 改動後,啟動時還是LANDSCAPE顯示的,進入HOME也是,很快就會自動旋轉到PORTRAIT模式,這是由於 $(cupcake)/frameworks/base/services/java/com/android/server/WindowManagerService.java 中enableScreenAfterBoot()->performEnableScreen()->mPolicy.enableScreenAfterBoot(), mPolicy為父類指針,可以指向 PhoneWindowManager或者MidWindowManager,由配置文件$(cupcake)/build/target/proct/core.mk中 PRODUCT_POLICY := android.policy_phone //PRODUCT_POLICY := android.policy_mid 來指定。 PhoneWindowManager::enableScreenAfterBoot()->updateRotation(Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE)->mWindowManager.setRotation()完成設置旋轉並清除LOGO. 3.啟動過程中豎屏 啟動過程中,默認是按照屏的width和height顯示的,不會旋轉,要使它顯示logo時就是豎屏的,也就是旋轉90度,需要做如下工作: $(cupcake)/frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp status_t SurfaceFlinger::readyToRun()中 //const uint32_t w = hw.getWidth(); //const uint32_t h = hw.getHeight(); //swap w&h for portrait display in landscape panel. jeff. const uint32_t h = hw.getWidth(); const uint32_t w = hw.getHeight(); 交換一下width和height,這樣後面用OpenGL創建的ViewPort形狀就是豎的了。修改後面的函數參數也可以,不過太多了,交換一下省事。但是怎麼讓這個豎的viewport旋轉90度呢?這里就要用到GraphicPlane::mGlobalTransform這個Transform了。它指示當前最終要旋轉的結果。 所以要在創建GraphicPlane時初始化mGlobalTransform為旋轉90度。 GraphicPlane::GraphicPlane() : mHw(0) { //add by jeff. for default rotate angel 90 mOrientationTransform.reset(); mOrientation = ISurfaceComposer::eOrientation90; mGlobalTransform = mOrientationTransform * mTransform; } 此段從status_t GraphicPlane::setOrientation(int orientation)復制過來,注意修改mGlobalTransform: if (orientation == ISurfaceComposer::eOrientation90) { //ISurfaceComposer::eOrientationDefault //jeff // make sure the default orientation is optimal mOrientationTransform.reset(); mOrientation = orientation; //mGlobalTransform = mTransform; mGlobalTransform = mOrientationTransform * mTransform; //jeff return NO_ERROR; } 注意mOrientationTransform.reset();要修改為默認旋轉90度。參照status_t GraphicPlane::orientationToTransfrom 中的設置,修改為: void Transform::reset() { mTransform.reset(); mType = 0; set(0,-1,1,0); //jeff set(800,0); } 參考: status_t GraphicPlane::orientationToTransfrom( int orientation, int w, int h, Transform* tr) { float a, b, c, d, x, y; switch (orientation) { case ISurfaceComposer::eOrientationDefault: a=1; b=0; c=0; d=1; x=0; y=0; break; case ISurfaceComposer::eOrientation90: a=0; b=-1; c=1; d=0; x=w; y=0; break; case ISurfaceComposer::eOrientation180: a=-1; b=0; c=0; d=-1; x=w; y=h; break; case ISurfaceComposer::eOrientation270: a=0; b=1; c=-1; d=0; x=0; y=h; break; default: return BAD_VALUE; } tr->set(a, b, c, d); tr->set(x, y); return NO_ERROR; } 修改之後,默認就是豎屏(旋轉90度)顯示了。