السلام عليكم ورحمه الله وبركاته
ان شاء الله اليوم هنشرح مع بعض
كيفيه التعامل مع الـ Accelerometer فى الاندرويد
وهى جهاز حساس بحركه الجهاز فى الثلاث اتجاهات x , y ,z الطول والعرض والارتفاع
فيمكن مثلا عمل لعبه تقوم عن طريق استخدام هذا الجهاز فى تحريك احد اجزاء اللعبه
مثل هذه اللعبه الموجودة فى موبيل الـ HTC
هذه اللعبه تتعامل مع ان تقوم بتحريك الكره عن طريق حرتك بالموبيل ميلا للاعلى وللاسفل كى تتفادى الوقع فى الحفرة
وصولا للهدف
فهذه اللعبه مبنيه على استخدام الـ Accelerometer
تقوم بطلب الاجهزه الحساسه من النظام
عن طريق الكود
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
وعن طريق مدير الاجهزه الحساسه تقوم بالحصول على قائمه الاجهزه الحساسه التى من نوع معين عن طريق الداله getSensorList
لكنها تاخد نوع الجهاز التى تريد البحث عنه وهو Sensor.TYPE_ACCELEROMETER
فتقوم باعاده قائمه بالاجهزه الحساسه التى تعمل مع الـAccelerometer
فنقوم بعمل فحصل هل حجم هذه القائمه اكبر من الصفر فيعنى ذلك ان لدينا حساس خاص بالـ Accelerometer, انما ان كانت تساوى صفر
فيعنى ان الجهاز لا يدعم وليس به هذا الجهاز
ان كان لدينا جهاز حساس فاننا نقوم باستخدام الـSensorManager لتسجيل مسمتع لاحداث هذا الحساس
ونقوم بعمل implement للـ SensorEventListener للتنفيذ فى حاله وجود اى تنفيذ للحدث الخاص بالـ Accelerometer sensor
List<Sensor> sensorsList = sensorManager
.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensorsList.size() > 0) {
Sensor sensor = sensorsList.get(0);
sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
} else {
accelerTextView.setText("Accelerometer service not found");
}بالنسبه للـ SensorManager.SENSOR_DELAY_NORMAL فهو يحدد ان يكون التأخير هو التأخير الطبيعى
لان الحدث يتم استقباله بسرعه فلذلك لابد من حدوث تأخير فى عملية استلام الحدث لذلك نقوم باستخدام التأخير العادى
وفى احدى الدوال الخاصه بالـ SensorEventListener وهى الداله onSensorChanged
التى يتم استدعائها فى حين تغير حاله الـ Sensor
عن طريق الكائن event نقوم بالحصول على المصفوفه values التى تحتوى على القيم الثلاثه الخاصه بالـ x , y ,z
فالمكان 0 يحتوى على قيمه التغير فى الـ x
والمكان 1 يحتوى على قيمه التغير فى الـ y
والمكان 2 يحتوى على قيمه التغير فى الـ z
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
}وهذا هو الكود كاملا
package com.jkelany.accelerometer;
import java.util.List;
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.TextView;
public class AccelerometerActivity extends Activity implements
SensorEventListener {
private TextView accelerTextView;
private SensorManager sensorManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init() {
accelerTextView = (TextView) findViewById(R.id.tv_acceler);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensorsList = sensorManager
.getSensorList(Sensor.TYPE_ACCELEROMETER);
if (sensorsList.size() > 0) {
Sensor sensor = sensorsList.get(0);
sensorManager.registerListener(this, sensor,
SensorManager.SENSOR_DELAY_NORMAL);
} else {
accelerTextView.setText("Accelerometer service not found");
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
accelerTextView.setText(String.format("X = %f%nY = %f%nZ = %f%n", x, y,
z));
}
@Override
protected void onPause() {
super.onPause();
sensorManager.unregisterListener(this);
}
}بعض الصور التجربيه للتطبيق
لتحميل الكود الخاص بالمشروع
بالتوفيق ان شاء الله