對android rotation的新增與定製

2021-07-04 00:15:16 字數 2417 閱讀 2912

在做android開發的過程中,我們難免會遇到顯示旋屏的需求,特別是在一些廣告機類的應用和產品中,旋屏是家常便飯。還是那句話,如果廠家的bsp夠完善,那麼做起來就很方便,只需修改一些引數就行。但如果廠家的bsp沒把這功能加上,做旋屏也夠你折騰一陣子了。一般把旋屏整合在bsp裡面的也只有消費類的廠家,做embedded的廠家的bsp相對沒有那麼完善。所以說做消費類的工程師難免不會有點嬌生慣養。我們有時間還是得有自己的鑽研。

說迴旋屏,在android原生系統上,有通過gsensor 判斷重力的方向,並旋轉螢幕的功能。但,如果我們想在出廠的時候把螢幕按照我們的需求旋轉到特定的位置,如90度,180度等。該怎麼辦。其中有乙個思路就是緣用gsensor這條通路,呼叫相應的api來實現。究竟這個想法能否實現,如果有興趣的話可以自行研究。這裡講的是另外一種方式。

說到rotation,很多人會聯想到在init.rc裡面設定的「ro.sf.hwrotation」的屬性。所以在這裡,我們善用系統的資源,利用這個「ro.sf.hwrotation」的屬性來實現rotation的定製。

總結來說,android裡面控制rotation的有三個位置,分別是:

framework/native/services/su***ceflinger/su***ceflinger.cpp

framework/native/ services/su***ceflinger/displaydevice.cpp

framework/base/services/input/inputreader.cpp

su***ceflinger.cpp和displaydevice.cpp是顯示相關的rotation,inputreader.cpp是跟input事件相關的rotation,如touch等。具體不詳細介紹。

這三個檔案裡面其實做的動作一樣,就是去讀取「ro.sf.hwrotation」的屬性值,然後分別對這三個檔案的:displayorientation,displayorientation,和hwrotation賦值。如inputreader.cpp的做法:

+ char hwrotbuf[property_value_max];

+ int32_t hwrotation = display_orientation_0;

+ if (property_get("ro.sf.hwrotation", hwrotbuf, null) > 0)

+ }

+ mdevicemode = device_mode_disabled;

return;

}+ newviewport.orientation = (newviewport.orientation + hwrotation) % 4;

} else

newviewport.setnondisplayviewport(rawwidth, rawheight);

+ newviewport.orientation = hwrotation;

}- if (mviewport != newviewport) {

+ bool viewportchanged = mviewport != newviewport;

+ if (viewportchanged) {

mviewport = newviewport;

- viewportchanged = true;

+// viewportchanged = true;

由於這三個檔案修改的內容大同小異,所以拿乙個檔案說明。

改完後,我們發現只需要在 init.rc 裡面修改「ro.sf.hwrotation」的值(0,90,180,270),就可以設定不同方向的輸出。不過這種修改的方法是在android動態logo才能生效。在uboot跟kernel的階段,如果需要,就修改平台的相應**,底層的**跟android層面上的有所區別,對於uboot跟kernel而言,就是要修改到具體的**處,把變數指定好。這裡不去分析,因為不同的平台修改的地方不一樣。

通過上面過程的修改,我們就可以實現在出廠的時候定製任意方向的rotation。但仔細一想,這種方式是有侷限性的,如果想改變輸出方向,就得重新燒錄系統。

於是我們想,怎樣去實現在apk層面去控制rotation的輸出,有一種思路就是分別在su***ceflinger.cpp ,displaydevice.cpp,inputreader.cpp裡面匯出相應的api,提供apk呼叫。這種做法,需要多framework熟悉的工程師來完成。寫應用不是本人的強項,所以在這裡就不獻醜了。所以在這裡,還有另一種實現方式。具體思路怎樣呢?我們看到,上面設定rotation的方法是圍繞乙個「ro.sf.hwrotation」來實現的。而「ro.sf.hwrotation」也只不過是在系統裡面定義的乙個屬性。這個屬性是可以變的,是可以被我們自由控制的。所以想到這裡,我們就可以從屬性方面作為切入點。說到這裡思路就很明確了,有興趣可以自行發散思維,不難。

對建立游標對理解

步驟 1 首先經過底層的 編寫已經建立起了了python和資料庫之間的溝通橋梁並封裝成了模組,通過pymysql下的conntent 方法與之建立起了連線,例項物件。pymysql.connect 方法返回的是connections模組下的connection 例項,connect 方法傳參就是在給...

對勾函式 對勾函式

對勾函式是一種類似於反比例函式的一般函式。所謂的對勾函式,是形如 f x ax b x 的函式,是 一種教材上沒有但考試老喜歡考的函式,所以更加要注意和學習。一般的函式影象形似兩個中心對稱的 對勾,故名。當x 0 時,f x ax b x 有最小值 這裡為了研究方便,規定a 0 b 0 也就是當 x...

一對多 多對一

pip install djangorestframework 3.9.2 pip install markdown 3.0.1 markdown support for the browsable api.pip install django filter 2.1.0 filtering supp...