Android橫豎屏手動以及自動切換的實(shí)現(xiàn)

之前項(xiàng)目做攝像頭的采集視頻播放斥赋,里面有關(guān)于橫豎屏的顯示內(nèi)容缰猴,這里把實(shí)現(xiàn)的方法給大家展示出來。

首先創(chuàng)建橫豎屏監(jiān)聽類疤剑,需要傳入當(dāng)前activity滑绒,同時(shí)提供了傳入button來實(shí)現(xiàn)手動全屏和退出全屏的操作闷堡。

ScreenOrientationHelper監(jiān)聽類

public class ScreenOrientationHelper implements SensorEventListener {

private final static String TAG = ScreenOrientationHelper.class.getSimpleName();

private Activity mActivity;
private CheckTextButton mButton1, mButton2;
private int mOriginOrientation;
private Boolean mPortraitOrLandscape;

private SensorManager mSensorManager;
private Sensor[] mSensors;

private float[] mAccelerometerValues = new float[3];
private float[] mMagneticFieldValues = new float[3];

public ScreenOrientationHelper(Activity activity) {
    this(activity, null, null);
}

public ScreenOrientationHelper(Activity activity, CheckTextButton button) {
    this(activity, button, null);
}

public ScreenOrientationHelper(Activity activity, CheckTextButton button1, CheckTextButton button2) {
    mActivity = activity;
    mSensorManager = (SensorManager) mActivity.getSystemService(Context.SENSOR_SERVICE);

    mButton1 = button1;豎屏全屏按鈕
    if (mButton1 != null) {
        mButton1.setEnabled(false);
        mButton1.setToggleEnable(false);
        mButton1.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mSensors != null) {
                    if (mButton1.isChecked())
                        portrait();//豎屏
                    else
                        landscape();//橫屏
                }
            }
        });
    }

    mButton2 = button2;//橫屏全屏按鈕
    if (mButton2 != null) {
        mButton2.setToggleEnable(false);
        mButton2.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mSensors != null) {
                    if (mButton2.isChecked())
                        portrait();//豎屏
                    else
                        landscape();//橫屏
                }
            }
        });
    }
}

public void enableSensorOrientation() {
    if (mSensors == null) {
        mOriginOrientation = mActivity.getRequestedOrientation();

        mSensors = new Sensor[2];
        mSensors[0] = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensors[1] = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

        mSensorManager.registerListener(this, mSensors[0], SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mSensors[1], SensorManager.SENSOR_DELAY_NORMAL);
    }
    mButton1.setEnabled(true);
}

public void disableSensorOrientation(boolean reset) {
    if (mSensors != null) {
        mSensorManager.unregisterListener(this, mSensors[0]);
        mSensorManager.unregisterListener(this, mSensors[1]);
        mSensors = null;

        if (reset == true) {
            mActivity.setRequestedOrientation(mOriginOrientation);
        }
    }
    mButton1.setEnabled(false);
}

public void disableSensorOrientation() {
    disableSensorOrientation(true);
}

public void landscape() {
    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setButtonChecked(true);
    mPortraitOrLandscape = false;
}

public void portrait() {
    mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setButtonChecked(false);
    mPortraitOrLandscape = true;
}

public void setButtonChecked(boolean checked) {
    if (mButton1 != null)
        mButton1.setChecked(checked);

    if (mButton2 != null)
        mButton2.setChecked(checked);
}

public void postOnStart() {
    if (mSensors != null) {
        mSensorManager.registerListener(this, mSensors[0], SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mSensors[1], SensorManager.SENSOR_DELAY_NORMAL);
    }
}

public void postOnStop() {
    if (mSensors != null) {
        mSensorManager.unregisterListener(this, mSensors[0]);
        mSensorManager.unregisterListener(this, mSensors[1]);
    }
}

private void calculateOrientation() {
    float[] values = new float[3];
    float[] R = new float[9];

    SensorManager.getRotationMatrix(R, null, mAccelerometerValues, mMagneticFieldValues);
    SensorManager.getOrientation(R, values);

    if (mSensors != null) {
        if (mSensors[1] == null)
            calculateByAccelerometer(mAccelerometerValues);
        else
            calculateByOrientation(values);
    }
}

