真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android旋轉(zhuǎn),android旋轉(zhuǎn)屏幕命令

如何讓安卓手機判定屏幕旋轉(zhuǎn)90度 how to make android mobile phone to determine

在介紹之前,我們需要先了解默認(rèn)情況下android屏幕旋轉(zhuǎn)的機制:

站在用戶的角度思考問題,與客戶深入溝通,找到賓陽網(wǎng)站設(shè)計與賓陽網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋賓陽地區(qū)。

默認(rèn)情況下,當(dāng)用戶手機的重力感應(yīng)器打開后,旋轉(zhuǎn)屏幕方向,會導(dǎo)致當(dāng)前activity發(fā)生onDestroy- onCreate,這樣會重新構(gòu)造當(dāng)前activity和界面布局,如果在Camera界面,則表現(xiàn)為卡頓或者黑屏一段時間。如果是在橫豎屏UI設(shè)計方面,那么想很好地支持屏幕旋轉(zhuǎn),則建議在res中建立layout-land和layout-port兩個文件夾,把橫屏和豎屏的布局文件分別放入對應(yīng)的layout文件夾中。

了解了這些以后,我們對android的屏幕旋轉(zhuǎn)方法進(jìn)行如下總結(jié):

1. AndroidManifest.xml設(shè)置

如果單單想設(shè)置橫屏或者豎屏,那么只需要添加橫豎屏代碼:

android:screenOrientation="landscape"橫屏設(shè)置;

android:screenOrientation="portrait"豎屏設(shè)置;

這種方法的優(yōu)點:即使屏幕旋轉(zhuǎn),Activity也不會重新onCreate。

缺點:屏幕只有一個方向。

2. 代碼動態(tài)設(shè)置

如果你需要動態(tài)改變橫豎屏設(shè)置,那么,只需要在代碼中調(diào)用setRequestedOrientation()函數(shù):

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

//橫屏設(shè)置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

//豎屏設(shè)置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

//默認(rèn)設(shè)置

這種方法優(yōu)點:可以隨意動態(tài)設(shè)置,滿足我們?nèi)藶楦淖儥M豎屏的要求,同時滿足橫豎屏UI不同的設(shè)計需求;

缺點:如果改變設(shè)置,那么,Activity會被銷毀,重新構(gòu)建,即重新onCreate;

3. 重寫onConfigurationChanged

如果你不希望旋轉(zhuǎn)屏幕的時候Activity被不斷的onCreate(這種情況往往會造成屏幕切換時的卡頓),那么,可以使用此方法:

首先,在AndroidMainfest.xml中添加configChanges:

activity android:name=".Test"

android:configChanges="orientation|keyboard"

/activity

注意,keyboardHidden表示鍵盤輔助功能隱藏,如果你的開發(fā)API等級等于或高于13,還需要設(shè)置screenSize,因為screenSize會在屏幕旋轉(zhuǎn)時改變;

android:configChanges="keyboardHidden|orientation|screenSize"

然后,在Activity中重寫onConfigurationChanged方法,這個方法將會在屏幕旋轉(zhuǎn)變化時,進(jìn)行監(jiān)聽處理:

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

}

}

這個方法的優(yōu)點:我們可以隨時監(jiān)聽屏幕旋轉(zhuǎn)變化,并對應(yīng)做出相應(yīng)的操作;

缺點:它只能一次旋轉(zhuǎn)90度,如果一下子旋轉(zhuǎn)180度,onConfigurationChanged函數(shù)不會被調(diào)用。

4. 結(jié)合OrientationEventListener,自定義旋轉(zhuǎn)監(jiān)聽設(shè)置

如果你想更加完美,更加完全的掌控監(jiān)聽屏幕旋轉(zhuǎn)變化,比如,轉(zhuǎn)屏?xí)r不想重新onCreate,尤其是在Camera界面,不想出現(xiàn)旋轉(zhuǎn)preview時屏幕的卡頓、黑屏等問題,那么,可以嘗試:

首先,創(chuàng)建OrientationEventListener對象:

