Android編程基于重力傳感器實現(xiàn)橫豎屏放向切換功能
本文實例講述了Android編程基于重力傳感器實現(xiàn)橫豎屏放向切換功能。分享給大家供大家參考,具體如下:
最近項目中用到了vr視頻播放,因為自己實現(xiàn),同時要實現(xiàn)橫豎屏自動切換屏幕,核心代碼如下:
package com.d1ev.touch.App.helper;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.util.Log;
import android.view.OrientationEventListener;
import java.lang.ref.WeakReference;
/**
* Created by Administrator on 2016/12/3 0003.
* 監(jiān)聽重力系統(tǒng)傳感器的變化,為Vr視頻播放器而定制
*/
public class MySensorHelper {
private static final String TAG = MySensorHelper.class.getSimpleName();
private OrientationEventListener mLandOrientationListener;
private OrientationEventListener mPortOrientationListener;
private WeakReference<Activity> mActivityWeakRef;
private boolean isPortLock = false;
private boolean isLandLock=false;
public MySensorHelper(final Activity activity) {
this.mActivityWeakRef = new WeakReference(activity);
this.mLandOrientationListener = new OrientationEventListener(activity, 3) {
public void onOrientationChanged(int orientation) {
Log.d(MySensorHelper.TAG, "mLandOrientationListener");
if(orientation < 100 && orientation > 80 || orientation < 280 && orientation > 260) {
Log.e(MySensorHelper.TAG, "轉(zhuǎn)到了橫屏");
if(!MySensorHelper.this.isLandLock) {
Activity mActivity = (Activity)MySensorHelper.this.mActivityWeakRef.get();
if(mActivity != null) {
Log.e(MySensorHelper.TAG, "轉(zhuǎn)到了橫屏##################");
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
isLandLock=true;
isPortLock=false;
}
}
}
}
};
this.mPortOrientationListener = new OrientationEventListener(activity, 3) {
public void onOrientationChanged(int orientation) {
Log.w(MySensorHelper.TAG, "mPortOrientationListener");
if(orientation < 10 || orientation > 350 || orientation < 190 && orientation > 170) {
Log.e(MySensorHelper.TAG, "轉(zhuǎn)到了豎屏");
if(!MySensorHelper.this.isPortLock) {
Activity mActivity = (Activity)MySensorHelper.this.mActivityWeakRef.get();
if(mActivity != null) {
Log.e(MySensorHelper.TAG, "轉(zhuǎn)到了豎屏!!!!!!!!!!!!!!!!!!!!!!");
mActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
isPortLock=true;
isLandLock=false;
}
}
}
}
};
//this.disable();
}
//禁用切換屏幕的開關(guān)
public void disable() {
Log.e(TAG, "disable");
this.mPortOrientationListener.disable();
this.mLandOrientationListener.disable();
}
//開啟橫豎屏切換的開關(guān)
public void enable(){
this.mPortOrientationListener.enable();
this.mLandOrientationListener.enable();
}
//設(shè)置豎屏是否上鎖,true鎖定屏幕,fanle解鎖
public void setPortLock(boolean lockFlag) {
this.isPortLock = lockFlag;
}
//設(shè)置橫屏是否鎖定,true鎖定,false解鎖
public void setLandLock(boolean isLandLock){
this.isLandLock=isLandLock;
}
}
使用時將當前activity對象傳過來即可,但要在activity的ondestory()方法里面或者back鍵的監(jiān)聽里面禁用屏幕監(jiān)聽,否則會造成activity不能被回收而導(dǎo)致內(nèi)存泄漏
helper.disable();
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)入門與進階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
相關(guān)文章
Android AutoCompleteTextView連接數(shù)據(jù)庫自動提示的方法(附demo源碼下載)
這篇文章主要介紹了Android AutoCompleteTextView連接數(shù)據(jù)庫自動提示的方法,結(jié)合實例形式分析了AutoCompleteTextView操作數(shù)據(jù)庫的原理與具體技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-02-02
Android?RecyclerChart其它圖表繪制示例詳解
這篇文章主要為大家介紹了Android?RecyclerChart其它圖表繪制示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12
Android網(wǎng)絡(luò)訪問之Retrofit使用教程
Retrofit?是一個?RESTful?的?HTTP?網(wǎng)絡(luò)請求框架的封裝,網(wǎng)絡(luò)請求的工作本質(zhì)上是?OkHttp?完成,而?Retrofit?僅負責?網(wǎng)絡(luò)請求接口的封裝2022-12-12
Android編程之利用服務(wù)實現(xiàn)電話監(jiān)聽的方法
這篇文章主要介紹了Android編程之利用服務(wù)實現(xiàn)電話監(jiān)聽的方法,較為詳細的分析了Android基于服務(wù)實現(xiàn)針對電話監(jiān)聽的具體步驟與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2015-11-11
Android 監(jiān)聽應(yīng)用前/后臺切換實例代碼
本篇文章主要介紹了Android 監(jiān)聽應(yīng)用前/后臺切換實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Android中使用LayoutInflater要注意的一些坑
LayoutInflater類在我們?nèi)粘i_發(fā)中經(jīng)常會用到,最近在使用中就遇到了一些問題,所有下面這篇文章主要給大家總結(jié)了關(guān)于Android中使用LayoutInflater要注意的一些坑,希望通過這篇能讓大家避免走一些彎路,需要的朋友可以參考學(xué)習(xí),下面來一起看吧。2017-04-04

