安卓 加速傳感器:android 加速度傳感器妙用與自定義View

2022/04/14 01:21 · 傳感器知識資訊 ·  · 安卓 加速傳感器:android 加速度傳感器妙用與自定義View已關閉評論
摘要:

安卓加速傳感器:android加速度傳感器妙用與自定義Viewpackagesina.CreAmazing.angle_view;importandroid.app.Activity;importandroid.content.Context;importandroid.graphics.BitmapFactory;importandroid.graphics.Canvas;import

安卓 加速傳感器:android 加速度傳感器妙用與自定義View  第1張

安卓 加速傳感器android 加速度傳感器妙用與自定義View

package sina.CreAmazing.angle_view;
import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
public class AngleViewActivity extends Activity {

//聲明一個SensorManager管理傳感器,一個自定義的類MyView,在myView中繪制自己想要的圖像
private SensorManager sensorManager;
private MyView myView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//實例化SensorManager
sensorManager=(SensorManager) this.getSystemService(SENSOR_SERVICE);
//DisplayMetrics用于獲取屏幕大小,再傳遞給myView方便繪制圖形界面;
DisplayMetrics display=new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(display);
//構造一個MyView,display.widthPixels是當前屏幕的寬度,display.heightPixels是當前屏幕的高度
myView=new MyView(this, display.widthPixels, display.heightPixels);
//這里就不是在layout文件夾里面的布局文件了,直接就是我們的myView。
setContentView(myView);
}
//在onResume(),onPause()中注冊和解除監聽器
@Override
protected void onResume() {
super.onResume();
sensorManager.registerListener(myView,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
sensorManager.unregisterListener(myView);
Log.i("unregister", "ok");
super.onStop();
}
}
//自定義的類MyView 因為要感應傳感器所以實現SensorEventListener。
class MyView extends View implements SensorEventListener {
//float x=0;
//float y=0;

//z軸上的值是我們所需要的,z軸就是垂直于水平面的方向,當你水平放置手機是它的數值為10,當你垂直放置時它就為0.
float z=0;
private float width;
private float height;
Paint p ;

public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MyView(Context context, float width, float height) {
super(context);
this.width= width;
this.height= height;

//得到一支畫筆,設置基本屬性
p=new Paint();
p.setStyle(Paint.Style.STROKE);
}
//在onDraw()方法中才是我們真正要畫的東西,也就是真正顯示在屏幕上的圖像
@Override
protected void onDraw(Canvas canvas) {
//首先繪制一張背景圖片,圖片是事先PS好的一張背景圖。canvas就是畫布的意思,我們需要用畫筆 p 在畫布canvas上畫畫。
canvas.drawBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.circle),
0, 0, p);
//畫背景后還要畫文字,再對畫筆進行設置。
p.setTextSize(50);
//所畫的文字就是實際測得的角度,在這之前需要對z值進行轉化也就是todegree()方法。
canvas.drawText(todegree(z) + "°", width / 2 - 20, height / 2, p);
//畫完后再畫一個圓圈,這個圓圈隨著角度變化而變大變小。
p.setColor(Color.RED);
p.setStrokeWidth(2);
canvas.drawCircle(width / 2, height / 2, 20 * z, p);
}
//如何把當前加速度的值轉化為當前角度值呢?這需要一定的硬件基礎才能明白其中的原理,不懂得同學可以看一些加速度傳感器方面的書,關于加速度
//傳感器還有很多應用,比如速度的測量,位移的測量,這就需要更加復雜的算法了,這里就不再介紹
private String todegree(float zz) {
//首先判斷加速度的值是否大于10,小于-10,這是因為在運動過程中加速是不穩定的,而我們要測的是在靜止狀態下的穩定值。
if (zz > 10) {
zz =10;
} else if (zz < -10) { zz =-10; } //acos(zz / 10)就能求出傾斜角度的弧度值。 double r=Math.acos(zz / 10); //然后將弧度值轉化為角度值 int degree=(int) (r * 180 / Math.PI); //最后返回一個String return String.valueOf(degree); } @Override public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub // x=event.values[0]; // y=event.values[1]; if(event.sensor.getType()== Sensor.TYPE_ACCELEROMETER){ //獲得z軸的加速度值 z=event.values[2]; } //調用此方法進行重繪 invalidate(); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }

安卓 加速傳感器:Android中使用加速度傳感器

主要功能
記錄行走的步數,行走的時間
根據錄入的體重,步長可以計算出每天行走的歷程,消耗的熱量
對每天行走的歷程進行記錄,并給出星級評價
軟件原理
判斷人是否處于行走中,主要從以下幾個方面判斷:
人如果走起來了,一般會連續多走幾步。因此,如果沒有連續4-5個波動,那么就極大可能是干擾。
人走動的波動,比坐車產生的波動要大,因此可以看波峰波谷的高度,只檢測高于某個高度的波峰波谷。
人的反射神經決定了人快速動的極限,怎么都不可能兩步之間小于0.2秒,因此間隔小于0.2秒的波峰波谷直接跳過通過重力加速計感應,重力變化的方向,大小。與正常走路或跑步時的重力變化比對,達到一定相似度時認為是在走路或跑步。實現起來很簡單,只要手機有重力感應器就能實現。
軟件記步數的精準度跟用戶的補償以及體重有關,也跟用戶設置的傳感器的靈敏度有關系,在設置頁面可以對相應的參數進行調節。一旦調節結束,可以重新開始。手機QQ早就加入了計算步幅功能,還能和好友PK“炫步”。本項目可以作為一個獨立的模塊放到合適的項目里面。安卓 加速傳感器:android 加速度傳感器妙用與自定義View  第2張

安卓 加速傳感器:Android中的傳感器之---加速度傳感器

加速度傳感器
加速度傳感器又叫G-sensor,返回x、y、z三軸的加速度數值。

該數值包含地心引力的影響,單位是m/s^2。

將手機平放在桌面上,x軸默認為0,y軸默認0,z軸默認9.81(由于地球的固有重力)。

將手機朝下放在桌面上,z軸為-9.81。

將手機向左傾斜,x軸為正值。

將手機向右傾斜,x軸為負值。

將手機向上傾斜,y軸為負值。

將手機向下傾斜,y軸為正值。

Android 加速度傳感器的類型是? Sensor.TYPE_ACCELEROMETER

通過 android.hardware.SensorEvent 返回加速度傳感器值。

加速度傳感器在手機中應用非常的廣泛,在開發的過程當中也非常的簡單,(獲取到值是真的非常的簡單,想要實現某種功能還是需要自己想想怎么加判斷吧)

舉個栗子:手機搖一搖的功能:

這個算是比較簡單的判斷了,獲取到x,y,z的值之后,對這三個值進行判斷,搖一搖手機的話這些值肯定會發生變化,我們定一個閾值,當它們的值超過某一個數字之后就進行了搖一搖,配合代碼實現更容易理解

手機搖一搖功能實現

上面代碼可以看到,通過x,y,z的值的變化來判斷手機是否進行了搖一搖,這個判斷是比較簡單的,思路就是這么個思路,這種判斷有缺點,上面判斷的是xyz的值不管是哪一個超過了20就認定手機進行了搖一搖,但是忽略了一點,就是用戶往一個方向甩動手機也能觸發,最好的就是只判斷zy,并且判斷的xy必須同時超過20才能認定是搖一搖,以下是改過的代碼

抬手亮屏
還有相對搖一搖來說復雜一點的功能--抬手亮屏,這個也是對xyz進行判斷,這里就不放代碼了,簡單說一下思路,當我們拿起手機的時候,加速度傳感器xyz的值肯定會發生變化,我們可以判斷它的結束值,就是手機對著我們的臉的時候傳感器的值是個什么樣的狀態(我低著頭對著手機的時候是x:0,y:8,z:5),我們可以對這個值進行判斷,在手機200ms內達到這個值就被認定抬手亮屏

代碼部分
下面是獲取加速度傳感器的值以及手機搖一搖的代碼

更多手機傳感器使用請看Android中的傳感器(總)

安卓 加速傳感器:Android傳感器

package org.crazyit.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.os.Bundle;
import android.widget.EditText;
public class AccelerometerTest extends Activity
implements SensorEventListener
{
// 定義系統的Sensor管理器
SensorManager sensorManager;
EditText etTxt1;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 獲取程序界面上的文本框組件
etTxt1= (EditText) findViewById(R.id1);
// 獲取系統的傳感器管理服務
sensorManager= (SensorManager) getSystemService(
Context.SENSOR_SERVICE); //①
}
@Override
protected void onResume()
{
super.onResume();
// 為系統的加速度傳感器注冊監聽器
sensorManager.registerListener(this,
sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_GAME); //②
}
@Override
protected void onStop()
{
// 取消注冊
sensorManager.unregisterListener(this);
super.onStop();
}
// 以下是實現SensorEventListener接口必須實現的方法
// 當傳感器的值發生改變時回調該方法
@Override
public void onSensorChanged(SensorEvent event)
{
float[] values= event.values;
StringBuilder sb =new StringBuilder();
sb.append("X方向上的加速度:");
sb.append(values[0]);
sb.append("
Y方向上的加速度:");
sb.append(values[1]);
sb.append("
Z方向上的加速度:");
sb.append(values[2]);
etTxt1.setText(sb.toString());
}
// 當傳感器精度改變時回調該方法。
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy)
{
}
}

您可能感興趣的文章

本文地址:http://www.marisaherron.com/70828.html
文章標簽: ,   ,  
版權聲明:本文為原創文章,版權歸 ceomba 所有,歡迎分享本文,轉載請保留出處!

文件下載

老薛主機終身7折優惠碼boke112

上一篇:
下一篇:

評論已關閉!