Android传感器——温度传感器及重力传感器实现的小案例

接上

https://blog.csdn.net/nishigesb123/article/details/90258784

 

部分参考:https://developer.android.google.cn/guide/topics/sensors/sensors_overview.html


温度传感器

概述及杂项

Sensor Type Description Common Uses
TYPE_AMBIENT_TEMPERATURE Hardware Measures the ambient room temperature in degrees Celsius (°C). See note below. Monitoring air temperatures.
Sensor Android 4.0 
(API Level 14)
Android 2.3 
(API Level 9)
Android 2.2 
(API Level 8)
Android 1.5 
(API Level 3)
TYPE_AMBIENT_TEMPERATURE Yes n/a n/a n/a

避免使用不推荐的方法或传感器类型

有几种方法和常量已被废弃。特别是,TYPE_ORIENTATION已不再推荐传感器类型。若要获取定向数据,应使用getOrientation()方法代替。同样,TYPE_TEMPERATURE已不再推荐传感器类型。您应该使用TYPE_AMBIENT_TEMPERATURE传感器在运行Android4.0的设备上输入。

Avoid using deprecated methods or sensor types

Several methods and constants have been deprecated. In particular, the TYPE_ORIENTATIONsensor type has been deprecated. To get orientation data you should use the getOrientation()method instead. Likewise, the TYPE_TEMPERATURE sensor type has been deprecated. You should use the TYPE_AMBIENT_TEMPERATURE sensor type instead on devices that are running Android 4.0.

示例代码

接之前的案例,布局又双叒叕加一个TextView就好

package com.example.sensor;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private TextView textView_temp;
    private TextView textView_start;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.content);
        textView_start = findViewById(R.id.textView_start);
        textView_temp = findViewById(R.id.textView_temp);
        //获取系统传感器管理器
        SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        //通过系统传感器管理器..获取本机所有传感器.
        List sensorList = sm.getSensorList(Sensor.TYPE_ALL);

        for (Sensor s : sensorList) {
            Log.i("sensorList", s.toString());
        }
        //获取指定的某一个传感器,下面为加速度传感器
        Sensor type_accelerometer = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        if (type_accelerometer != null) {
            Log.i("type_accelerometer", type_accelerometer.toString());
        }
        //注册传感器的监听器
        sm.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                //传感器数据变化,在该方中我们可以获取传感器变化的值
                float x = event.values[0];
                float y = event.values[1];
                float z = event.values[2];
                textView.setText("x=" + x + "y=" + y + "z=" + z);
                //  System.out.println("x="+x+",y="+y+",z="+z);
                if ((Math.abs(x) + Math.abs(y) + Math.abs(z)) >= ringValue && flag == false) {
                    flag = true;
                    textView_start.setVisibility(View.VISIBLE);
                    MediaPlayer mp = MediaPlayer.create(MainActivity.this, R.raw.test);
                    mp.start();
                    mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            mp.release();
                            flag = false;
                            textView_start.setVisibility(View.GONE);
                        }
                    });
                }
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {
                //传感器精度变化
            }
        }, type_accelerometer, SensorManager.SENSOR_DELAY_NORMAL);


        //温度传感器
        Sensor type_ambient_temperature = sm.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
        if (type_ambient_temperature != null) {
            System.out.println(type_ambient_temperature.toString());
        }
        sm.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                float temp = event.values[0];
                System.out.println(temp);
                temp = (float) (Math.round(temp * 10.0) / 10.0);
                textView_temp.setText("温度:" + temp + "℃");
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        }, type_ambient_temperature, SensorManager.SENSOR_DELAY_NORMAL);
    }

    int ringValue = 40;//三维XYZ三个值的总和达到这个值表示为摇晃
    boolean flag = false;//表示是否已经在播放声音
}

然而,我的手机并没有温度传感器 2333 

 Android传感器——温度传感器及重力传感器实现的小案例_第1张图片


自由的小方