private OrientationEventListener mOrientationListener;

// screen orientation listener

private boolean mScreenProtrait = true;

private boolean mCurrentOrient = false;

然后,自定義屏幕變化回調(diào)接口

abstract protected void OrientationChanged(int orientation);

//screen orientation change event

最后,自定義監(jiān)聽類

private final void startOrientationChangeListener() {

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))||((rotation225)(rotation315))) {//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()中調(diào)用:

startOrientationChangeListener();

這個方法的優(yōu)點:你可以任意隨時準(zhǔn)確的監(jiān)聽屏幕旋轉(zhuǎn)變化的狀態(tài),可以隨時動態(tài)改變橫豎屏狀態(tài);

注:對于Camera來說,你可以設(shè)置初始化為橫屏或者豎屏,然后對外提供旋轉(zhuǎn)監(jiān)聽,這樣,既可以獲得屏幕旋轉(zhuǎn)狀態(tài),讓你做出相應(yīng)的操作,又不會出現(xiàn)重新onCreate當(dāng)前Activity造成的卡頓與短暫的黑屏切換。

Android 橫屏旋轉(zhuǎn)180°監(jiān)聽方式

橫屏180°旋轉(zhuǎn)系統(tǒng)不會回調(diào)到到 onConfigurationChanged() ,只能使用其他的方案,目前有2個方案

1、使用 OrientationEventListener 監(jiān)聽屏幕的旋轉(zhuǎn),里面本質(zhì)使用的是 TYPE_ACCELEROMETER 傳感器,具體如下:

開啟調(diào)用 mOrientationListener. enable() , 關(guān)閉調(diào)用 mOrientationListener. disable() ;這種方式對性能消耗比較大, 但是可以獲取到手機當(dāng)前的角度

2、使用監(jiān)聽 DisplayManager 方式,手機切換方向會導(dǎo)致UI 顯示的改變,所以會回調(diào)到這里

這種方式不會耗性能

如何在啟動時讓android系統(tǒng)屏幕旋轉(zhuǎn)90度

 設(shè)備平放,屏幕朝正上方。以下四個常量分別代表:

private static final int ROTATION_0 = 0;//初始情況。這個時候設(shè)備是橫屏還是豎屏與硬件設(shè)備安裝時默認(rèn)的顯示方向有關(guān)。

private static final int ROTATION_90 = 1;//設(shè)置屏幕方向自動旋轉(zhuǎn)后,右側(cè)翻起側(cè)立時,屏幕會旋轉(zhuǎn)到這個方向。

private static final int ROTATION_270 = 2;//設(shè)置屏幕方向自動旋轉(zhuǎn)后,左側(cè)翻起度側(cè)立時,屏幕會旋轉(zhuǎn)到這個方向。

private static final int ROTATION_180 = 3;//設(shè)置屏幕方向自動旋轉(zhuǎn)后,屏幕底部側(cè)立時,屏幕會旋轉(zhuǎn)到這個方向。

再看兩個數(shù)組:

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},

};

當(dāng)前屏幕旋轉(zhuǎn)方向為ROTATION_0時,取int[][] threshold=THRESHOLDS_WITH_180[0];

當(dāng)前屏幕旋轉(zhuǎn)方向為ROTATION_90時,取int[][] threshold=THRESHOLDS_WITH_180[1];

當(dāng)前屏幕旋轉(zhuǎn)方向為ROTATION_270時,取int[][] threshold=THRESHOLDS_WITH_180[2];

當(dāng)前屏幕旋轉(zhuǎn)方向為ROTATION_180時,取int[][] threshold=THRESHOLDS_WITH_180[3];

其中,threshold中的每一個元素由兩個值構(gòu)成,用來表示一個范圍。

