الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

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

بدأه Mahmoud Kelany في 10 أكتوبر 2012 · 1 رد · 3,088 مشاهدة · في Android
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

كيفيه التعامل مع الـ 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

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

المرفقات
Teeter-mod1.jpgdevice-2012-10-05-015916.pngdevice-2012-10-05-015931.png

Software Developer
Mahmoudkelany.com


 

#2

السلام عليكم

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

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

تحياتي

1

الإنسان الذي يقول بأنه لا يمكن عمل شيء يجب ألا يعيق مطلقاً الإنسان الذي يقوم بعمل ذلك الشيء.

إن تخطئ فأنت إنسان ... أما أن تلوم جهازك الكمبيوتر على خطأك فهذا أكثر إنسانية.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…