• 0
com.jkelany

كيفية التعامل مع الحساس Accelerometer فى الاندرويد والحصول قيم الابعاد الثلاثة

سؤال

السلام عليكم ورحمه الله وبركاته

ان شاء الله اليوم هنشرح مع بعض

كيفيه التعامل مع الـ Accelerometer فى الاندرويد

وهى جهاز حساس بحركه الجهاز فى الثلاث اتجاهات x , y ,z الطول والعرض والارتفاع

فيمكن مثلا عمل لعبه تقوم عن طريق استخدام هذا الجهاز فى تحريك احد اجزاء اللعبه

مثل هذه اللعبه الموجودة فى موبيل الـ HTC

post-217802-031365600 1349900057_thumb.j

هذه اللعبه تتعامل مع ان تقوم بتحريك الكره عن طريق حرتك بالموبيل ميلا للاعلى وللاسفل كى تتفادى الوقع فى الحفرة

وصولا للهدف

فهذه اللعبه مبنيه على استخدام الـ 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);
}
}

بعض الصور التجربيه للتطبيق

post-217802-027455600 1349900763_thumb.p

post-217802-001736800 1349900765_thumb.p

لتحميل الكود الخاص بالمشروع

TestAccelerometer.zip

بالتوفيق ان شاء الله

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

1 إجابات على هذا السؤال .

  • 0

السلام عليكم

في حالة هذه اللعبة لن يفيدك استخدام الحساس TYPE_ACCELEROMETER لان هذه الحساس وظيفته قياس التسارع للجهاز يعني في حالة عدم تحريك الجهاز سيتكون القيم صفر ، وفي حال التحريك في احد الاتجاهات سيبدا التسارع في الزيادة كلما زادت سرعة الحركة والعكس صحيح ولن يكون دقيق ،يعني لو قمت بامالة الجهاز لاي جهة ثم توقفت ستعود القيم صفر مرة اخرى وهو في حالة دوران او إمالة ، لذلك في هذه الحال يجب استخدام الحساس الخاص بالاتجاهات TYPE_ORIENTATION .

تحياتي لك ولكن للتوضيح فقط .

تحياتي

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .