Android Location 和 Sensor的使用,图片旋转角度
16lz
2021-01-23
package wits.sensor;import android.Manifest;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.location.Criteria;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.RotateAnimation;import android.widget.ImageView;import android.widget.TextView;import java.text.DecimalFormat;import java.util.List;import androidx.core.app.ActivityCompat;import wits.utils.SPUtils;public class SensorActivity extends Activity { private TextView altitudeTv, latitudeTv, longitudeTv, altTv, gpsTv; private ImageView imgX, imgY; private float mBaseX, mBaseY, mBaseZ, mXdegree, mYdegree, mZdegree; private final DecimalFormat sigDigits = new DecimalFormat("0.######"); // 小数点保留5位 private final DecimalFormat formatAlt = new DecimalFormat("0.##"); // 小数点保留2位 private final String CHEKC_X = "checkX"; private final String CHEKC_Y = "checkY"; private final String CHEKC_Z = "checkZ"; private final String IS_FIRST_BASE = "isFirst"; private boolean isFirst; private int count; private SensorManager mSensorManager; private LocationManager mLocationManager; private Location mLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.gyroscope_layout); initIds(); initSensor(); initGps(); } private void initIds() { imgX = findViewById(R.id.imgGyroViewX); imgY = findViewById(R.id.imgGyroViewY); altitudeTv = findViewById(R.id.altitude_tv); latitudeTv = findViewById(R.id.latitude_tv); longitudeTv = findViewById(R.id.longitude_tv); altTv = findViewById(R.id.tvAltitudeValue1); gpsTv = findViewById(R.id.gps_tv); isFirst = SPUtils.getSPUtils(SensorActivity.this).getValue(IS_FIRST_BASE, true); // 获取基本的数字,校准时以这个数字作为基准 默认是0 imgX.setOnLongClickListener(longListener); imgY.setOnLongClickListener(longListener); } private void initSensor() { Log.d("--initSensor()-->"); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); //// TYPE_GYROSCOPE 陀螺仪传感器//// TYPE_ACCELEROMETER 加速度传感器 mSensorManager.registerListener(mSensorEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL); } private void initGps() { Log.d("--initGps()-->"); if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(SensorActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION,Manifest.permission.ACCESS_COARSE_LOCATION}, 10010); Log.d("--checkSelfPermission-->"); } mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 100, 0, locationListener); mLocation = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); }///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// private SensorEventListener mSensorEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { // Sensor数据从这里读出 float xFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_X])); float yFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_Y])); float zFloat = Float.parseFloat(formatAlt.format(event.values[SensorManager.DATA_Z])); calcDegree(xFloat, yFloat, zFloat); count++; if (count == 10) { calcDegree(xFloat, yFloat, zFloat); mHandler.sendEmptyMessage(0); Log.d("xFloat:" + xFloat + ", yFloat:" + yFloat); count = 0; } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } };/////////////Gps///////Gps//////////Gps///////////////////Gps/////////////////Gps//////////////////////////////////////////////////// private LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { double log = location.getLongitude(); double lat = location.getLatitude(); double alt = location.getAltitude(); gpsTv.setText("经度 :"+sigDigits.format(log) +"\n" + "纬度 :"+sigDigits.format(lat)+"\n" +"海拔 :"+sigDigits.format(alt)); Log.d("--info-->" + "时间 :"+location.getTime() + " , 经度:"+location.getLongitude() + " , 纬度:"+location.getLatitude() + " , 海拔:"+location.getAltitude()); updateGpsView(location); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { gpsTv.setText(" onStatusChanged "); } @Override public void onProviderEnabled(String provider) { gpsTv.setText(" onProviderEnabled "); } @Override public void onProviderDisabled(String provider) { gpsTv.setText(" onProviderDisabled "); } }; @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 10010) {// gpsTv.setText(" permissions "); initGps(); } }///////////GPS END/////GPS END//////////GPS END/////////////////GPS END///////////GPS END///////////GPS END////////////GPS END//////////////////////////////////////////////////// private void calcDegree(float x, float y, float z) { float base = (float) Math.sqrt((double) ((x * x) + (y * y) + (z * z))); mXdegree = ((float) (Math.acos((double) (x / base)) / Math.PI)) * 180.0f; mYdegree = ((float) (Math.acos((double) (y / base)) / Math.PI)) * 180.0f; mZdegree = ((float) (Math.acos((double) (z / base)) / Math.PI)) * 180.0f; if(isFirst) { // 首次使用校准一下角度 reset(); isFirst = false; SPUtils.getSPUtils(SensorActivity.this).setValue(IS_FIRST_BASE, false); } } private DecelerateInterpolator decelerateInterpolator = new DecelerateInterpolator(); private Animation mAnimationX, mAnimationY; private float mPrevX, mPrevY; private float mXAvarageValue, mYAvarageValue; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 0: removeMessages(0); float ChangeX = mXdegree - Math.abs(mBaseX); float ChangeY = mYdegree - Math.abs(mBaseY); synchronized (this) { mYAvarageValue = (mYAvarageValue + ChangeY); mYAvarageValue = mYAvarageValue / 2.0f; if (Math.abs(mYAvarageValue - mPrevY) > 1.0f) { mAnimationY = new RotateAnimation(mPrevY, mYAvarageValue, 1, 0.5f, 1, 0.5f); mAnimationY.setDuration(1000); mAnimationY.setInterpolator(decelerateInterpolator); mAnimationY.setFillAfter(true); imgY.startAnimation(mAnimationY); mPrevY = mYAvarageValue; }//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// mXAvarageValue = mXAvarageValue + ChangeX; mXAvarageValue = mXAvarageValue / 2.0f; if (Math.abs(mXAvarageValue - mPrevX) > 1.0f) { mAnimationX = new RotateAnimation(mPrevX, mXAvarageValue, 1, 0.5f, 1, 0.5f); mAnimationX.setDuration(1000); mAnimationX.setInterpolator(decelerateInterpolator); mAnimationX.setFillAfter(true); imgX.startAnimation(mAnimationX); mPrevX = mXAvarageValue; } } break; } } }; /**private void initData() { mBaseX = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_X, 0.0f); mBaseY = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_Y, 0.0f); mBaseZ = SPUtils.getSPUtils(MainActivity.this).getValue(CHEKC_Z, 0.0f); mXAvarageValue = 0.0f; mYAvarageValue = 0.0f; mPrevX = 0.0f; mPrevY = 0.0f; mHandler.sendEmptyMessage(0); }*/ private void updateGpsView(Location location) { String altValue = sigDigits.format(location.getAltitude()); String latValue = sigDigits.format(location.getLatitude()); String logValue = sigDigits.format(location.getLongitude()); altitudeTv.setText(altValue+"m"); latitudeTv.setText(latValue); longitudeTv.setText(logValue); altTv.setText(altValue+"m"); } private void refreshBaseData() { mBaseX = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_X, mXdegree); mBaseY = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_Y, mYdegree); mBaseZ = SPUtils.getSPUtils(SensorActivity.this).getValue(CHEKC_Z, mZdegree); } private void reset() { mBaseX = mXdegree; mBaseY = mYdegree; mBaseZ = mZdegree; SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_X, mBaseX); SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_Y, mBaseY); SPUtils.getSPUtils(SensorActivity.this).setValue(CHEKC_Z, mBaseZ); } private View.OnLongClickListener longListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { switch (v.getId()) { case R.id.imgGyroViewX: case R.id.imgGyroViewY: reset(); break; } return false; } }; @Override protected void onResume() { super.onResume(); refreshBaseData(); } @Override protected void onDestroy() { super.onDestroy(); mSensorManager.unregisterListener(mSensorEventListener); mLocationManager.removeUpdates(locationListener); mSensorManager = null; mLocationManager = null; }}
更多相关文章
- Android EditText保留小数点后两位
- c语言float类型小数点后有几位有效数字?
- 尝试将纬度和经度发布到数据库时,Android JSON解析错误
- 高德地图api接口poi检索示例----并在信息框显示经纬度
- SQL Server 中 存储“经纬度”应设置的数据类型
- Sql经纬度计算与C#经纬度计算
- 根据两点经纬度计算距离和角度——java实现