WindowOrientationListener會注冊一個Accelerator類型的SensorEventListener,當(dāng)有新的SensorEvent產(chǎn)生時,調(diào)用filterOrientation產(chǎn)生一個int orientation值。這個值會在threshold的各個元素表示的范圍中匹配,看會落在哪個范圍。假設(shè)當(dāng)前屏幕方向為ROTATION_0,那么threshold={{60, 165}, {165, 195}, {195, 300}},假設(shè)這個時候把屏幕左側(cè)翻起90度。filterOrientation計算出的orientation值落在了第三個元素范圍內(nèi),那么去ROTATE_TO_WITH_180中尋找與它對應(yīng)的值,發(fā)現(xiàn)是ROTATION_270,那么就把當(dāng)前屏幕旋轉(zhuǎn)方向改變?yōu)?70度。threshold的取值就變成了THRESHOLDS_WITH_180[2]。當(dāng)把屏幕再次放平時,filterOrientation計算出的orientation值會落在第一個元素表示的范圍內(nèi)。去ROTATE_TO_WITH_180中尋找與它對應(yīng)的值,發(fā)現(xiàn)是ROTATION_0,那么當(dāng)前屏幕旋轉(zhuǎn)方向被改變?yōu)?度。

還有一個變量比較重要,mAllow180Rotation,這個變量設(shè)置為false時,就不使用THRESHOLDS_WITH_180和ROTATE_TO_WITH_180這一對數(shù)組來做上面這些變的了,就使用THRESHOLDS和ROTATE_TO。

其實,我研究了半天也沒有搞清filterOrientation的算法以及THRESHOLDS_WITH_180和THRESHOLDS這兩個數(shù)組里面的每個數(shù)字代表的具體意義。最后只搞清了上面的這個流程,還有ROTATION_0, ROTATION_90, ROTATION_270, ROTATION_180這四個角度分別代表哪四個方向。但這足以應(yīng)付我們要做的事情了。

比如,我想讓屏幕最多只旋轉(zhuǎn)90度和180度,不讓它有旋轉(zhuǎn)270度的機會。那就把ROTATE_TO_WITH_180里面的ROTATION_270全部變成90度。這樣,應(yīng)該旋轉(zhuǎn)到270度時,就會旋轉(zhuǎn)到90度了。如果不想讓屏幕旋轉(zhuǎn),把所有值都改成ROTATION_0就可以了。

再深入挖掘一下這個話題

PhonwWindowManager是唯一實現(xiàn)WindowOrientationListener接口的類,它管理著整個設(shè)備界面的顯示。當(dāng)PhonwWindowManager通過WindowOrientationListener知道屏幕方向發(fā)生旋轉(zhuǎn)時,會告訴WindowManagerService:

mWindowManager.setRotation(rotation, false, mFancyRotationAnimation);

而WindowManagerService得到這個通知后,會做兩個比較重要的事情:

1、Surface.setOrientation(0, rotation, animFlags);

2、mRotationWatchers.get(i).onRotationChanged(rotation);

我們知道,每個Activity都有一個View樹,每個View樹都是繪畫在一個Surface上面的。通過上面這兩步,先把Surface給旋轉(zhuǎn)了,再告訴Activity重新繪制View樹,就完了整個屏幕的旋轉(zhuǎn)。

android自動旋轉(zhuǎn)屏幕怎么設(shè)置

手機界面的自動旋轉(zhuǎn)可以到設(shè)置里面設(shè)置

但是有些播放器的自動旋轉(zhuǎn)是軟件控制的,也就是說你關(guān)了自動旋轉(zhuǎn),播放視頻的時候有些軟件之本身播放旋轉(zhuǎn)。

Android自定義控件之可平移、縮放、旋轉(zhuǎn)圖片控件

先上效果圖

源碼

單點拖動圖片對圖片進(jìn)行平移操作。雙手縮放圖片大小和旋轉(zhuǎn)圖片到一定的角度。圖片縮放的時候 不能大于最大的縮放因子和小于最小的縮放因子。大于最大縮放因子或者小于最小縮放因子需要對圖像進(jìn)行回彈。圖片旋轉(zhuǎn)的角度只能為90度的倍數(shù),不滿足90度要進(jìn)行回彈。圖片回彈要一個漸變的效果。

