2016-12-21 9 views
0

У меня есть вид внутри NestedScrollView. При просмотре этого представления я должен найти направление движения. Независимо от того, стрептали ли вы вверх или вниз. Как я могу найти это.Как найти затронутые и освобожденные позиции вида

То, что я пытался есть, я добавил OnTouchListener к виду, и я думал, что найти разницу между motionEvent.getY() в MotionEvent.ACTION_DOWN и MotionEvent.ACTION_UP.

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

public boolean onTouch(View view, MotionEvent motionEvent) { 
    switch (motionEvent.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      log("Down"); 
      break; 
     case MotionEvent.ACTION_UP: 
      log("up"); 
      break; 

    } 
    return true; 
} 

private void log(String s) { 
    Log.d(DEBUG_TAG, "" + s); 
} 

case MotionEvent.ACTION_UP Здесь никогда не происходит, когда я красть и отпустить.

Каков наилучший способ решения моей проблемы?

Вот мой полный код

public class MainActivity extends AppCompatActivity { 
private static final String DEBUG_TAG = MainActivity.class.getSimpleName(); 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final NestedScrollView nestedScrollView = (NestedScrollView) findViewById(R.id.scroll); 
    nestedScrollView.setSmoothScrollingEnabled(true); 
    View layout1 = findViewById(R.id.layout1); 
    layout1.setOnDragListener(new View.OnDragListener() { 
     @Override 
     public boolean onDrag(View view, DragEvent event) { 
      int action = event.getAction(); 
      int start_x; 
      int start_y; 
      int end_x; 
      int end_y; 

      switch (action) { 

       case DragEvent.ACTION_DRAG_ENTERED: 
        return false; 

       case DragEvent.ACTION_DRAG_EXITED: 
        return false; 

       case DragEvent.ACTION_DRAG_STARTED: 
        start_x = (int) event.getX(); 
        start_y = (int) event.getY(); 
        log("touched"); 
        return true; 

       case DragEvent.ACTION_DRAG_LOCATION: 
        return false; 

       case DragEvent.ACTION_DROP: 
        return false; 

       case DragEvent.ACTION_DRAG_ENDED: 
        end_x = (int) event.getX(); 
        end_y = (int) event.getY(); 
        log("released"); 
        break; 

       default: 
        return true; 

      } 
      return true; 
     } 
    }); 
} 

private void log(String s) { 
    Log.d(DEBUG_TAG, "" + s); 
} 

} 

XML является

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
android:id="@+id/activity_root_view" 
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:orientation="vertical" 
tools:context="com.test.test.MainActivity"> 
<android.support.v4.widget.NestedScrollView 
    android:id="@+id/scroll" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <RelativeLayout 
     android:id="@+id/root_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <LinearLayout 
      android:id="@+id/layout1" 
      android:layout_width="match_parent" 
      android:layout_height="1000dp" 
      android:background="@color/colorAccent" 
      android:gravity="center" 
      android:orientation="vertical"> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="PAGE 1"/> 


     </LinearLayout> 
     <LinearLayout 
      android:id="@+id/layout2" 
      android:layout_width="match_parent" 
      android:layout_height="1000dp" 
      android:layout_below="@id/layout1" 
      android:background="@color/colorPrimaryDark" 
      android:gravity="center" 
      android:orientation="vertical"> 
      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="PAGE 2"/> 
     </LinearLayout> 

    </RelativeLayout> 
    </android.support.v4.widget.NestedScrollView> 
</LinearLayout> 
+0

Вы смотрели на это? http://techin-android.blogspot.co.il/2011/11/swipe-event-in-android-scrollview.html – baselsader

ответ

0

Вы можете попробовать draglistener, без реализации теневую интерфейса:

View.OnDragListener dragListener = new View.OnDragListener() { 
     @Override 
     public boolean onDrag(View v, DragEvent event) { 

      int action = event.getAction(); 
      int start_x; 
      int start_y; 
      int end_x; 
      int end_y; 

      switch (action) { 

       case DragEvent.ACTION_DRAG_ENTERED: 
        return false; 

       case DragEvent.ACTION_DRAG_EXITED: 
        return false; 

       case DragEvent.ACTION_DRAG_STARTED: 
        start_x = event.getX(); 
        start_y = event.getY(); 
        return true; 

       case DragEvent.ACTION_DRAG_LOCATION: 
        return false; 

       case DragEvent.ACTION_DROP: 
        return false; 

       case DragEvent.ACTION_DRAG_ENDED: 
        end_x = event.getX(); 
        end_y = event.getY(); 
        break; 

       default: 
        return true; 

      } 
      return true; 
     } 
    }; 

    layout.setOnDragListener(dragListener); 
+0

попробовал. но тот же результат. 'DragEvent.ACTION_DRAG_ENDED:' происходит только при однократном нажатии. не при перетаскивании и освобождении – Drd

+0

Можете ли вы разместить свой макет xml, чтобы я мог понять, какой вид получает сенсорный исполнитель? – baselsader

+0

добавлен полный код – Drd