有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java没有GestureDetector的实现可以在安卓应用程序上运行

我正在尝试向我的应用程序中的活动添加手势检测器。我在youtube上尝试了几种不同的方法,但都没有奏效。当我滑动或使用任何手势时,不会显示任何错误,也不会发生任何事情。我一直都在调试日志,没有人在logcat中注册,我现在完全没有想法了。我主要感兴趣的是onFling()方法

我提出了两种我尝试过的方法。我已经删除了一些代码,并对其进行了更改,使其更易于阅读和相关

如果有人能帮忙,我很高兴

<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent"
    xmlns:app="http://schemas.安卓.com/apk/res-auto"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓: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
        安卓:id="@+id/toolbar"
        layout="@layout/toolbar"/>


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


         <RelativeLayout 
        安卓:layout_width="match_parent"
        安卓:layout_height="match_parent">

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


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

    </RelativeLayout>

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


</安卓.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

共 (1) 个答案

  1. # 1 楼答案

    Concerning to the document of onTouchEvent(event) method:“在触摸屏事件未被其下的任何视图处理时调用。这对于处理发生在窗口边界之外的触摸事件非常有用,因为没有视图接收它。”。因此,您应该检查:

    1. 是否有一个子视图处理了活动中的事件(这意味着该子视图的onTouchEvent(event)方法返回) “正确””。如果没有,请转到第2个

    2. 应返回活动的onTouchEvent(事件)方法 “正确”。(根据文档:“如果您有 已消费事件,如果没有,则为false。默认实现 始终返回false“->;使用return super.onTouchEvent(event);始终返回“false

    希望它能帮助你