onTouchListener在ViewPager [英] onTouchListener in ViewPager

查看:143
本文介绍了onTouchListener在ViewPager的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个的ImageView onTouchListener ViewPager 。当然,的ImageView 秒Page的听众,当我试图改变 ViewPager 火灾关闭。有没有一种方法,以prevent它。我想我需要从刷卡识别触摸弄好了。

这是我的code的提取物:

 公共类ServerDetailFragment扩展片段实现SimpleGestureListener {
GestureDetector检测器;
SimpleOnGestureListener手势=新SimpleOnGestureListener(){
    公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
        Log.e(TAG,onFling);
        返回true;
    };
};
....
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
    super.onCreate(savedInstanceState);
    探测器=新GestureDetector(ServerDetailFragment.this.getActivity(),手势);}.... @覆盖
 公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
    rootView = inflater.inflate(R.layout.fragment_server_detail,集装箱,FALSE);
    MyPagerAdapter适配器=新MyPagerAdapter();
    myPager =(ViewPager)rootView.findViewById(R.id.detail_pager);
    myPager.setAdapter(适配器);
    myPager.setCurrentItem(0);
    myPager.setOffscreenPageLimit(4);    ViewTreeObserver VTO = myPager.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(新OnGlobalLayoutListener(){
        @覆盖
        公共无效onGlobalLayout(){
            pagerGraph =(ImageView的)myPager.findViewWithTag(myPager.getCurrentItem())findViewById(R.id.pagerView)。
            pagerPb =(进度)myPager.findViewWithTag(myPager.getCurrentItem())findViewById(R.id.pagerPb)。
            如果(INIT){                plotFakeData();                //以下问题的一部分,也是ViewPager的onPageChangeListener                        pagerGraph.setOnTouchListener(新OnTouchListener(){
                    @覆盖
                    公共布尔onTouch(视图V,MotionEvent事件){
                        如果(detector.onTouchEvent(事件)){                            //一些code在这里                        }
                        返回false;
                    }                });                // myPager.setCurrentItem(0);
            }
            INIT = FALSE;
        }
    });


解决方案

我会去的东西是这样的:

 公共类OnSwipeTouchListener实现OnTouchListener {私人最终GestureDetector gestureDetector =新GestureDetector(新GestureListener());公共布尔onTouch(最终视图V,最终MotionEvent事件){
    返回gestureDetector.onTouchEvent(事件);
}私人final类GestureListener扩展SimpleOnGestureListener {    私有静态最终诠释SWIPE_THRESHOLD = 100;
    私有静态最终诠释SWIPE_VELOCITY_THRESHOLD = 100;    @覆盖
    公共布尔onDown(MotionEvent五){
        返回true;
    }
    @覆盖
    公共布尔onSingleTapConfirmed(MotionEvent五){
        onTouch(E);
        返回true;
    }
    @覆盖
    公共布尔onFling(MotionEvent E1,E2 MotionEvent,浮velocityX,浮velocityY){
        布尔结果= FALSE;
        尝试{
            浮diffY = e2.getY() - e1.getY();
            浮diffX = e2.getX() - e1.getX();
            如果(Math.abs(diffX)GT; Math.abs(diffY)){
                如果(Math.abs(diffX)GT; SWIPE_THRESHOLD和放大器;&安培; Math.abs(velocityX)GT; SWIPE_VELOCITY_THRESHOLD){
                    如果(diffX大于0){
                    }其他{
                    }
                }
            }其他{
               // onTouch(E);
            }
        }赶上(例外的例外){
            exception.printStackTrace();
        }
        返回结果;
    }
}
公共无效onTouch(MotionEvent五){
}
}

和调用它们是这样的:

  pagerGraph.setOnTouchListener(新OnSwipeTouchListener(){
公共无效onTouch(MotionEvent事件){
    //你的code在这里
});

I have an ImageView with onTouchListener inside a ViewPager. Of course the ImageView's listener fires off when I try to change ViewPager's page. Is there a way to prevent it. I guess I need to recognize touch from swipe somehow.

This is the extract of my code :

public class ServerDetailFragment extends Fragment implements SimpleGestureListener {
GestureDetector detector;
SimpleOnGestureListener gestures = new SimpleOnGestureListener() {
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        Log.e("TAG", "onFling");
        return true;
    };
};
....


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);     
    detector = new GestureDetector(ServerDetailFragment.this.getActivity(), gestures);

}

....

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_server_detail, container, false);
    MyPagerAdapter adapter = new MyPagerAdapter();
    myPager = (ViewPager) rootView.findViewById(R.id.detail_pager);
    myPager.setAdapter(adapter);
    myPager.setCurrentItem(0);
    myPager.setOffscreenPageLimit(4);

    ViewTreeObserver vto = myPager.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            pagerGraph = (ImageView) myPager.findViewWithTag(myPager.getCurrentItem()).findViewById(R.id.pagerView);
            pagerPb = (ProgressBar) myPager.findViewWithTag(myPager.getCurrentItem()).findViewById(R.id.pagerPb);
            if (init) {

                plotFakeData();

                // Following problematic part is also in ViewPager's onPageChangeListener

                        pagerGraph.setOnTouchListener(new OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if (detector.onTouchEvent(event)) {

                            // some more code here

                        }
                        return false;
                    }

                });

                // myPager.setCurrentItem(0);
            }
            init = false;
        }
    });

解决方案

I'd go with something like this:

public class OnSwipeTouchListener implements OnTouchListener {

private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());

public boolean onTouch(final View v, final MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }
    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
        onTouch(e);
        return true;
    }


    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            float diffY = e2.getY() - e1.getY();
            float diffX = e2.getX() - e1.getX();
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                    } else {
                    }
                }
            } else {
               // onTouch(e);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
}
public void onTouch(MotionEvent e) {
}
}

and call them this way:

pagerGraph.setOnTouchListener(new OnSwipeTouchListener() {          
public void onTouch(MotionEvent event) {
    // your code here
});

这篇关于onTouchListener在ViewPager的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