Android手势中有个onFling的方法用来接收快速滑动。最近碰到一个奇怪问题希望大牛们指点。
有一个ViewFlipper即其中放的Layout。在某一页时这个Layout是没有撑满全屏的,这个时候我如果在Layout上滑动是可以接收到onFling事件的,但是在Layout之外的区域(这个时候此区域是属于ViewFlipper的)相同的手势处理却是响应的onLongPress,这个是为啥呢?
两次的滑动手势是一样的啊。
有没有人有关于手势方面讲解的比较全面的资料呢?这个onFling到底是怎么触发的呢?是相对位置还是绝对位置啊?求指教。
版主 2# menshen 发表于 2012-2-23 10:13:24
你需要自己去监听手势吧 ?
你监听的是Flipper的touch还是layout的touch啊 ?

点评

详情 回复 zxjnt  发表于 2012-2-23 10:32:20

这个里面的处理有点复杂,Layout也是有touch事件处理。先按系统的分发机制分发,这个时候Layout可能有处理,也可能没有。然后回到ViewFlipper,手势是在ViewFlipper中处理的。这个ViewFlipper中手势主要就是为了监听
版主 3# jl198411 发表于 2012-2-23 10:15:52
你将监听放在viewflipper上面还是layout上面了

点评

详情 回复 zxjnt  发表于 2012-2-23 10:32:47

见上。不知道我讲明白了没有。
初级构架师 4# zxjnt 发表于 2012-2-23 10:32:20
menshen 发表于 2012-2-23 10:13
你需要自己去监听手势吧 ?
你监听的是Flipper的touch还是layout的touch啊 ?

这个里面的处理有点复杂,Layout也是有touch事件处理。先按系统的分发机制分发,这个时候Layout可能有处理,也可能没有。然后回到ViewFlipper,手势是在ViewFlipper中处理的。这个ViewFlipper中手势主要就是为了监听这个左右滑动的。按理说不管我的touch在谁上面最终都是ViewFlipper中手势处理的啊。所以不明白为啥不一样。
初级构架师 5# zxjnt 发表于 2012-2-23 10:32:47
jl198411 发表于 2012-2-23 10:15
你将监听放在viewflipper上面还是layout上面了

见上。不知道我讲明白了没有。
版主 6# jl198411 发表于 2012-2-23 11:09:01
方便将代码传下  帮你调试下看看

点评

详情 回复 zxjnt  发表于 2012-2-23 11:27:48

代码在项目当中,我贴一部分吧。 这个是ViewFlipper中的: @Override public boolean dispatchTouchEvent(MotionEvent ev) { boolean b = super.dispatchTouchEvent(ev); if (this.getChildCount() == 0
初级构架师 7# zxjnt 发表于 2012-2-23 11:27:48
jl198411 发表于 2012-2-23 11:09
方便将代码传下  帮你调试下看看

代码在项目当中,我贴一部分吧。

这个是ViewFlipper中的:
@Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
                boolean b = super.dispatchTouchEvent(ev);
                if (this.getChildCount() == 0) {
                        return true;
                } else {
                        if (isFling) {

                                mGestureDetector.onTouchEvent(ev);
                        } else {
                                // super.onTouchEvent(ev);
                        }
                }
                return b;
        }
Gesture处理:
@Override
        public boolean onDown(MotionEvent e) {
                Log.v("zxj", "onDown");
                return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {
                Log.v("zxj", "onShowPress");
        }

        @Override
        public boolean onSingleTapUp(MotionEvent e) {
                Log.v("zxj", "onSingleTapUp");
                return false;
        }

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

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

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                        float velocityY) {
                Log.v("zxj", "isFling");
                DynamicListView list = (DynamicListView) this.getChildAt(this
                                .getDisplayedChild());
                int state = list.getRefreshState();
                if (state != list.TAP_TO_REFRESH) {
                        return true;
                } else {
                        Log.e("zxj", ">>>>>>>>>>>");
                        if (e2.getY() - e1.getY() < -200 || e2.getY() - e1.getY() > 200) {
                                return false;
                        } else if (e2.getX() - e1.getX() < -200) {
                                if (listener != null) {
                                        listener.flingtoNext();
                                }
                                return true;
                        } else if (e2.getX() - e1.getX() > 200) {
                                if (listener != null) {
                                        listener.flingtoNext();
                                }
                                return true;
                        }
                }
                return false;
        }


ViewFlipper中add的是ListView
touch处理

@Override
        public boolean onTouchEvent(MotionEvent event) {
                final int y = (int) event.getY();

                switch (event.getAction()) {
                case MotionEvent.ACTION_UP:
                        if (!isVerticalScrollBarEnabled()) {
                                setVerticalScrollBarEnabled(true);
                        }
                        if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
                                if ((mRefreshView.getBottom() > mRefreshViewHeight || mRefreshView
                                                .getTop() >= 0) && mRefreshState == RELEASE_TO_REFRESH) {
                                        // Initiate the refresh
                                        mRefreshState = REFRESHING;
                                        prepareForRefresh();
                                        onRefresh();
                                } else if (mRefreshView.getBottom() < mRefreshViewHeight
                                                || mRefreshView.getTop() < 0) {
                                        // Abort refresh and scroll down below the refresh view
                                        resetHeader();
                                        setSelection(1);
                                }
                        }
                        break;
                case MotionEvent.ACTION_DOWN:
                        mLastMotionY = y;
                        break;
                case MotionEvent.ACTION_MOVE:
                        applyHeaderPadding(event);
//                        return false;
//                        break;
                }
                return super.onTouchEvent(event);

        }

