Hola gente hoy veremos un nuevo tutorial de como utilizar el acelerometro en android studio esta sera una guía básica, pero muy ilustrativa.
El producto final seria como les muestro en la siguiente imagen:
Sin mas que decir empezamos con nuestro tutorial.
PASO 1: Diseñamos la interfaz, necesitamos 3 textview para hacer referencia que tipo de coordenada del acelerometro estamos moviéndonos y otros 3 textview para mostrar dichos valores, todo esto sera en nuestro activity_main.xml
activity_main
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.androidmorefast.pc.appacelerometro01.MainActivity"> <TextView android:text="ACELEROMETRO X" android:layout_width="wrap_content" android:layout_height="wrap_content" tools:text="ACELEROMETRO X" android:textColor="#7557C2" android:textSize="20dp" android:textColorHighlight="@color/colorAccent" android:layout_marginBottom="24dp" android:elevation="1dp" android:textStyle="bold"/> <TextView android:text="ACELEROMETRO Z" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView3" tools:text="ACELEROMETRO Z" android:textColor="#7557C2" android:textSize="20dp" android:textColorHighlight="@color/colorAccent" android:layout_marginTop="77dp" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textStyle="bold"/> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtAX" android:layout_marginTop="45dp" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtAZ" android:layout_marginTop="30dp" android:layout_below="@+id/textView3" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> <TextView android:text="ACELEROMETRO Y" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/textView2" tools:text="ACELEROMETRO Y" android:textColor="#7557C2" android:textSize="20dp" android:textColorHighlight="@color/colorAccent" android:layout_marginTop="30dp" android:layout_below="@+id/txtAX" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:textStyle="bold"/> <TextView android:id="@+id/text_toast" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#FFF" android:layout_below="@+id/txtAZ" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="88dp" /> <TextView android:text="TextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="34dp" android:id="@+id/txtAY" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" android:layout_below="@+id/textView2" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> </RelativeLayout>
custom_toast
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/lytLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#E6003A" android:gravity="center" android:orientation="horizontal" android:padding="10dp" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="8dp" android:contentDescription="@string/app_name" android:src="@android:drawable/ic_dialog_info" /> <TextView android:id="@+id/text_toast" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFF" /> </LinearLayout>
Entonces nuestros 2 layout deben que dar como muestro en la siguiente imagen:
PASO 2: Ahora toca la parte de la codificación, aquí tendremos que crear las variables de nuestros textview y luego inicializarlas, en mi caso por default trabaje en la clase MainActivity.java
MainActivity
public class MainActivity extends Activity implements SensorEventListener { private long last_update = 0, last_movement = 0; private float prevX = 0, prevY = 0, prevZ = 0; private float curX = 0, curY = 0, curZ = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} @Override public void onSensorChanged(SensorEvent event) { synchronized (this) { long current_time = event.timestamp; curX = event.values[0]; curY = event.values[1]; curZ = event.values[2]; if (prevX == 0 && prevY == 0 && prevZ == 0) { last_update = current_time; last_movement = current_time; prevX = curX; prevY = curY; prevZ = curZ; } long time_difference = current_time - last_update; if (time_difference > 0) { float movement = Math.abs((curX + curY + curZ) - (prevX - prevY - prevZ)) / time_difference; int limit = 1500; float min_movement = 1E-6f; if (movement > min_movement) { if (current_time - last_movement >= limit) { //Empieza Toast personalizado Toast toast3 = new Toast(getApplicationContext()); LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.custom_toast, (ViewGroup) findViewById(R.id.lytLayout)); TextView txtMsg = (TextView)layout.findViewById(R.id.text_toast); txtMsg.setText("Hay movimiento de "+movement); toast3.setDuration(Toast.LENGTH_SHORT); toast3.setView(layout); toast3.show(); //finaliza Toast personalizado // Toast.makeText(getApplicationContext(), "Hay movimiento de " + movement, Toast.LENGTH_LONG).show(); } last_movement = current_time; } prevX = curX; prevY = curY; prevZ = curZ; last_update = current_time; } ((TextView) findViewById(R.id.txtAX)).setText("--> " + curX); ((TextView) findViewById(R.id.txtAY)).setText("--> " + curY); ((TextView) findViewById(R.id.txtAZ)).setText("--> " + curZ); } } @Override protected void onResume() { super.onResume(); SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER); if (sensors.size() > 0) { sm.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_GAME); } } @Override protected void onStop() { SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE); sm.unregisterListener(this); super.onStop(); } }
Bien con eso hemos terminado todo, espero les haya gustado si tiene alguna duda al respecto puede escribirme en los comentarios o enviarme un correo, recuerden que para darle una mano con sus código deben seguirme en alguna red social o subscribirte a nuestro canal de youtube.
Hola soy Alex Céspedes fundador de ANDROFAST, programo algunas cosas por diversión, me gusta aprender cosas nuevas y estoy pendiente de todo lo que tenga que ver con tecnología. Este blog lo cree para todas las personas que tengan dificultades en la programación, para ser sincero nunca fui bueno y reprobé algunos cursos de programación, pero mis ganas de aprender pudieron más. SI YO PUEDO TU PUEDES ANIMO!