ScrollView и TouchListener

Ответить
SKR
Сообщения: 13
Зарегистрирован: 30 мар 2012, 09:54
Откуда: Россия, респ. Мордовия, пгт. Торбеево

ScrollView и TouchListener

Сообщение SKR » 28 апр 2012, 14:48

Всем добрый день, очень нужна ваша квалифицированная помощь.
Создаю приложение Anekdot Reader: http://4pda.ru/forum/index.php?showtopic=334581
Дело в том, что анекдоты выводятся в TextView (id=text), а этот TextView находится в ScrollView. Мне необходимо одновременно обрабатывать TouchListener (для слайда вперед - назад) и ScrollView (вверх - вниз), как мне это осуществить?

Вот layout единственного Activity:

Изображение

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    android:gravity="bottom|center_horizontal|top"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:background="@color/serii"
        android:orientation="horizontal" >

        <Spinner
            android:id="@+id/spinner1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:background="@color/serii"
        android:gravity="right"
        android:orientation="horizontal" >

        <SeekBar
            android:id="@+id/seek"
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1" />
    </LinearLayout>


    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="8dp"
        android:layout_weight="1" >

        <ScrollView
            android:id="@+id/SCROLLER_ID"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="5dp"
            android:fillViewport="true"
            android:scrollbars="vertical" >

            <TextView
                android:id="@+id/text"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scrollbarAlwaysDrawVerticalTrack="true"
                android:scrollbars="vertical"
                android:smoothScrollbar="true"
                android:textColor="@color/BLACK"
                android:text=""
                android:textSize="15dp" />
        </ScrollView>

    </FrameLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:gravity="center_horizontal"
        android:orientation="horizontal" >

        <ImageButton
            android:id="@+id/previous"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:background="@drawable/button"
            android:src="@drawable/back"
            android:text="<" >
        </ImageButton>

        <TextView
            android:id="@+id/kolvo"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="0 из 0"
            android:background="@drawable/button"
            android:textColor="@color/WHITE" />

        <ImageButton
            android:id="@+id/next"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:background="@drawable/button"
            android:src="@drawable/forward"
            android:text=">" >
        </ImageButton>
    </LinearLayout>

</LinearLayout>
Отрывки из кода:

Код: Выделить всё

public class Start extends Activity implements SeekBar.OnSeekBarChangeListener,
		OnClickListener, OnTouchListener {
	TextView text;
	ScrollView mScrollView;

	@Override
	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		LinearLayout mainLayout = (LinearLayout) findViewById(R.id.main);
		mScrollView = (ScrollView) findViewById(R.id.SCROLLER_ID);
                text = (TextView) findViewById(R.id.text);
                text.setOnTouchListener(this);
		mainLayout.setOnTouchListener(this);
			}

	float x,y;
	public boolean onTouch(View view, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
		x = event.getX();
		y = event.getY();
		break;
		case MotionEvent.ACTION_UP:
		if (Math.abs(event.getX() - x) > Math.abs(event.getY() - y)) 
			if (event.getX() < x)
			moveToNext();
		else 
			moveToPrevious();
		break;}
		return true;
	}
	
	}

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: ScrollView и TouchListener

Сообщение KamiSempai » 02 май 2012, 12:05

Для mScrollView нужно тоже установить OnTouchListener. Для text можно не ставить, все равно будет работать.

Код: Выделить всё

mScrollView.setOnTouchListener(this);
А в методе onTouch стоит возвращать false а не true, тогда обработка нажатия на этом не закончится а пойдет дальше, и mScrollView будет скролиться.

PS: Помимо проверки "(Math.abs(event.getX() - x) > Math.abs(event.getY() - y))" можно еще добавить проверку на дальность смещения пальца "(Math.abs(event.getX() - x) > MIN_X)" это поможет избежать случайного перелистывания при очень малом изменении Х.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

SKR
Сообщения: 13
Зарегистрирован: 30 мар 2012, 09:54
Откуда: Россия, респ. Мордовия, пгт. Торбеево

Re: ScrollView и TouchListener

Сообщение SKR » 02 май 2012, 15:01

KamiSempai, спасибо, так пробовал сделать, но тогда не листается вверх-вниз =(

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: ScrollView и TouchListener

Сообщение KamiSempai » 02 май 2012, 15:15

А Вы пробовали сделать так?
KamiSempai писал(а):...А в методе onTouch стоит возвращать false а не true, тогда обработка нажатия на этом не закончится а пойдет дальше, и mScrollView будет скролиться.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

SKR
Сообщения: 13
Зарегистрирован: 30 мар 2012, 09:54
Откуда: Россия, респ. Мордовия, пгт. Торбеево

Re: ScrollView и TouchListener

Сообщение SKR » 02 май 2012, 16:05

KamiSempai, извините, пропустил! Спасибо за помощь!

Аватара пользователя
petrovichtim
Сообщения: 77
Зарегистрирован: 11 фев 2014, 22:53
Откуда: Москва
Контактная информация:

Re: ScrollView и TouchListener

Сообщение petrovichtim » 25 фев 2014, 10:47

Добрый день дорогие товарищи!
Помогите оживить процедуру онточ в моей активности.
Вот она

Код: Выделить всё

@Override
	public boolean onTouchEvent(MotionEvent event) {
		int count = event.getPointerCount();
		if (count == 1) {
			switch (event.getAction()) {
			case MotionEvent.ACTION_DOWN:
				fromPosition = (int) event.getX();
				return true;
			case MotionEvent.ACTION_MOVE:
				toPosition = (int) event.getX();
				if ((fromPosition + 150) < toPosition) {
					// right
					fromPosition = toPosition;
					finish();
				}
				return true;
			}
		}
		return super.onTouchEvent(event);
	}
Вот код разметки

Код: Выделить всё

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TableLayout
        android:id="@+id/tlTable01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#CCC"
        android:paddingLeft="1dp"
        android:paddingRight="1dp"
        android:paddingTop="1dp"
        android:shrinkColumns="*"
        android:stretchColumns="*" >

        <TableRow
            android:background="#CCC"
            android:paddingBottom="1dp"
            android:paddingRight="1dp" >

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_marginLeft="1dp"
                android:background="#FFF"
                android:gravity="left"
                android:padding="5dp"
                android:text="Спасибо!" />
В зависимости от условий работы я в этой активности устанавливаю каждый раз нужную разметку, сейчас их 10 а будет 30
Выставляю вот так

Код: Выделить всё

public class ViewActivity extends Activity {
	float fromPosition;
	float toPosition;
	public static String Name_item;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (Name_item.equals("Знакомство")) {
			setTitle(Name_item);
			setContentView(R.layout.l_znakomstvo);
		}
Подскажите как привязывать обработку на ту разметку , которая уже в активити стоит?

Ответить