private void calculateByAccelerometer(float[] values) {
    int orientation = mActivity.getRequestedOrientation();

    if ((-2f < values[1] && values[1] <= 2f) && values[0] < 0) {// 向左
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setButtonChecked(true);
        }

        if (mPortraitOrLandscape != null && !mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if (4f < values[1] && values[1] < 10f) { // 向下
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                && (mPortraitOrLandscape == null || mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
            setButtonChecked(false);
        }

        if (mPortraitOrLandscape != null && mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if (-10f < values[1] && values[1] < -4f) { // 向上
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                && (mPortraitOrLandscape == null || mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            setButtonChecked(false);
        }

        if (mPortraitOrLandscape != null && mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if ((-2f < values[1] && values[1] <= 2f) && values[0] > 0) { // 向右
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE
                && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
            setButtonChecked(true);
        }

        if (mPortraitOrLandscape != null && !mPortraitOrLandscape)
            mPortraitOrLandscape = null;
    }
}

private void calculateByOrientation(float[] values) {
    values[0] = (float) Math.toDegrees(values[0]);
    values[1] = (float) Math.toDegrees(values[1]);
    values[2] = (float) Math.toDegrees(values[2]);

    int orientation = mActivity.getRequestedOrientation();

    if ((-10.0f < values[1] && values[1] <= 10f) && values[2] < -40f) {// 向左
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
                && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
            setButtonChecked(true);
        }

        if (mPortraitOrLandscape != null && !mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if (40.0f < values[1] && values[1] < 90.0f) { // 向下
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                && (mPortraitOrLandscape == null || mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
            setButtonChecked(false);
        }

        if (mPortraitOrLandscape != null && mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if (-90.0f < values[1] && values[1] < -40.0f) { // 向上
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                && (mPortraitOrLandscape == null || mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
            setButtonChecked(false);
        }

        if (mPortraitOrLandscape != null && mPortraitOrLandscape)
            mPortraitOrLandscape = null;

    } else if ((-10.0f < values[1] && values[1] <= 10f) && values[2] > 40f) { // 向右
        if (orientation != ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
                && (mPortraitOrLandscape == null || !mPortraitOrLandscape)) {
            mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);
            setButtonChecked(true);
        }

        if (mPortraitOrLandscape != null && !mPortraitOrLandscape)
            mPortraitOrLandscape = null;
    }
}

@Override
public void onSensorChanged(SensorEvent event) {
    switch (event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
            mMagneticFieldValues = event.values;
            break;

        case Sensor.TYPE_ACCELEROMETER:
            mAccelerometerValues = event.values;
            break;

        default:
            break;
    }

    calculateOrientation();
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}

具體的使用很簡單,貼上偽代碼如下疑故。

public class PlayVideoActivity extends Activity  {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    initData();
    initView();
}

   private void initView(){
    }

//初始化界面
private void initView() {
    setContentView(R.layout.xxxx);
    mScreenOrientationHelper = new ScreenOrientationHelper(this, mFullscreenButton, mFullscreenFullButton);
}

@Override
public void onBackPressed() {
    if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_PORTRAIT) {
        mScreenOrientationHelper.portrait();
        return;
    }
   
}
@Override
protected void onStart() {
    super.onStart();
    mScreenOrientationHelper.postOnStart();
}



@Override
protected void onStop() {
    super.onStop();
    mScreenOrientationHelper.postOnStop();
}



@Override
public void onConfigurationChanged(Configuration newConfig) {
    mOrientation = newConfig.orientation;
    onOrientationChanged();
    super.onConfigurationChanged(newConfig);
}
   private void onOrientationChanged() {
    //這里實(shí)現(xiàn)橫屏和豎屏的ui顯示杠览,隱藏和顯示你想要展現(xiàn)的布局即可,注意需要狀態(tài)欄以及布局的約束纵势。代碼就不寫了踱阿。
}

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钦铁,隨后出現(xiàn)的幾起案子软舌,更是在濱河造成了極大的恐慌,老刑警劉巖育瓜,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件葫隙,死亡現(xiàn)場離奇詭異,居然都是意外死亡躏仇,警方通過查閱死者的電腦和手機(jī)恋脚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焰手,“玉大人糟描,你說我怎么就攤上這事∈槠蓿” “怎么了船响?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長躲履。 經(jīng)常有香客問我见间,道長,這世上最難降的妖魔是什么工猜? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任米诉,我火速辦了婚禮,結(jié)果婚禮上篷帅,老公的妹妹穿的比我還像新娘史侣。我一直安慰自己,他們只是感情好魏身,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布惊橱。 她就那樣靜靜地躺著,像睡著了一般箭昵。 火紅的嫁衣襯著肌膚如雪税朴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音掉房,去河邊找鬼茧跋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛卓囚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诅病,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼哪亿,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贤笆?” 一聲冷哼從身側(cè)響起蝇棉,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芥永,沒想到半個(gè)月后篡殷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡埋涧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年板辽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棘催。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劲弦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醇坝,到底是詐尸還是另有隱情邑跪,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布呼猪,位于F島的核電站画畅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宋距。R本人自食惡果不足惜轴踱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乡革。 院中可真熱鬧寇僧,春花似錦、人聲如沸沸版。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽视粮。三九已至细办,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笑撞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工岛啸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茴肥。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓坚踩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瓤狐。 傳聞我的和親對象是個(gè)殘疾皇子瞬铸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件础锐、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 生命中除了父母至親之外嗓节,可以說最重要的一個(gè)人,他不僅幫助我順利的完成本科四年的學(xué)業(yè)皆警,而且拦宣,影響我了的人生,他告訴我...
    講不chu再見閱讀 899評論 1 2
  • 2016年8月1日周一 上午我和老公去區(qū)房屋交易所辦購房交易手續(xù)信姓,所以由 妹妹和老叔在醫(yī)院護(hù)理爸爸 鸵隧。這次買房的事...
    魅力春天閱讀 124評論 0 1
  • 一定要帶父母過來度一個(gè)周末,太美了财破!下次再見掰派!東臺黃海森林公園!下次再見左痢! 4號小木屋靡羡! 收拾心情!再次上路俊性!加油...
    愚樹心晴閱讀 280評論 0 0