2008年7月1日 星期二

如何以程式的方式,旋轉 Android 螢幕

How to rotate Android screen using SDK API?

v0.9 beta 版本已經廢掉原先的 undocument API 作法

目前的作法如下:

不要忘記,還要在 Manifest.xml 中加上底下的敘述。

底下是原先的 undocument API 作法。

據說第一隻 Android 手機,內建了動作感應器,會偵測手機的垂直或水平位置,自動幫你旋轉螢幕。有自動旋轉是不錯啦,萬一感應器不靈,或壞掉。這時候,有手動旋轉的功能,也是聊勝於無。

要怎樣才能以程式的方式,來旋轉 Android 螢幕?

翻遍了 Android 的手冊,都找不到有 API 可以旋轉螢幕。後來總算在網路上,找到了底下這段旋轉螢幕的程式片段。

這 android.view.IWindowManager 到底是什麼東東,手冊裡都沒提到過。難不成這是個 undocument API?既然是 undocumented,到時在真的手機上會不會 work,在 Android 手機還沒出之前,現在誰也不知道。不過在模擬器上,倒是可以正確執行。

這是螢幕轉了90度的結果。

我覺得當你在寫一個,要在垂直或橫幅螢幕都可跑的程式時,這個功能還特別好用。因為 Android 的模擬器,非常地佔記憶體,不可能同時跑兩個不同螢幕轉向的模擬器。而要啟動一個新的模擬器,光看那左右跑的紅色小球,就足夠我喝完一杯咖啡。有了這個小程式,嘿,我終於可以隨時旋轉 Android 的螢幕,而不用重新啟動一個新的模擬器。

喔,不過還有個新問題。這螢幕是轉了,可是模擬器沒跟著轉,總不能叫我,跟著頭也轉 90 度地,一直 debug 下去。翻了一下 emulator 的 readme 檔案。好在,這模擬器有提供旋轉的功能。要順時鐘旋轉模擬器,按下右邊數字鍵盤的 9 鍵,按 7 鍵,則是逆時鐘旋轉模擬器。

底下是選轉螢幕,再加旋轉模擬器後的結果。

12 則留言:

samlu 提到...

這裡 有 Android Emulator 的各個功能鍵說明。

匿名 提到...

請問如果要禁止它自動旋轉呢 ?

samlu 提到...

要禁止旋轉,有很多方法,就簡單的是在 AndroidManifest.xml 的 Activity 上,額外加上一些屬性。

例如:
<activity android:name=".MyActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
andoid:configChanges="orientation|keyboardHidden" >

匿名 提到...

請問我在 AndroidManifest.xml 加上這兩行屬性
android:screenOrientation="portrait"
andoid:configChanges="orientation|keyboardHidden"

但是我將模擬器以橫置的方式開啟,我的程式畫面一樣是橫的,
有辦法使畫面永遠只能直立的嗎?(不隨著模擬器的方面變動) 謝謝您~

samlu 提到...

我不會有這現象,應該是你加錯了。

匿名 提到...

請問板主,android 是如何識別兩個 apk 是不是同一個程式的呢?

如果我想用一個專案,分別包出兩個apk檔,但這兩個apk在安裝時又不會互相覆蓋,有辦法達到嗎?

samlu 提到...

Android 是靠 package name 來判斷,應用程式是否相同。
那兩個 apk 檔,你只要能讓他 package name 不同即可。

匿名 提到...

剛剛貼完問題的那個下午就試出來了,答案跟老師說的一樣,老師英明 !!

我一直以為會像是 jar 那樣依據寫在 manifest 的設定去區別,至少也會寫在 AndroidManifest.xml 裡,結果卻是出乎意料的 package name,真是搞不懂啊....

GodzillaHaur's World 提到...

請問這個方法可以在SDK 1.6做到嗎?
如果不行, 有其他的方法可實現將整個系統轉向嗎?
謝謝.

匿名 提到...

老師您好,我跟一些朋友對android的系統很有興趣,現在正在摸索中,可是目前遇到一些奇怪的問題,我們將教學書中的示範光碟,匯入使用時,卻出現不能用的現象,她的錯誤訊息上出現以下文字"The import android cannot be resolved"
請問這是怎麼一回事啊?

匿名 提到...

如果要在Service呼叫旋轉的function,要如何呼叫呢?
想透過Service達到自動旋轉,而不是透過Activity..

samlu 提到...

"Service呼叫旋轉的function"? 這應該不行吧,除非你改底層,要不然只有 foreground activtity 可以呼叫旋轉的function

張貼留言