需求分析

  1. 定义一个小方块对象
  2. 定义一个视图,用于把小方块配置到屏幕上
  3. 通过重力传感器TYPE_GRAVIY控制小方块在不超过屏幕的范围内在屏幕上自由的滚(?)

实现

准备

一个新的Activity并设置为启动页面,同时修改它的样式(主题),设置为全屏。

如?图所示

Android传感器——温度传感器及重力传感器实现的小案例_第2张图片

并将创建的Activity继承改为继承Activity,如?图所示

Android传感器——温度传感器及重力传感器实现的小案例_第3张图片

方块绘制思路

  • 准备一个类,Rect表示小方块
  • 同时准备一个继承的View类RectView(自定义视图),实现其onDraw方法
  • 使用canvas.drawRect绘制小方块

附 drawRect 相关介绍
Added in API level 1
void drawRect (float left, float top,  float right,float bottom, Paint paint)
Draw the specified Rect using the specified paint. The rectangle will be filled or framed based on the Style in the paint.
Parameters

  • left  (float) :The left side of the rectangle to be drawn
  • top (float): The top side of the rectangle to be drawn
  • right(float): The right side of the rectangle to be drawn
  • bottom(float): The bottom side of the rectangle to be drawn
  • paint(Paint): The paint used to draw the rect

 

  • 根据drawRect 的参数合理的定义Rect对象

具体实现

Rect.java

package com.example.sensor;

public class Rect {
    float left = 100, top = 100, right = 100, bottom = 100;
    private int width, height;

    public Rect(int width, int height) {
        this.width = width;
        this.height = height;
        left = width / 2 - right / 2;
        top = height / 2 - bottom / 2;

    }

    public float getBottom() {
        return bottom;
    }

    public void setBottom(float bottom) {
        this.bottom = bottom;
    }

    public float getLeft() {
        return left;
    }

    public void setLeft(float left) {
        this.left -= left;
        if (this.left <= 0) {
            this.left = 0;
        } else if (this.left >= width - this.right) {
            this.left = width - this.right;
        }
    }

    public float getRight() {
        return right;
    }

    public void setRight(float right) {
        this.right = right;
    }

    public float getTop() {
        return top;
    }

    public void setTop(float top) {
        this.top += top;
        if (this.top <= 0) {
            this.top = 0;
        } else if (this.top >= height - this.bottom) {
            this.top = height - this.bottom;
        }
    }
}

RectView.java

package com.example.sensor;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class RectView extends View {
    Rect rect;
    private int width,height;
    Paint paint;
    public RectView(Context context, int width, int height) {
        super(context);
        this.width=width;
        this.height=height;
        paint =new Paint();
        paint.setColor(Color.GREEN);
        rect=new Rect(width,height);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(rect.getLeft(),rect.getTop(),rect.getRight()+rect.getLeft(),rect.getTop()+rect.getBottom(),paint);
    }
}

值得注意的是为了满足不超出屏幕的需求,在构造的时候还传入了宽高两个属性(即屏幕的宽高)

Main2Activity
package com.example.sensor;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;

public class Main2Activity extends Activity {

    private RectView rv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        rv = new RectView(this, dm.widthPixels, dm.heightPixels);
        setContentView(rv);
        SensorManager sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor type_gravity = sm.getDefaultSensor(Sensor.TYPE_GRAVITY);
        sm.registerListener(new SensorEventListener() {
            @Override
            public void onSensorChanged(SensorEvent event) {
                float x = event.values[0];
                float y = event.values[1];
                rv.rect.setLeft(Math.round(x));
                rv.rect.setTop(Math.round(y));
                rv.invalidate();//屏幕重绘
            }

            @Override
            public void onAccuracyChanged(Sensor sensor, int accuracy) {

            }
        }, type_gravity, SensorManager.SENSOR_DELAY_GAME);
    }
}

效果

Android传感器——温度传感器及重力传感器实现的小案例_第4张图片

你可能感兴趣的:(安卓开发)