сенсорное событие, когда палец переходит к следующему виду

Я провожу пальцем, и он переходит к следующему виду. Оба представления реализуют setOnTouchListener().

Как узнать, что палец теперь на втором виде.

ACTION_MOVE возвращается для первого просмотра, хотя мой палец находится на втором просмотре.

Нужно ли мне реализовывать какой-либо другой слушатель?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.textview.MainActivity" >

<TextView
    android:id = "@+id/text1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<TextView
    android:id = "@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello_world1" />

<TextView
    android:id = "@+id/text3"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="hello_world2" />

</LinearLayout>

Основная активность.java:

package com.example.textview;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView txt1 = (TextView) findViewById(R.id.text1);
    txt1.setOnTouchListener(new OnTouchListener() {         
        @Override
        public boolean onTouch(View v, MotionEvent e) {
            TextView txt1 =  (TextView) findViewById(v.getId());
            Log.d("txt1.getText()",txt1.getText().toString());
            return false;
        }
    });

     txt1 = (TextView) findViewById(R.id.text2);
    txt1.setOnTouchListener(new OnTouchListener() {         
        @Override
        public boolean onTouch(View v, MotionEvent e) {
            TextView txt1 =  (TextView) findViewById(v.getId());
            Log.d("txt1.getText()",txt1.getText().toString());
            return false;
        }
    });


     txt1 = (TextView) findViewById(R.id.text3);
    txt1.setOnTouchListener(new OnTouchListener() {         
        @Override
        public boolean onTouch(View v, MotionEvent e) {
            TextView txt1 =  (TextView) findViewById(v.getId());
            Log.d("txt1.getText()",txt1.getText().toString());
            return false;
        }
    });
}

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

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

person user4057066    schedule 28.04.2015    source источник


Ответы (2)


Вы можете проверить, что текущее событие MotionEvent x и y находится во 2-м поле просмотра.

            Rect viewHitRect = new Rect();
        secondView.getHitRect(viewHitRect);
        if(viewHitRect.contains((int) motionEvent.getX(), (int) motionEvent.getY())) {//You are in 2nd view}
person Manish    schedule 28.04.2015
comment
Мои текстовые представления добавляются динамически. После создания нового я добавляю setOnTouchListener - person user4057066; 28.04.2015
comment
В этом случае здесь вы можете получить хитрект для первого просмотра, по которому вы будете знать, вышел ли палец из первого просмотра. - person Manish; 28.04.2015
comment
да. Но я добавляю 26 просмотров в цикл for. - person user4057066; 28.04.2015

Когда палец приближается к textview2, он получает ACTION_HOVER_ENTER и

textview1 получит ACTION_HOVER_EXIT

Проверьте эти параметры, ACTION_MOVE будет передано textview1, как вы упомянули, но параметр hover четко определяет, какой textfield в данный момент находится под контролем.

ОБНОВЛЕНИЕ:

Если щелкнуть пальцем по views, вы получите ACTION_DOWN на textview2 и параллельно textview1 получите ACTION_UP.

person Kushal    schedule 28.04.2015
comment
Палец нажат и не зависает на экране. Все еще будет вызываться событие hover? - person user4057066; 28.04.2015
comment
Я обновил свой ответ .. Пожалуйста, проверьте .. если щелкнуть пальцем, вы получите событие ACTION_HOVER -> ACTION_DOWN одно за другим - person Kushal; 28.04.2015
comment
да. Но в моем случае палец нажимается на view1. Теперь, не двигая пальцем вверх, я перетащил палец, и он находится на втором виде. Как справиться с этим. - person user4057066; 28.04.2015
comment
Когда ваш палец выходит из поля зрения 1, вы получите ACTION_UP для представления 1... когда вы войдете в представление 2, вы получите ACTION_HOVER_ENTER для представления 2.. проверьте это, поместив журналы в эти события внутри прослушивателя - person Kushal; 28.04.2015
comment
Другие представления не получают никаких событий касания. Событие получает только тот вид, на который был нажат палец. Когда палец перетаскивался на другие представления, они не получали никаких событий касания. Будут ли они получать какое-то другое событие? - person user4057066; 28.04.2015