这些就是相关代码,帮我看看。Listview中的Touch是处理上下滑动的。ViewFlipper中主要处理左右滑动。
版主 8# jl198411 发表于 2012-2-23 11:57:43
楼主xml布局是怎么写的

点评

详情 回复 zxjnt  发表于 2012-2-23 12:03:52

没啥xml 就是Activity的View里面有个Layout 在这个Layout中放的Flipper(全屏),ListView(宽撑满,高自适应)是通过add的方式加到ViewFlipper中的。就这样。
初级构架师 9# zxjnt 发表于 2012-2-23 12:03:52
jl198411 发表于 2012-2-23 11:57
楼主xml布局是怎么写的

没啥xml  就是Activity的View里面有个Layout 在这个Layout中放的Flipper(全屏),ListView(宽撑满,高自适应)是通过add的方式加到ViewFlipper中的。就这样。
版主 10# jl198411 发表于 2012-2-23 15:12:47
Dtest.rar (55.72 KB, 下载次数: 72) 根据楼主提供的代码片段 试了下 并不会出现这种情况

点评

详情 回复 zxjnt  发表于 2012-2-24 14:55:31

大版,看了你的demo,和我的要求不太符合啊。你是把所以的事件都交给了Activity的Touch去处理了。我需要分别在ViewFlipper(左右滑动)和ListView(上下滑动)中处理Touch。我把项目中的代码拎出来了写了个demo(省略
版主 11# David_Zhang 发表于 2012-2-23 16:18:07
是模拟器还是真机出现的问题

点评

详情 回复 zxjnt  发表于 2012-2-23 16:50:26

真机。
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
初级构架师 12# zxjnt 发表于 2012-2-23 16:50:26
David_Zhang 发表于 2012-2-23 16:18
是模拟器还是真机出现的问题

真机。
版主 13# David_Zhang 发表于 2012-2-23 22:30:01
奇怪啊~~不曾遇到这个怪问题~~

点评

详情 回复 zxjnt  发表于 2012-2-24 14:56:18

demo已上传,版主帮忙看看,小女子万分感谢!
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
初级构架师 14# zxjnt 发表于 2012-2-24 14:55:31
jl198411 发表于 2012-2-23 15:12
根据楼主提供的代码片段 试了下 并不会出现这种情况

大版,看了你的demo,和我的要求不太符合啊。你是把所以的事件都交给了Activity的Touch去处理了。我需要分别在ViewFlipper(左右滑动)和ListView(上下滑动)中处理Touch。我把项目中的代码拎出来了写了个demo(省略了ListView中Touch处理的代码),发现还是存在这样的问题,纠结啊。帮忙看看,谢谢!

Ztest.zip

74.26 KB, 下载次数: 72

初级构架师 15# zxjnt 发表于 2012-2-24 14:56:18
David_Zhang 发表于 2012-2-23 22:30
奇怪啊~~不曾遇到这个怪问题~~

demo已上传,版主帮忙看看,小女子万分感谢!
初级构架师 16# xyuan52021 发表于 2012-2-24 16:02:23
初级构架师 17# xyuan52021 发表于 2012-2-24 16:02:28
版主 18# jl198411 发表于 2012-2-24 16:26:17
只要看下dispatchTouchEvent这个方法两个不同操作所返回的b结果是什么就知道了
版主 19# David_Zhang 发表于 2012-2-24 23:58:48
是有这个问题,有意思~~
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
版主 20# David_Zhang 发表于 2012-2-24 23:59:09
public boolean dispatchTouchEvent(MotionEvent ev) {
                boolean b = super.dispatchTouchEvent(ev);
                if (this.getChildCount() == 0) {
                        return true;
                } else {
                        if (isFling) {

                                mGestureDetector.onTouchEvent(ev);
                        } else {
                                // super.onTouchEvent(ev);
                        }
                }
               return true;
        }
改一下,试一试

点评

详情 回复 zxjnt  发表于 2012-2-25 13:07:06

好像还真是诶,版主能解释下吗。越来越糊涂了。
~~阿凡达这部电影告诉我们,谁胯下的鸟大听谁的~~
您需要登录后才可以回帖 登录 | 注册

关于我们|手机版|Archiver|DEVDIV.COM ( 京ICP备07040843号 )  

GMT+8, 2012-5-19 16:31

Powered by DEVDIV.COM!

© 2010-2012 DEVDIV.COM Coummunity.

回顶部