android - 如何将箭头指向特定方向,即西
问题描述
无论用户面向何处,我都想将我的箭头视图仅指向西方向。下面是我尝试过但没有得到预期结果的代码。
// inside onCreate()
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
gsensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
msensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
packageManager = getPackageManager();
if (packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)){
sensorManager.registerListener(this, gsensor, SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, msensor, SensorManager.SENSOR_DELAY_GAME);
}else {
Toast.makeText(MainActivity.this,"No Compass Sensor !", Toast.LENGTH_SHORT).show();
}
@Override
public void onSensorChanged(SensorEvent event) {
final float alpha = 0.97f;
synchronized (this){
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
mGravity[0] = alpha * mGravity[0] + (1 - alpha)
* event.values[0];
mGravity[1] = alpha * mGravity[1] + (1 - alpha)
* event.values[1];
mGravity[2] = alpha * mGravity[2] + (1 - alpha)
* event.values[2];
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){
mGeomagnetic[0] = alpha * mGeomagnetic[0] + (1 - alpha)
* event.values[0];
mGeomagnetic[1] = alpha * mGeomagnetic[1] + (1 - alpha)
* event.values[1];
mGeomagnetic[2] = alpha * mGeomagnetic[2] + (1 - alpha)
* event.values[2];
}
float R[] = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic);
if (success){
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
azimuth = (float) Math.toDegrees(orientation[0]);
Log.i("DegreeA",""+azimuth);
azimuth = (azimuth + 360) % 270;
Log.i("DegreeA",""+azimuth);
adjustThearrow();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void adjustThearrow(){
Matrix matrix = new Matrix();
imageview.setScaleType(ImageView.ScaleType.MATRIX);
matrix.postRotate((float) -azimuth, imageview.getDrawable().getBounds().width()/2,
imageview.getDrawable().getBounds().height()/2);
imageview.setImageMatrix(matrix);
}
在下面的代码行中,如果我设置 360 而不是 270,它会给我一个仅指向北方向的箭头,并且它会平滑旋转。
azimuth = (azimuth + 360) % 360;
但是如果我想让我的代码只面向西方向的箭头,我已经设置了这样的代码:
azimuth = (azimuth + 360) % 270;
但这一次旋转并不顺畅。
请帮助我如何进行。如果提供任何替代解决方案会更好。
解决方案
推荐阅读
- python - 在 python 中处理文本文件时发现错误
- android - 带有渐变轮廓的自定义按钮和带有透明背景的图标
- sql - 如何在需要过滤的两个表上左连接?
- matlab - 将方程应用于数组的特定行并将答案连接到数组
- .net - .Net 中是否有管理权限的标准
- sql - SSDT中数据库项目之间的嵌套引用无法解析
- typescript - 是否可以使用 TypeScripts 装饰器来验证方法参数的值?
- c++ - 有没有一种快速的方法可以知道班级成员对大型班级的可访问性?
- python - 有没有与 is_superuser 相对的字段?
- mysql - Oracle .NET MySQL 8.0.21 客户端抛出奇怪的“不支持同名”错误