2017-09-09 52 views
0

我想將GestureDetector添加到我的應用程序中的某個活動。我已經嘗試了幾種不同的方法從youtube和stackoverflow沒有工作。當我滑動或使用任何手勢時,沒有錯誤顯示,也沒有任何反應。我已經把調試日誌一路走來,沒有一個在logcat中註冊,現在所有的想法都沒有了。這是我主要感興趣的onFling()方法。沒有實現GestureDetector將在Android應用程序上工作

我正在嘗試兩種方法。我已經刪除了一些代碼並將其改爲使更多的讀者友好且相關。

如果有人可以幫助Id很高興。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical"> 

    <!-- LinearLayout has two children, Toolbar & DrawerLayout. 
      DrawerLayout has two children RelativeLayout (main content container) 
      LinearLayout is the root element so the Navigationdrawer does not open over the Toolbar. 
      The DrawerLayout was the root element before this.--> 


    <!-- adding the toolbar layout --> 
    <include 
     android:id="@+id/toolbar" 
     layout="@layout/toolbar"/> 


<android.support.v4.widget.DrawerLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/mainDrawerLayout"> 


     <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <ImageView 
     android:id="@+id/backgroundImg" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="centerCrop" 
     android:src="@drawable/nipple" 
     android:contentDescription="@string/content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 


      <TextView android:id="@+id/main_tv" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:padding="10dp" 
       android:gravity="center" 
       android:text="Hello"/> 

    </RelativeLayout> 

    <fragment android:id="@+id/fragment_navigation_drawer" 
     android:layout_width="280dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     app:layout="@layout/fragment_navigation_drawer" 
     android:name="com.ansgar.amazingfacts.activities.FragmentNavigationDrawer" 
     tools:layout="@layout/fragment_navigation_drawer"/> 


</android.support.v4.widget.DrawerLayout> 
    </LinearLayout> 

方法1定義定製偵聽器類

public class MainActivity extends AppCompatActivity implements FragmentNavigationDrawer.FragmentNavigationDrawerListener { 
    private ImageView image; 
    private TextView mTextView; 
    private Toolbar mToolbar; 
    private FragmentNavigationDrawer drawerFragment; 
    GestureDetectorCompat gesture; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     image = (ImageView) findViewById(R.id.backgroundImg); 
     mTextView = (TextView) findViewById(R.id.main_tv); 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     //Fragment for navigation drawer 
     drawerFragment = (FragmentNavigationDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
     //This method is created because we need to pass a few things from MainActivity to the FragmentNavigationDrawer 
     drawerFragment.sepUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(mainDrawerLayout), mToolbar); 
     drawerFragment.setDrawerListener(this); 

     this.gesture = new GestureDetectorCompat(this, new CustomGestureClass()); 

    }//onCreate() 



    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.gesture.onTouchEvent(event); 
     Log.d("GESTURE", "OnTouchEvent"); 
     Toast.makeText(getApplicationContext(), "Touch event", Toast.LENGTH_SHORT).show(); 
     return super.onTouchEvent(event); 
    } 


     class CustomGestureClass extends GestureDetector.SimpleOnGestureListener { 
      //SimpleOnGestureListener is listener for what we want to do and how 

      @Override 
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
       //return super.onFling(e1, e2, velocityX, velocityY); 
       Log.d("GESTURE", "OnFling"); 
       float sensitivity = 50; 
       //swipe left check 
       if (e1.getX() - e2.getX() > sensitivity) { 
        Log.d("GESTURE", "swipe left"); 
        return true; 
       } 

       //swipe right check 
       if (e2.getX() - e1.getX() > sensitivity) { 
        Log.d("GESTURE", "Swipe Right"); 
        Toast.makeText(getApplicationContext(), "Swipe right gesture", Toast.LENGTH_SHORT).show(); 
        return true; 
       } 

       //swipe check down 
       if (e1.getY() - e2.getY() > sensitivity) { 
        Log.d("GESTURE", "Swipe Down"); 
        Toast.makeText(getApplicationContext(), "Swipe down gesture", Toast.LENGTH_SHORT).show(); 
        return true; 
       } 

       //swipe up check 
       if (e2.getY() - e1.getY() > sensitivity) { 
        Log.d("GESTURE", "Swipe Up"); 
        Toast.makeText(getApplicationContext(), "Swipe up gesture", Toast.LENGTH_SHORT).show(); 
        return true; 
       } 

       return true; 
       //return false; 
      } 

      @Override 
      public boolean onDown(MotionEvent e) { 
       Log.d("GESTURE", "OnDown"); 
       //return super.onDown(e); 
       return true; 
      } 
     }//CustomGestureClass 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 

    } 

    //setting the title of actionBar 
    public void setTitle(String title){ 
     getSupportActionBar().setTitle(title); 
    } 

    public void onCreateDrawer() {} 

    @Override 
    public void onDrawerItemSelected(View view, int position){ 
     displayView(position); 
     //Log.d("DRAWER ITEM SELECTED", "the index number of item Drawer RecyclerView "+ position); 
     switch(position){ 

      case 0: 
       break; 
     } 
    } 

    private void displayView(int position) {} 

}//MainActivity.class 

