Android開発(10)
センサー
1.manActivity SensorEvent Lister方法2.定義:SensorManageオブジェクト3.書き換えたonResum方法では重力と光センサー登録モニターsensormanage.register Listener()4.実現したオンセンストップ方式でセンサのタイプを取得する5.ハードウェアを介してソフトウェアインターフェースから光センサーを使用する画面の明るさに応じて画面の明るさを変更します。カスタムViewはSensorEvent Listenerインターフェース を実現します。は登録磁場センサを取得し、センサ値 を取得する。 X,Y軸描画ポインタ 携帯の放置状態 携帯は水平方向に角度を上げて、携帯はY軸の角度を上げます。
加速度センサー+磁界センサー実現方向親戚 getRoation Matrix()は、そのR配列 を取得する。 SensorManager.get Orientationは、ラジアン を取得する。
1.manActivity SensorEvent Lister方法2.定義:SensorManageオブジェクト3.書き換えたonResum方法では重力と光センサー登録モニターsensormanage.register Listener()4.実現したオンセンストップ方式でセンサのタイプを取得する5.ハードウェアを介してソフトウェアインターフェースから光センサーを使用する画面の明るさに応じて画面の明るさを変更します。
package com.mingrisoft;
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.widget.EditText;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
EditText textGRAVITY, textLIGHT; //
private SensorManager sensorManager; //
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textGRAVITY = (EditText) findViewById(R.id.textGRAVITY); //
textLIGHT = (EditText) findViewById(R.id.textLIGHT); //
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); //
}
@Override
protected void onResume() {
super.onResume();
//
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY),
SensorManager.SENSOR_DELAY_GAME);
//
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
protected void onPause() { //
sensorManager.unregisterListener(this);
super.onPause();
}
@Override
protected void onStop() { //
sensorManager.unregisterListener(this);
super.onStop();
}
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values; // X、Y、Z
int sensorType = event.sensor.getType(); //
StringBuilder stringBuilder = null;
switch (sensorType) {
case Sensor.TYPE_GRAVITY:
stringBuilder = new StringBuilder();
stringBuilder.append("X :");
stringBuilder.append(values[0]);
stringBuilder.append("
Y :");
stringBuilder.append(values[1]);
stringBuilder.append("
Z :");
stringBuilder.append(values[2]);
textGRAVITY.setText(stringBuilder.toString());
break;
case Sensor.TYPE_LIGHT:
stringBuilder = new StringBuilder();
stringBuilder.append(" :");
stringBuilder.append(values[0]);
textLIGHT.setText(stringBuilder.toString());
break;
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
磁場センサpackage com.example.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
public class PointerView extends View implements SensorEventListener {
//
private Bitmap pointer = null;
//
private float[] allValue;
//
private SensorManager sensorManager;
public PointerView(Context context, AttributeSet attrs) {
super(context);
//
pointer = BitmapFactory.decodeResource(super.getResources(),
R.drawable.pointer );
//
sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
//
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if(sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD ){
float value[] = sensorEvent.values; //
allValue = value; //
super.postInvalidate(); //
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
if (allValue != null) {
float x = allValue[0];
float y = allValue[1];
//
canvas.translate(super.getWidth() / 2, super.getHeight() / 2);
try{
canvas.restore();
}catch (Exception e) {
}
if (y == 0 && x > 0) {
canvas.rotate(90); // 90
} else if (y == 0 && x < 0) {
canvas.rotate(270); // 270
} else {
// tanh()
if (y >= 0) {
canvas.rotate((float) Math.tanh(x / y) * 90);
} else {
canvas.rotate(180 + (float) Math.tanh(x / y) * 90);
}
}
}
//
canvas.drawBitmap(this.pointer, -this.pointer.getWidth() / 2,
-this.pointer.getHeight() / 2, p);
}
}
加速度センサpackage com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.Service;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Vibrator;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements SensorEventListener {
private SensorManager sensorManager; //
private Vibrator vibrator; //
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); //
vibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); //
}
@Override
protected void onResume() {
super.onResume();
//
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float[] values = sensorEvent.values; // X、Y、Z
if (values[0] > 15 || values[1] > 15 || values[2] > 20) {
//
Toast.makeText(MainActivity.this, " ", Toast.LENGTH_SHORT).show();
// AlertDialog.Builder
AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
alertDialog.setView(R.layout.packet); //
alertDialog.show(); // alertDialog
vibrator.vibrate(500);
sensorManager.unregisterListener(this); //
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
}
方向センサpackage com.example.myapplication;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class SpiritLevelView extends View implements SensorEventListener {
private Bitmap bubble; //
private int MAX_ANGLE = 30; // , ,
private int bubbleX, bubbleY; // X、Y
public SpiritLevelView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
bubble = BitmapFactory //
.decodeResource(getResources(), R.drawable.bubble);
SensorManager sensorManager = (SensorManager) context
.getSystemService(Context.SENSOR_SERVICE); //
sensorManager.registerListener(this, //
sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this, //
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME);
}
//
float[] accelerometerValues = new float[3];
//
float[] magneticValues = new float[3];
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { //
accelerometerValues = event.values.clone(); //
} else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { //
magneticValues = event.values.clone(); //
}
float[] R = new float[9]; //
float[] values = new float[3]; //
SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticValues);
SensorManager.getOrientation(R, values); // Z 、X 、Y
float xAngle = (float) Math.toDegrees(values[1]); // X
float yAngle = (float) Math.toDegrees(values[2]); // Y
getPosition(xAngle,yAngle); //
super.postInvalidate(); //
}
@Override
public void onAccuracyChanged(Sensor sensor, int i) {
}
// x y
private void getPosition(float xAngle,float yAngle){
// ( ), X、Y
int x = (super.getWidth() - bubble.getWidth()) / 2;
int y = (super.getHeight() - bubble.getHeight()) / 2;
/******** X ******/
if (Math.abs(yAngle) <= MAX_ANGLE) { // Y
// Y X ( ,X )
int deltaX = (int) ((super.getWidth() - bubble.getWidth()) / 2 * yAngle / MAX_ANGLE);
x -= deltaX;
} else if (yAngle > MAX_ANGLE) { // Y MAX_ANGLE,
x = 0;
} else { // Y MAX_ANGLE,
x = super.getWidth() - bubble.getWidth();
}
/******** Y ******/
if (Math.abs(xAngle) <= MAX_ANGLE) { // X
// X Y ( ,Y )
int deltaY = (int) ((super.getHeight() - bubble.getHeight()) / 2 * xAngle / MAX_ANGLE);
y += deltaY;
} else if (xAngle > MAX_ANGLE) { // X MAX_ANGLE,
y = super.getHeight() - bubble.getHeight();
} else { // X MAX_ANGLE,
y = 0;
}
//
bubbleX = x;
bubbleY = y;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(bubble, bubbleX, bubbleY, null); //
}
}