环球观点:【Android】传感器的使用_android onaccuracychanged

2022-09-15 13:40:42来源:互联网  


(资料图片)

手机上的传感器

加速度磁力方向陀螺仪光线感应压力温度接近重力线性加速度旋转矢量

使用步骤

获取SensorManager对象获取Sensor对象注册Sensor对象重写onAccuracyChanged,onSensorChanged这两个方法注销Sensor对象

注意

别忘记注销,否则耗电贼快不要在模拟器上测试代码,没有传感器可用不要阻塞onSensorChanged()方法避免使用过时的方法或传感器类型使用前先验证传感器,验证是否存在并且可用谨慎选择传感器延时,根据场景选取获取数据的频率

使用

java文件:

package com.dj.aboutactivity;import androidx.appcompat.app.AppCompatActivity;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager;import android.os.Bundle;import android.view.animation.Animation;import android.view.animation.RotateAnimation;import android.widget.ImageView;public class SensorManagerActivity extends AppCompatActivity implements SensorEventListener{    ImageView mImageView;    SensorManager mSensorManager;    Sensor mSensor;    private float mStartDegree = 0f;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_sensor_manager);        // 手机转的时候图标跟着转        mImageView = findViewById(R.id.imageView);        /**         * - 获取SensorManager对象         * - 获取Sensor对象         * - 注册Sensor对象         * - 重写onAccuracyChanged,onSensorChanged这两个方法         * - 注销Sensor对象         */        mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);//获取SensorManager对象        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);//获取Sensor对象        // 运行时 判断是否得到了可用的传感器        if(mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION) != null){            // 可用        }else{            // 传感器不存在        }    }    @Override    protected void onResume() {        super.onResume();        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI);//注册Sensor对象  SENSOR_DELAY_UI 获取传感器数据的频率    }    @Override    protected void onPause() {        super.onPause();        mSensorManager.unregisterListener(this); //注销Sensor对象    }    // 重写onAccuracyChanged,onSensorChanged这两个方法    @Override    public void onSensorChanged(SensorEvent event) {//当传感器的值发生变化的时候做的事情        if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){            float degree = - event.values[0]; // 负的,反方向转            // 旋转动画            RotateAnimation rotateAnimation = new RotateAnimation(                    mStartDegree, degree, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f            );            rotateAnimation.setDuration(300);            mImageView.startAnimation(rotateAnimation);            mStartDegree = degree;//用当前角度更新下次开始的角度        }else if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ // 加速度            float x = event.values[SensorManager.DATA_X];            float y = event.values[SensorManager.DATA_Y];            float z = event.values[SensorManager.DATA_Z];            if(x > 18 || y > 18 || z > 18){                // 成功摇动手机            }        }    }    @Override    public void onAccuracyChanged(Sensor sensor, int accuracy) {//当精度发生变化的时候做的事情    }}

xml文件:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".SensorManagerActivity"    android:orientation="vertical"    android:gravity="center">    <ImageView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/imageView"        android:src="@mipmap/ic_launcher"        android:layout_gravity="center_horizontal"/></LinearLayout>

相关阅读

精彩推荐

相关词

推荐阅读