2014-09-24 6 views
0

У меня есть linearLayout и scrollView в моей деятельности. Я хочу сделать следующее: когда я прокручу вниз - скройте linearLayout и когда я прокручу вверх - покажу это. Я прочитал This article, и я пытаюсь сделать ложь, но onScrollChanged называется все время, когда я нажимаю палец на экран, и это плохое решение, как я думаю.Скрыть вид, когда scrollViews прокручивается вниз

Тогда я пытаюсь сделать следующий:

public class CustomScrollView extends ScrollView { 

Context context; 
public void setContext(Context c) { 
    this.context = c; 
} 

public CustomScrollView(Context context) { 
    super(context); 
} 

public CustomScrollView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()){ 

     case MotionEvent.ACTION_DOWN: 
      Log.d("myLogs", "Down "); 
      hidePanel(); 
      break; 
     case MotionEvent.ACTION_UP: 
      Log.d("myLogs", "Up "); 
      showPanel(); 
      break; 

    } 
    return super.onTouchEvent(ev); 
} 
} 

Но горю не работал правильно, когда я двигаю прокрутки вверх - я получить вверх вверх вниз ЭСТ.

Я буду рад за любые идеи, как сделать это

Отредактировано: Стараюсь:

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_MOVE: 
      final int threashold = 70; 
      if (mLastY - ev.getY() > threashold) { 
       Log.v("teste", "moving up"); 
       mLastY = ev.getY(); 
      } else if (mLastY - ev.getY() < -threashold) { 
       Log.v("teste", "moving down"); 
       mLastY = ev.getY(); 
      } 
    } 
    return super.onTouchEvent(ev); 
} 

Когда я прокручивать вверх я получил:

09-24 20:22:04.568  497-497/khuta.freeturn V/teste﹕ moving down 
09-24 20:22:04.668  497-497/khuta.freeturn V/teste﹕ moving up 
09-24 20:22:04.688  497-497/khuta.freeturn V/teste﹕ moving up 

Когда я прокрутите вниз я получил:

09-24 20:24:44.559  497-497/khuta.freeturn V/teste﹕ moving up 
09-24 20:24:44.719  497-497/khuta.freeturn V/teste﹕ moving down 
09-24 20:24:44.809  497-497/khuta.freeturn V/teste﹕ moving down 
+0

Как мы должны знать, как выглядит ваш макет? –

+0

не имеет значения для этой ситуации. –

+0

Если вы так говорите ... Я не знаю, как выглядит ваш макет, поэтому я не могу сказать вам, как скрыть линейный вывод, который я даже не знаю, находится ли он внутри scrollview или снаружи. Но если вы собираетесь использовать onTouchEvent, убедитесь, что вы сохранили свою позицию y в Action_down и по сравнению с action_move и проверьте, прокручиваете ли вы вверх или вниз. –

ответ

2

Используйте if, если вы делаете все, что хотите.

switch (ev.getAction()) { 
case MotionEvent.ACTION_DOWN: 
    mLastY = event.getY(); 
    break; 
case MotionEvent.ACTION_MOVE: 
    final int threashold = 50; 
    if(mLastY-motionEvent.getY()>threashold) 
    { 
     Log.v("teste","moving up"); 
     mLastY = motionEvent.getY(); 
    }else if(mLastY-motionEvent.getY()<-threashold){ 
     Log.v("teste","moving down"); 
     mLastY = motionEvent.getY(); 
    } 
} 
+0

mLastY должно быть 0 в первый раз? –

+0

Да. И должно быть определено глобально. –

+0

ОК, я попробую сейчас. –

1
MotionEvent.ACTION_DOWN 

не означает, что вид прокручивается вниз. Как это работает, когда вы касаетесь пальца сначала на экране, тогда MotionEvent.ACTION_DOWN запускается, и когда вы его удаляете, вызывается MotionEvent.ACTION_UP. Итак, что вам нужно сделать, начните отслеживать, когда начнете касаться экрана и используйте эту информацию, когда вы удалите палец.

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

Смежные вопросы