Android Location 和 Sensor的使用,图片旋转角度

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;
    }
}

猜你喜欢

转载自blog.csdn.net/u011694328/article/details/107229981