我想將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
感謝您的幫助我已閱讀文檔和其他一些帖子,我現在感覺它與導航抽屜有關。因爲它的打開和關閉使用滑動手勢,所以我認爲它通過手勢劫持 – user3147200
如果這是'DrawerLayout'的問題。我認爲你可以創建一個從'DrawerLayout'擴展的新類。之後,您可以重寫'onTouchEvent(MotionEvent)'方法,具體取決於您可以通過使用[View.dispatchTouchEvent(MotionEvent)](https://)調用另一個視圖的''onTouchEvent(MotionEvent)'方法'MotionEvent' developer.android.com/reference/android/view/View.html#dispatchTouchEvent(android.view.MotionEvent))。 –