无论当前屏幕的方向(横向或纵向)如何,我都希望获得当前的磁方向。
我找到了这个例子,但它不是方向独立的,对不对?而这也帮不了我。我确实也阅读了http://android-
developers.blogspot.de/2010/09/one-screen-turn-deserves-
another.html
。
这是我当前使用的方法,不想使用(过短的)废弃方法:
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
private SensorEventListener sensorEventListener = new SensorEventListener() {
public void onSensorChanged(SensorEvent event) {
/* Get measured value */
float current_measured_bearing = (float) event.values[0];
/* Compensate device orientation */
switch (((WindowManager) getSystemService(WINDOW_SERVICE))
.getDefaultDisplay().getRotation()) {
case Surface.ROTATION_90:
current_measured_bearing = current_measured_bearing + 90f;
break;
case Surface.ROTATION_180:
current_measured_bearing = current_measured_bearing - 180f;
break;
case Surface.ROTATION_270:
current_measured_bearing = current_measured_bearing - 90f;
break;
}
但是最后一部分肯定是错误的!getRotationMatrix()
在这种情况下,如何正确使用更新的方法?(与方向无关)还是仅需event.values[]
基于旋转矩阵使用数组的其他值?还是我需要“重新映射坐标”?那么,是实现这一目标的正确方法是什么?
我正在为屏幕旋转360°和API Level 11+的设备进行开发。
我知道这些问题经常被问到,但我无法简单地将其答案转移给我的问题。
好的,我终于设法使代码生效了!
首先,我注册一个Sensor.TYPE_MAGNETIC_FIELD
and Sensor.TYPE_GRAVITY
:(就像阮阮说的那样!)
/**
* Initialize the Sensors (Gravity and magnetic field, required as a compass
* sensor)
*/
private void initSensors() {
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Sensor mSensorGravity = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
Sensor mSensorMagneticField = sensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
/* Initialize the gravity sensor */
if (mSensorGravity != null) {
Log.i(TAG, "Gravity sensor available. (TYPE_GRAVITY)");
sensorManager.registerListener(mSensorEventListener,
mSensorGravity, SensorManager.SENSOR_DELAY_GAME);
} else {
Log.i(TAG, "Gravity sensor unavailable. (TYPE_GRAVITY)");
}
/* Initialize the magnetic field sensor */
if (mSensorMagneticField != null) {
Log.i(TAG, "Magnetic field sensor available. (TYPE_MAGNETIC_FIELD)");
sensorManager.registerListener(mSensorEventListener,
mSensorMagneticField, SensorManager.SENSOR_DELAY_GAME);
} else {
Log.i(TAG,
"Magnetic field sensor unavailable. (TYPE_MAGNETIC_FIELD)");
}
}
我将其SensorEventListner
用于计算:
private SensorEventListener mSensorEventListener = new SensorEventListener() {
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
mGravity = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
mMagnetic = event.values.clone();
}
if (mGravity != null && mMagnetic != null) {
/* Create rotation Matrix */
float[] rotationMatrix = new float[9];
if (SensorManager.getRotationMatrix(rotationMatrix, null,
mGravity, mMagnetic)) {
/* Compensate device orientation */
// http://android-developers.blogspot.de/2010/09/one-screen-turn-deserves-another.html
float[] remappedRotationMatrix = new float[9];
switch (getWindowManager().getDefaultDisplay()
.getRotation()) {
case Surface.ROTATION_0:
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_X, SensorManager.AXIS_Y,
remappedRotationMatrix);
break;
case Surface.ROTATION_90:
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_Y,
SensorManager.AXIS_MINUS_X,
remappedRotationMatrix);
break;
case Surface.ROTATION_180:
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_MINUS_X,
SensorManager.AXIS_MINUS_Y,
remappedRotationMatrix);
break;
case Surface.ROTATION_270:
SensorManager.remapCoordinateSystem(rotationMatrix,
SensorManager.AXIS_MINUS_Y,
SensorManager.AXIS_X, remappedRotationMatrix);
break;
}
/* Calculate Orientation */
float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix,
results);
/* Get measured value */
float current_measured_bearing = (float) (results[0] * 180 / Math.PI);
if (current_measured_bearing < 0) {
current_measured_bearing += 360;
}
/* Smooth values using a 'Low Pass Filter' */
current_measured_bearing = current_measured_bearing
+ SMOOTHING_FACTOR_COMPASS
* (current_measured_bearing - compass_last_measured_bearing);
/* Update normal output */
visual_compass_value.setText(String.valueOf(Math
.round(current_bearing))
+ getString(R.string.degrees));
/*
* Update variables for next use (Required for Low Pass
* Filter)
*/
compass_last_measured_bearing = current_measured_bearing;
}
}
}
};
我用Python和Pyplay做了一个简单的游戏。 游戏在两个方向(纵向和横向)上都有效,因为我在打开游戏时使用的方向是相同的。 如果我在游戏运行时旋转设备改变方向,所有东西都会出现在错误的位置。 问题是,我不知道如何检测设备是否已旋转以正确重画屏幕。 那么,我的问题是: 如何检测用户仅使用Python或PyGame代码旋转设备? 重要提示:建议不应与任何特定操作系统相关,因为相同的代码必须在带有
Android将屏幕尺寸定义为普通的大屏幕等。 它会自动选择适当文件夹中的静态资源。我需要这个数据关于当前设备在我的java代码。DisplayMetrics仅提供有关当前设备密度的信息。没有关于屏幕大小可用。 我确实在grep代码中找到了屏幕大小枚举,但是这对我来说似乎不适用于4.0 SDK。有办法得到这些信息吗?
问题内容: 现在,当我使用内置方法时,它向我显示了返回类型,没有其他有用的方法了。 我可以下载一些东西来使来自intellisense的信息更可靠吗? 找不到Javadoc。此项的Javadoc文档不存在,或者您没有在Java Platform Manager或Library Manager中添加指定的Javadoc。 问题答案: 您需要下载JDK API文档,您可以从此页面获得。然后在NetBe
null 这是这个问题的视频 下面是我如何切换屏幕的代码: 从游戏第一次打开到主菜单: GamesCreen:
这个问题已经被问了无数次,但是没有一个真正解决保存时的旋转问题。 这是我最初如何保存一个位图到我的设备: 以上内容保存了。 然后我看到了这个答案,但问题是它将已经保存的位图旋转到正确的方向。例如,如果您想将设置为,则可以这样做。但是,如果我想共享位图,或者想在设备库中打开它,方向仍然不正确。然后,我将不得不执行与上面相同的过程-等。这将导致同样的问题。 如何将
问题内容: 我正在与Android的糟糕布局系统作斗争。我正在尝试用一张桌子填满屏幕(很简单吗?),但是很难做到。 我得到它可以以某种方式在XML中工作: 但是我无法使其在Java中工作。我已经尝试了LayoutParams的一百万种组合,但是没有任何效果。这是我得到的最佳结果,它只能填充屏幕的宽度,而不是高度: 显然,Android文档没有帮助。有人有主意吗? 问题答案: 终于弄清楚了如何做到这