方法2

public class MainActivity extends AppCompatActivity implements FragmentNavigationDrawer.FragmentNavigationDrawerListener, 
    GestureDetector.OnGestureListener { 

    private ImageView image; 
    private TextView mFactTextView; 
    private Toolbar mToolbar; 
    private FragmentNavigationDrawer drawerFragment; 
    GestureDetectorCompat gesture; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     image = (ImageView) findViewById(R.id.backgroundImg); 
     mTextView = (TextView) findViewById(R.id.main_tv); 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(mToolbar); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 
     //Fragment for navigation drawer 
     drawerFragment = (FragmentNavigationDrawer) getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer); 
     //This method is created because we need to pass a few things from MainActivity to the FragmentNavigationDrawer 
     drawerFragment.sepUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(mainDrawerLayout), mToolbar); 
     drawerFragment.setDrawerListener(this); 


     this.gesture = new GestureDetectorCompat(this, this); 

    }//onCreate() 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     this.gesture.onTouchEvent(event); 
     Log.d("GESTURE", "OnTouchEvent"); 
     Toast.makeText(getApplicationContext(), "Touch event", Toast.LENGTH_SHORT).show(); 
     return super.onTouchEvent(event); 
    } 


    @Override 
    public boolean onDown(MotionEvent e) { 
     Log.d("GESTURE", "OnDown"); 
     return true; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     Log.d("GESTURE", "OnShowPress"); 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     Log.d("GESTURE", "OnSingleTapUp"); 
     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     Log.d("GESTURE", "OnScroll"); 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     Log.d("GESTURE", "OnLongPress"); 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     Log.d("GESTURE", "OnFling"); 
     return true; 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    public void onCreateDrawer() {} 


    @Override 
    public void onDrawerItemSelected(View view, int position){ 
     displayView(position); 
     //Log.d("DRAWER ITEM SELECTED", "the index number of item Drawer RecyclerView "+ position); 
     switch(position){ 
      case 0: 
       break; 
     } 
    } 

    private void displayView(int position) {} 


}//MainActivity.class 

回答

0

Concerning to the document of onTouchEvent(event) method當觸摸屏事件沒有被任何的其下的觀點處理調用。這對於處理髮生在窗口範圍之外的觸摸事件非常有用,在那裏沒有接收它的視圖。「」。所以,你應該檢查:

  1. 有是已處理的活動或沒有的情況下(這意味着該子視圖的onTouchEvent(事件)方法返回 「」)子視圖。如果沒有,請轉到2號

  2. 應當返還活動的的onTouchEvent(事件)方法 「」(根據文件:「如果你有 消耗的事件返回true,如果假你還沒有默認實現 總是返回false 「 - >使用return super.onTouchEvent(event);總是返回」 「)

希望它可以幫助你

+0

感謝您的幫助我已閱讀文檔和其他一些帖子,我現在感覺它與導航抽屜有關。因爲它的打開和關閉使用滑動手勢,所以我認爲它通過手勢劫持 – user3147200

+0

如果這是'DrawerLayout'的問題。我認爲你可以創建一個從'DrawerLayout'擴展的新類。之後,您可以重寫'onTouchEvent(MotionEvent)'方法,具體取決於您可以通過使用[View.dispatchTouchEvent(MotionEvent)](https://)調用另一個視圖的''onTouchEvent(MotionEvent)'方法'MotionEvent' developer.android.com/reference/android/view/View.html#dispatchTouchEvent(android.view.MotionEvent))。 –

相關問題