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 ENDGPS 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 Location 和 Sensor的使用,图片旋转角度
猜你喜欢
转载自blog.csdn.net/u011694328/article/details/107229981
今日推荐
周排行