大體思路: 首先,Android中提供了Matrix類可以對圖像進(jìn)行處理。其次,要顯示一張圖片最容易想到的就是ImageView?;貜椧鬂u變的過程,可以通過屬性動畫進(jìn)行設(shè)置。所以大體的思路是:繼承ImageView,重寫onTouchEvent()方法,判斷事件類型,在對應(yīng)的事件使用Matrix對圖像進(jìn)行變換。

Matrix是一個已經(jīng)封裝好的矩陣,最重要的作用就是對坐標(biāo)點進(jìn)行變換。

舉個栗子:

1.某個點(x0,y0,1)通過單位矩陣E映射得到的點還是(x0,y0,1)。

3.點(x0,y0,1)通過矩陣T映射得到的點就會做如下的變換

可以看到點(x0,y0,1)經(jīng)過T矩陣在x軸方向上平移了dx,在y軸方向上平移了dy。

通過以上的變換可以得到具體的思路: 我們維護一個圖像對應(yīng)的矩陣mCurrentMatrix,該矩陣主要是對ImageView中的圖像的各個點進(jìn)行映射。ImageView在容器位置擺放完成之后,置mCurrentMatrix矩陣為單位矩陣。當(dāng)onTouchEvent()方法中觸發(fā)單點觸控并且手指進(jìn)行平移的時候,調(diào)用矩陣mCurrentMatrix的postTranslate(dx,dy),對mCurrentMatrix進(jìn)行變換。當(dāng)手指抬起,利用變換結(jié)束后的矩陣對圖像的各個點進(jìn)行映射,從而得到平移變換后的圖像。同理可得,在兩只手指進(jìn)行縮放旋轉(zhuǎn)的時候,我們對矩陣mCurrentMatrix進(jìn)行各種變換,當(dāng)縮放旋轉(zhuǎn)的事件結(jié)束再利用變換完的矩陣去映射圖像的各個點,從而得到縮放、旋轉(zhuǎn)后的圖像。

安卓自定義View進(jìn)階 - Matrix原理

安卓自定義View進(jìn)階 - Matrix詳解

首先理清事件的邏輯:

初始化圖像大小和位置

縮放圖像大小和控件大小自適應(yīng),平移圖像中心和控件中心重合

onTouchEvent()函數(shù)

平移操作

將圖像對應(yīng)的矩陣進(jìn)行變換。

縮放操作

mBoundRectF為記錄圖像邊界的矩形??s放的時候選取圖像的中心進(jìn)行縮放。

旋轉(zhuǎn)操作

旋轉(zhuǎn)的時候旋轉(zhuǎn)的旋轉(zhuǎn)中心也是圖像的中心

圖像中各個點的映射

調(diào)用ImageView的setImageMatrix(Matrix matrix)會讓ImageView根據(jù)設(shè)置的matrix去重新繪制圖像。

更新圖像的矩形邊界

獲得圖像的矩形,并根據(jù)矩陣映射矩形各個點的坐標(biāo)。

縮放回彈

旋轉(zhuǎn)回彈

一些計算方法

要求圖像的變換是一個漸變的過程,很容易想到的就是屬性動畫。因為屬性動畫本身就是對值進(jìn)行不斷set的過程。而我們維護的矩陣也是一個值,所以很自然可以想到,如果得到回彈之前的矩陣的值以及回彈之后矩陣的值,就可以根據(jù)動畫監(jiān)聽器中動畫當(dāng)前的系數(shù)值去改變矩陣的值。

對animator對象設(shè)置完監(jiān)聽器之后,就可以在手指抬起的時候調(diào)用屬性動畫的start()方法開啟動畫。

自定義可平移、縮放、旋轉(zhuǎn)的控件主要點有兩個方面:一是onTouchEvent()中判斷平移、旋轉(zhuǎn)、縮放的觸發(fā)條件,平移位移量、縮放比例因子、旋轉(zhuǎn)角度的計算。二是Matrix矩陣的應(yīng)用。


當(dāng)前名稱:android旋轉(zhuǎn),android旋轉(zhuǎn)屏幕命令
當(dāng)前地址:http://weahome.cn/article/dseieho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部