为什么onInterceptTouchEvent会覆盖所有触摸事件

时间:2014-10-23 04:41:34

标签: android android-viewpager

我有一个viewpager和几个片段。我扩展了一个ViewPager并实现了一个我自己的类。我也实现了onInterceptTouchEvent方法。现在我刷它不起作用。我认为onInterceptTouchEvent拦截它们。如何处理?

  package com.android.ho;

import com.sph.custom.ViewPagerWithTapGestreDetection;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class PDFActivity extends FragmentActivity implements ImageOnTapCallback,OnPageChangeListener{
    static final int ITEMS = 20;
    MyAdapter mAdapter;
    //ViewPager mPager;
    ViewPagerWithTapGestreDetection mPager;
    //ViewPager mPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_pager);
        try {
            mAdapter = new MyAdapter(getSupportFragmentManager());
            mPager = (ViewPagerWithTapGestreDetection) findViewById(R.id.pager);
            mPager.setId(5000);
            mPager.setImageOnTapCallback(this); 
            mPager.setAdapter(mAdapter);
            //mPager.setOffscreenPageLimit(1);      
            mPager.setOnPageChangeListener(this);

            /*
            Button button = (Button) findViewById(R.id.first);
            button.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    mPager.setCurrentItem(0);
                }
            });
            button = (Button) findViewById(R.id.last);
            button.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    mPager.setCurrentItem(ITEMS - 1);
                }
            });
            */

            mPager.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    Log.e("Inside onTouch onTouch onTouch onTouch onTouch onTouch ", "onTouch");

                    return false;
                }
            });


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

        public static class MyAdapter extends FragmentStatePagerAdapter {
        public MyAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }


        @Override
        public int getCount() {
            return ITEMS;
        }

        @Override
        public Fragment getItem(int position) {


            switch (position) {
            case 0: // Fragment # 0 - This will show image
                return MyFragment.newInstance("1.pdf");
            case 1: // Fragment # 1 - This will show image
                return MyFragment.newInstance("2.pdf");
            case 2: // Fragment # 1 - This will show image
                return MyFragment.newInstance("3.pdf");
            case 3: // Fragment # 1 - This will show image
                return MyFragment.newInstance("4.pdf");
            case 4: // Fragment # 1 - This will show image
                return MyFragment.newInstance("5.pdf");
            default:// Fragment # 2-9 - Will show list
                return MyFragment.newInstance("1.pdf");
            }


        }
    }



    @Override
    public void tapDetected() {
        // TODO Auto-generated method stub
        Log.e("tapDetected", "tapDetected");
    }

    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
        Log.e("onPageScrollStateChanged", "onPageScrollStateChanged");
    }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
        Log.e("onPageScrolled", "onPageScrolled");
    }

    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        Log.e("onPageSelected", "onPageSelected");
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.e("onDestroy", "onDestroy onDestroy onDestroy");
    }




}

这是我的片段类

package com.android.ho;

import java.io.File;
import java.io.InputStream;

import com.epapyrus.plugpdf.core.viewer.ReaderView;

import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MyFragment extends Fragment{
    public static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
    public static int count = 1;

    static String file;
    TextView txt;
    ReaderView readerView;

    public static final MyFragment newInstance(String message) {
        MyFragment f = new MyFragment();
        Bundle bdl = new Bundle(1);
        bdl.putString(EXTRA_MESSAGE, message);
        f.setArguments(bdl);
        file = message;
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.myfragment_layout, container, false);
        try {

            File fl = new File(Environment.getExternalStorageDirectory(), "/pdf/2.pdf");
            readerView = (ReaderView) v.findViewById(R.id.pdfviews);
            //readerView.setOnClickListener(this);
            Log.e("readerView", fl.toString());

            v.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    Log.e("Inside onTouch onTouch onTouch onTouch onTouch onTouch ", "onTouch");

                    return true;
                }
            });


            // readerView.openFile("/mnt/sdcard/pdf/1.pdf","");
            if (count > 5)
                count = 1;
            readerView.openFile("/mnt/sdcard/pdf/" + count + ".pdf", "");
            Log.e("Inside onCreateView count is ", "" + count);
            count++;

            v.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    Toast.makeText(getActivity(), "Cilcked..",Toast.LENGTH_SHORT).show();

                }
            });

            /*v.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    view.getParent().requestDisallowInterceptTouchEvent(true);
                    Log.e("Inside onTouch onTouch onTouch onTouch onTouch onTouch ", "onTouch");

                    return false;
                }
            });*/

        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }


    @Override
    public void onDestroyView() {

        super.onDestroyView();
        // Log.d("PDFVIEW", "onDestroyView");

        try {
            if (readerView != null) {
                readerView.clear();
                // readerView.clearAllField(5);
                // readerView.destroyDrawingCache();
                // readerView.
                // readerView=null;
                // mPDFView.purgeMemory();
                // mPDFView.destroy();//added to force release memory
                // mPDFView = null;
            }
            Log.e("Fragment onDestroyView ", " onDestroyView readerView is "+readerView);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }



}

这是我的自定义viewpager类

package com.android.ho

import java.util.Calendar;
import java.util.Currency;
import java.util.Date;

import com.sph.bh.ImageOnTapCallback;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.widget.Toast;

public class ViewPagerWithTapGestreDetection extends ViewPager {

    private ImageOnTapCallback imageOnTapCallback;
    private GestureDetector tapGestureDetector;
    private OnGestureListener mGestureListener;

    public ViewPagerWithTapGestreDetection(Context context) {

        super(context);
        try {
            imageOnTapCallback = null;// set if needed
            mGestureListener = new GestureListener();
            tapGestureDetector = new GestureDetector(getContext(), mGestureListener, null, true);
        } catch (Exception e) {

        }
    }

    public ViewPagerWithTapGestreDetection(Context context, AttributeSet attrs) {
        super(context, attrs);
        try {
            imageOnTapCallback = null;// set if needed
            mGestureListener = new GestureListener();
            tapGestureDetector = new GestureDetector(getContext(), mGestureListener, null, true);
        } catch (Exception e) {

        }
    }



     @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
                //Don't let any touches be passed down to the children automatically
         Log.d("onInterceptTouchEvent ", "onInterceptTouchEvent");
                return true;
         }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.d("onTouchEvent", "onTouchEvent");
        if (imageOnTapCallback != null) {
            tapGestureDetector.onTouchEvent(event);
        }

        return super.onTouchEvent(event);
    }

    public ImageOnTapCallback getImageOnTapCallback() {
        return imageOnTapCallback;
    }

    public void setImageOnTapCallback(ImageOnTapCallback imageOnTapCallback) {
        this.imageOnTapCallback = imageOnTapCallback;
    }

    public class GestureListener extends GestureDetector.SimpleOnGestureListener {





        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {

            Log.d("onSingleTapConfirmed", "onSingleTapConfirmed");

            if (null != imageOnTapCallback) {
                imageOnTapCallback.tapDetected();
            }

            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.d("onDoubleTap", "onDoubleTap");
            return super.onDoubleTap(e);
        }

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

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

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            Log.e("onFling ", "onFling");
            return super.onFling(e1, e2, velocityX, velocityY);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

我认为onInterceptTouchEvent拦截它们。

嗯,您将从true返回onInterceptTouchEvent(),这意味着,作为ViewGroup,您不希望将任何触摸事件传递给孩子,而是将该触摸事件传递给onTouchEvent()

你应该在onInterceptTouchEvent()返回false中听取事件,直到你发现这是一个不应由儿童处理的手势。在这一点上,只有你应该返回true