Android 获取手机方向,但将屏幕方向固定为纵向
我想得到手机方向,但保持屏幕方向为纵向。 因此,无论用户将手机切换到横向还是纵向,视图都保持不变,但我可以知道它是切换到横向还是纵向 将活动设置为android:screenOrientation=“肖像”将修复这两个问题,但我将无法通过Android 获取手机方向,但将屏幕方向固定为纵向,android,screen-orientation,orientation-changes,Android,Screen Orientation,Orientation Changes,我想得到手机方向,但保持屏幕方向为纵向。 因此,无论用户将手机切换到横向还是纵向,视图都保持不变,但我可以知道它是切换到横向还是纵向 将活动设置为android:screenOrientation=“肖像”将修复这两个问题,但我将无法通过 public void onConfigurationChanged(Configuration newConfig) { switch (newConfig.orientation) { case Configuration.ORIENTAT
public void onConfigurationChanged(Configuration newConfig) {
switch (newConfig.orientation) {
case Configuration.ORIENTATION_PORTRAIT:
Toast.makeText(this, "Portrait", Toast.LENGTH_SHORT).show();
break;
case Configuration.ORIENTATION_LANDSCAPE:
Toast.makeText(this, "Landscape", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
有人知道如何解决这个问题吗?进入您想要在该活动的清单文件中设置的内容
android:configChanges="orientation|keyboardHidden"
然后,当用户旋转手机时,OnConfiguration Changed()方法将进入公共空间。
也删除
android:screenOrientation="portrait"
来自同一活动。加速计能否满足您的要求?如果是这样的话,也许像这样的(未经测试的)片段会适合您的目的
SensorManager sensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
sensorManager.registerListener(new SensorEventListener() {
int orientation=-1;;
@Override
public void onSensorChanged(SensorEvent event) {
if (event.values[1]<6.5 && event.values[1]>-6.5) {
if (orientation!=1) {
Log.d("Sensor", "Landscape");
}
orientation=1;
} else {
if (orientation!=0) {
Log.d("Sensor", "Portrait");
}
orientation=0;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
}, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
SensorManager SensorManager=(SensorManager)this.getSystemService(Context.SENSOR\u SERVICE);
sensorManager.registerListener(新的SensorEventListener(){
int方向=-1;;
@凌驾
传感器更改时的公共无效(传感器事件){
if(事件值[1]-6.5){
如果(方向!=1){
Log.d(“传感器”、“景观”);
}
方向=1;
}否则{
如果(方向!=0){
Log.d(“传感器”、“纵向”);
}
方向=0;
}
}
@凌驾
精度更改时的公共无效(传感器,int精度){
//TODO自动生成的方法存根
}
},sensorManager.getDefaultSensor(Sensor.TYPE\u加速计),sensorManager.Sensor\u DELAY\u游戏);
如果禁用屏幕方向更改,则显然不会调用OnConfiguration Changed
我认为唯一的方法是使用加速计传感器,请检查。这里有一个多用途类,用于轻松管理屏幕方向的变化:
public class OrientationManager extends OrientationEventListener {
public enum ScreenOrientation {
REVERSED_LANDSCAPE, LANDSCAPE, PORTRAIT, REVERSED_PORTRAIT
}
public ScreenOrientation screenOrientation;
private OrientationListener listener;
public OrientationManager(Context context, int rate, OrientationListener listener) {
super(context, rate);
setListener(listener);
}
public OrientationManager(Context context, int rate) {
super(context, rate);
}
public OrientationManager(Context context) {
super(context);
}
@Override
public void onOrientationChanged(int orientation) {
if (orientation == -1){
return;
}
ScreenOrientation newOrientation;
if (orientation >= 60 && orientation <= 140){
newOrientation = ScreenOrientation.REVERSED_LANDSCAPE;
} else if (orientation >= 140 && orientation <= 220) {
newOrientation = ScreenOrientation.REVERSED_PORTRAIT;
} else if (orientation >= 220 && orientation <= 300) {
newOrientation = ScreenOrientation.LANDSCAPE;
} else {
newOrientation = ScreenOrientation.PORTRAIT;
}
if(newOrientation != screenOrientation){
screenOrientation = newOrientation;
if(listener != null){
listener.onOrientationChange(screenOrientation);
}
}
}
public void setListener(OrientationListener listener){
this.listener = listener;
}
public ScreenOrientation getScreenOrientation(){
return screenOrientation;
}
public interface OrientationListener {
public void onOrientationChange(ScreenOrientation screenOrientation);
}
}
如果任何人都在寻找解决这个问题的Webview/javascript解决方案,下面的代码可以做到这一点 这将触发窗口上的自定义“翻转”事件,并使用jquery中的“额外参数”。它还设置window.flip,类似于window.orientation:
$(window).on('flip',function(ev,angle,orientation) {
console.log(angle,orientation);
alert(window.flip);
});
if(window.DeviceOrientationEvent){
jQuery.flip={
调试:错误,
间隔时间:1000,
勾选:假,
贝塔弗拉特:25,
甘玛弗拉特:45,
方向:“纵向主”,
角度:{
“纵向主”:0,
“肖像次要”:0,
「景观小学」:90,
「景观中学」:-90
},
计时器:空,
检查:功能(ev){
如果(!this.checked){
var触发器=false;
if(this.debug)console.log([ev.alpha,ev.beta,ev.gamma]);
如果(ev.beta>this.betaflat){
//如果beta是大的,它的肖像
if(this.debug)console.log('beta-trait-pri');
if(this.orientation!=“纵向主方向”){
这个方向是“纵向主”;
触发器=真;
}
}否则如果(ev.betathis.gammaflat){
//否则,如果伽马是大的,它的景观
if(this.debug)console.log('gamma-landscape-pri');
if(this.orientation!='scape-primary'){
这个方向是“景观-小学”;
触发器=真;
}
}否则,如果(ev.gamma我需要一个解决方案,该解决方案只能按需为我提供方向。这个解决方案对我有效:
public class SensorOrientationChecker {
public final String TAG = getClass().getSimpleName();
int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;
private static SensorOrientationChecker mInstance;
public static SensorOrientationChecker getInstance() {
if (mInstance == null)
mInstance = new SensorOrientationChecker();
return mInstance;
}
private SensorOrientationChecker() {
mSensorEventListener = new Listener();
Context applicationContext = GlobalData.getInstance().getContext();
mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);
}
/**
* Call on activity onResume()
*/
public void onResume() {
mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
/**
* Call on activity onPause()
*/
public void onPause() {
mSensorManager.unregisterListener(mSensorEventListener);
}
private class Listener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
if (x<5 && x>-5 && y > 5)
mOrientation = 0;
else if (x<-5 && y<5 && y>-5)
mOrientation = 90;
else if (x<5 && x>-5 && y<-5)
mOrientation = 180;
else if (x>5 && y<5 && y>-5)
mOrientation = 270;
//Log.e(TAG,"mOrientation="+mOrientation+" ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
public int getOrientation(){
return mOrientation;
}
}
公共类传感器方向检查器{
公共最终字符串标记=getClass().getSimpleName();
内禀赋=0;
私有SensorEventListener mssensoreventlistener;
私人传感器管理器;
专用静态传感器方向检查器;
公共静态SensorOrientationChecker getInstance(){
if(minInstance==null)
MinInstance=新传感器方向检查器();
回报率;
}
私有传感器方向检查器(){
msSensorEventListener=新建侦听器();
Context applicationContext=GlobalData.getInstance().getContext();
MSSensorManager=(SensorManager)applicationContext.getSystemService(Context.SENSOR\u服务);
}
/**
*调用活动onResume()
*/
恢复时公开作废(){
msSensorManager.registerListener(msSensorEventListener、msSensorManager.getDefaultSensor(传感器类型\加速计)、SensorManager.Sensor\延迟\正常);
}
/**
*调用活动onPause()
*/
公共无效暂停(){
mSensorManager.unregisterListener(mSensorEventListener);
}
私有类侦听器实现SensorEventListener{
@凌驾
传感器更改时的公共无效(传感器事件){
float x=事件值[0];
浮动y=事件值[1];
如果(x-5&&y>5)
Morentation=0;
否则,如果(x这比编写一个全新的类要简单得多:
final OrientationEventListener orientationEventListener = new OrientationEventListener( getApplicationContext() ) {
@Override
public void onOrientationChanged( final int orientation ) {
Log.i("", "orientation = " + orientation );
}
};
orientationEventListener.enable();
但是如果OnConfiguration更改()被称为方向改变已经执行…我需要之前的信息。嗨,Phillip。这是我自己实现的同一个解决方案。在这种情况下,似乎没有其他选项可以访问传感器以获得设备的方向。如果设备平放在桌子上,这没有多大价值。有人知道k吗现在如何检测反向风景?这会消耗太多电池吗?太好了,非常感谢。难以置信这个答案只获得了一票。这是一个很好的解决方案,但请注意,这只会在以肖像模式为默认模式的智能手机上给出正确的结果。在平板电脑上(以风景为默认模式),在横向方向的情况下,方向的值为0,即必须将270添加到ori
public class SensorOrientationChecker {
public final String TAG = getClass().getSimpleName();
int mOrientation = 0;
private SensorEventListener mSensorEventListener;
private SensorManager mSensorManager;
private static SensorOrientationChecker mInstance;
public static SensorOrientationChecker getInstance() {
if (mInstance == null)
mInstance = new SensorOrientationChecker();
return mInstance;
}
private SensorOrientationChecker() {
mSensorEventListener = new Listener();
Context applicationContext = GlobalData.getInstance().getContext();
mSensorManager = (SensorManager) applicationContext.getSystemService(Context.SENSOR_SERVICE);
}
/**
* Call on activity onResume()
*/
public void onResume() {
mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
/**
* Call on activity onPause()
*/
public void onPause() {
mSensorManager.unregisterListener(mSensorEventListener);
}
private class Listener implements SensorEventListener {
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
if (x<5 && x>-5 && y > 5)
mOrientation = 0;
else if (x<-5 && y<5 && y>-5)
mOrientation = 90;
else if (x<5 && x>-5 && y<-5)
mOrientation = 180;
else if (x>5 && y<5 && y>-5)
mOrientation = 270;
//Log.e(TAG,"mOrientation="+mOrientation+" ["+event.values[0]+","+event.values[1]+","+event.values[2]+"]");
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
public int getOrientation(){
return mOrientation;
}
}
final OrientationEventListener orientationEventListener = new OrientationEventListener( getApplicationContext() ) {
@Override
public void onOrientationChanged( final int orientation ) {
Log.i("", "orientation = " + orientation );
}
};
orientationEventListener.enable();