web-dev-qa-db-fra.com

Obtenez les coordonnées d'un événement tactile sur Android

Je suis nouveau sur Android, j'ai suivi le didacticiel Bonjour tout le monde et j'ai une idée de base de ce qui se passe. L'écran tactile de mon T-Mobile Pulse m'intéresse particulièrement. Par conséquent, je veux pouvoir écrire les coordonnées d'un événement tocuh à l'écran. Supposons donc que l'utilisateur a touché la coordonnée 5 , 2 - un texte affiché à l’écran l’affiche.

À l’heure actuelle, j’ai un programme simple qui ne fait que charger un fichier xml contenant la vue texte dans laquelle j’ai l’intention d’écrire les coordonnées.

Merci d’avance, j’ai demandé de l’aide à Google et j’ai effectué une recherche dans stackoverflow, mais tout ce que j’ai trouvé m’arrivait trop ou ne convenait pas à cela. À votre santé.

24
Joe

Vous pouvez utiliser cette fonction: http://developer.Android.com/reference/Android/view/View.html#setOnTouchListener(Android.view.View.OnTouchListener)

Vous allez probablement le mettre dans votre méthode onCreate à peu près de cette façon (testé cette fois):

Activité sur Créer du code

@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;
        }
    });
}

code de mise en page

<?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>

Edit: J'ai essayé mon code et il y a eu quelques erreurs. Quoi qu'il en soit, avec la mise en page que je vous donne ici, cela fonctionne sur mon émulateur. Pouvez-vous fournir peut-être plus de code/contexte afin que je puisse voir ce qui ne va pas?

42
Gautier Hayoun

Il semble que vous souhaitiez obtenir des événements tactiles de toute la zone de votre mise en page pour ce test particulier. Essayez d’attacher l’écouteur tactile à votre vue parent plutôt qu’à une vue cible distincte.

Ce n'est pas une approche très commune. Dans la plupart des cas, vous souhaiterez écouter les événements tactiles dans une vue enfant spécifique. Si votre présentation comporte d'autres vues qui gèrent les événements tactiles (tels qu'un bouton), elles auront priorité sur une vue parent. Voir http://developer.Android.com/guide/topics/ui/ui-events.html pour plus d'informations sur la gestion des événements de l'interface utilisateur.

Mise en page (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>

Et dans votre activité:

@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;
        }
    });
}
3
adamp

Les travaux suivants utilisent un écran tactile sur l’exemple d’application Android jetboy . Le code Joes a fonctionné avec un Tweak pour le faire briller à l’arrière-plan . La seule ligne que j’ai ajoutée est la suivante: 

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

Merci Joe (ci-dessus).

@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;
        }
    });
}

code de mise en page

<?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
user407749

La version corrigée sans les erreurs:

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;
    }
}
0
Karthik S