2010-05-30 3 views
23

Я новичок в Android, я следил за мировым учебным курсом привет и понимал, что происходит. Меня особенно интересует сенсорный экран моего T-Mobile Pulse, поэтому просто для того, чтобы начать меня. Я хочу иметь возможность писать координаты события tocuh на экране, поэтому скажите, что пользователь коснулся координаты 5 , 2 - текстовое изображение на экране отобразило бы это.Получить координаты сенсорного события на Android

В настоящее время у меня есть простая программа, которая просто загружает файл XML, который содержит TextView я намерен написать свои координаты в.

Спасибо заранее, я сделал Google за помощью и искал StackOverflow, но все Я обнаружил, что ушел по голове или не подходит для этого. Приветствия.

ответ

42

Вы можете использовать эту функцию: http://developer.android.com/reference/android/view/View.html#setOnTouchListener(android.view.View.OnTouchListener)

Вы, вероятно, положить его в OnCreate метод примерно таким образом (протестировано на этот раз):

активность 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; 
     } 
    }); 
} 

код макета

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

Редактировать: Я пробовал свой код и действительно было несколько ошибок. Во всяком случае, с макетом, который я вам даю, он работает на моем эмуляторе. Можете ли вы предоставить больше кода/контекста, чтобы я мог понять, что не так?

+0

Вы можете посмотреть на http://stackoverflow.com/questions/2068007/android-how -do-i-get-raw-touch-screen-information для другого решения. –

+0

Я пробовал свой код и делал несколько исправлений, которые мог, но я, к сожалению, не мог заставить его работать. Спасибо, что нашли время, чтобы помочь мне, хотя я не мог заставить его работать (это моя вина за то, что я не знаю Java) – Joe

+0

Большое вам спасибо :) Это работает с удовольствием – Joe

3

Похоже, вы хотите получить события касания от всей области вашего макета для этого конкретного теста. Попробуйте подключить сенсорный прослушиватель к родительскому виду, а не к отдельному целевому представлению.

Это не очень распространенный подход. В большинстве случаев вам нужно прослушивать события касания в определенном дочернем представлении, и если у вас есть другие представления в макете, которые обрабатывают события касания (например, кнопку), они будут иметь приоритет над родительским представлением. См. http://developer.android.com/guide/topics/ui/ui-events.html для получения дополнительных сведений об обработке событий пользовательского интерфейса.

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> 

А в вашей деятельности:

@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

Какие импорта Я хотел бы добавить, потому что я просто получаю ошибки :( Описание \t \t ресурсов Путь \t \t Расположение Тип MotionEvent не может быть разрешен к типу \t \t AndroidTablet.java/AndroidTablet/SRC/joehollo/androidtablet \t линии 22 \t Java Проблема R.layout.touch_viewer не может быть решена \t \t AndroidTablet.java/AndroidTablet/SRC/joehollo/androidtablet \t линия 17 \t Java Проблема Тип нового View.OnTouchListener() {} должен реализовать унаследованный абстрактный метод View .OnTouchListener.onTouch (View, MotionEv ent) \t AndroidTablet.java \t/AndroidTablet/src/joehollo/androidtablet \t строка 21 \t Задача Java – Joe

+0

+1 это работает для меня очень хорошо, спасибо –

0

следующие работы с использованием сенсорного экрана на jetboy образца приложение для Android. Код Джоса работал с одной настройкой, чтобы он сиял на фоне через. Единственная строка я добавил был

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

Благодаря Джо (выше).

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

код макета

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

Исправленная версия без ошибок:

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; 
    } 
} 
Смежные вопросы