2010-05-30 30 views
23

Soy nuevo en Android, he seguido el tutorial de hello world y tengo una idea básica de lo que está pasando. Estoy particularmente interesado en la pantalla táctil de mi T-Mobile Pulse, así que para comenzar quiero poder escribir las coordenadas de un evento de tocuh en la pantalla, por lo que el usuario tocó la coordenada 5 , 2 - una vista de texto en la pantalla mostraría eso.Obtener las coordenadas de un evento táctil en Android

En la actualidad tengo un sencillo programa que acaba de carga un archivo XML que contiene el TextView tengo la intención de escribir las coordenadas en.

gracias de antemano, me hizo Google en busca de ayuda y buscado stackoverflow pero todo Descubrí que o bien se me pasó por la cabeza o que no era adecuado para esto. Aclamaciones.

Respuesta

42

Se puede utilizar esta función: http://developer.android.com/reference/android/view/View.html#setOnTouchListener(android.view.View.OnTouchListener)

Es probable que lo puso en su método onCreate más o menos de esta manera (probado en esta ocasión): Código

Actividad onCreate

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final TextView textView = (TextView)findViewById(R.id.textView); 
    // this is the view on which you will listen for touch events 
    final View touchView = findViewById(R.id.touchView); 
    touchView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      textView.setText("Touch coordinates : " + 
       String.valueOf(event.getX()) + "x" + String.valueOf(event.getY())); 
       return true; 
     } 
    }); 
} 

código de diseño

<?xml version="1.0" encoding="utf-8"?>          
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
<TextView 
    android:id="@+id/touchView" 
    android:background="#f00" 
    android:layout_weight="1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    /> 
<TextView 
    android:id="@+id/textView" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Hello World, TestActivity" 
    /> 
</LinearLayout> 

Editar: Probé mi código y de hecho hubo algunos errores. De todos modos, con el diseño que te doy aquí funciona en mi emulador. ¿Puedes proporcionar más código/contexto para que pueda ver qué sucede?

+0

Es posible que desee ver en http://stackoverflow.com/questions/2068007/android-how -do-get-raw-touch-screen-information para otra solución. –

+0

Probé tu código e hice las pocas correcciones que pude pero lamentablemente no pude hacerlo funcionar. Gracias por tomarse el tiempo para ayudarme aunque no pude hacerlo funcionar (que es mi culpa por no saber realmente Java) – Joe

+0

Muchas gracias :) Eso funciona como un regalo – Joe

3

Parece que desea obtener eventos táctiles de toda el área de su diseño para esta prueba en particular. Intente conectar el oyente táctil a su vista principal en lugar de una vista de destino separada.

Este no es un enfoque muy común. En la mayoría de los casos, querrá escuchar eventos táctiles en una vista secundaria específica y si tiene otras vistas en su diseño que manejan eventos táctiles (como un botón), tendrán prioridad sobre una vista principal. Consulte http://developer.android.com/guide/topics/ui/ui-events.html para obtener más información sobre el manejo de eventos de IU.

Layout (touch_viewer.xml):

<?xml version="1.0" encoding="utf-8" ?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:id="@+id/parent" > 
    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Hello, World!" /> 
</LinearLayout> 

Y en su actividad:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.touch_viewer); 

    final LinearLayout parent = (LinearLayout) findViewById(R.id.parent); 
    final TextView text = (TextView) findViewById(R.id.text); 
    parent.setOnTouchListener(new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent ev) { 
      text.setText("Touch at " + ev.getX() + ", " + ev.getY()); 
      return true; 
     } 
    }); 
} 
+0

lo que importa debo añadir, porque yo estoy haciendo errores :( Descripción de Recursos \t \t Ruta \t \t Localización Tipo MotionEvent no se puede resolver a un tipo \t AndroidTablet.java \t/AndroidTablet/src/joehollo/androidtablet \t línea 22 \t problema de Java R.layout.touch_viewer no se puede resolver \t AndroidTablet.java \t/androidTablet/src/joehollo/androidtablet \t línea 17 \t problema de Java el nuevo tipo View.OnTouchListener() {} debe implementar el método abstracto heredado Ver .OnTouchListener.onTouch (Ver, MotionEv ent) \t AndroidTablet.java \t/AndroidTablet/src/joehollo/androidtablet \t línea 21 \t Problema de Java – Joe

+0

+1 esto funciona muy bien para mí, gracias –

0

Las siguientes obras utilizando una pantalla táctil en la aplicación para Android muestra Jetboy. El código de Joes funcionaba con un ajuste para que brille a través del fondo. La única línea añadí era

android:background="#0000" 
android:layout_height="fill_parent" 
android:layout_height="fill_parent" 

Gracias Joe (arriba).

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    final TextView textView = (TextView)findViewById(R.id.textView); 
    // this is the view on which you will listen for touch events 
    final View touchView = findViewById(R.id.touchView); 
    touchView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      textView.setText("Touch coordinates : " + 
       String.valueOf(event.getX()) + "x" + String.valueOf(event.getY())); 
       return true; 
     } 
    }); 
} 

código de diseño

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <com.android.samples.jetboy.JetBoyView android:id="@+id/JetBoyView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
     <TextView 
       android:id="@+id/touchView" 
       android:background="#0000" 
       android:layout_weight="1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
     /> 
     <TextView 
       android:id="@+id/textView" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:text="Hello World, TestActivity" 
     /> 
</FrameLayout> 
0

La versión corregida y sin los errores:

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.TextView; 
public class MainActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final TextView textView = (TextView) findViewById(R.id.textView); 
     // this is the view on which you will listen for touch events 
     final View touchView = findViewById(R.id.touchView); 
     touchView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       textView.setText("Touch coordinates : " 
         + String.valueOf(event.getX()) + "x" 
         + String.valueOf(event.getY())); 
       return true; 
      } 
     }); 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 
Cuestiones relacionadas