ViewPage嵌套ListView,嵌套Gallery 滑动冲突

来源:互联网 发布:淘宝app宝贝视频下载 编辑:程序博客网 时间:2024/05/16 10:55
首先项目需求是,
1.有左滑出现点击登录界面,用sliderMenu框架实现 
2.新闻内容用ViewPage实现 
3.在ViewPage中加载新闻片段Fragment
4.Fragment布局是一个带有上拉刷新,下拉下载的PullToRefresh ListView
5.ListView 里面有一个特殊第一项 拉取新闻广告位,用Gallery控件实现


问题:这么多滑动控件,在自定义Gallery控件,左右滑动,并未调用Gallery的OnFling()方法?


问题一:当Gallery第一个图,左滑时会自定跳转到前一个Fragment中
解决: 原文地址:http://www.cnblogs.com/xitang/archive/2013/06/22/3150380.html
http://m.blog.csdn.net/blog/icekings/27227233
ViewPager来实现左右滑动切换tab,如果tab的某一项中嵌入了水平可滑动的View就会让你有些不爽,比如想滑动tab项中的可水平滑动的控件,却导致tab切换。


因为Android事件机制是从父View传向子View的,可以去检测你当前子View是不是在有可滑动控件等,决定事件是否拦截,但是这个麻烦,而且并不能解决所有的问题(必须检测触摸点是否在这个控件上面),其实有比较简单的方法,在你嵌套的控件中注入ViewPager实例(调用控件的getParent()方法),然后在onTouchEvent,onInterceptTouchEvent,dispatchTouchEvent里面告诉父View,也就是ViewPager不要拦截该控件上的触摸事件。


1 requestDisallowInterceptTouchEvent(true)
代码一般如下:




 1 public boolean onTouch(View v, MotionEvent event) {
 2     switch (event.getAction()) {
 3     case MotionEvent.ACTION_MOVE: 
 4         pager.requestDisallowInterceptTouchEvent(true);
 5         break;
 6     case MotionEvent.ACTION_UP:
 7     case MotionEvent.ACTION_CANCEL:
 8         pager.requestDisallowInterceptTouchEvent(false);
 9         break;
10     }
11 }


当用户按下的时候,我们告诉父组件,不要拦截我的事件(这个时候子组件是可以正常响应事件的),拿起之后就会告诉父组件可以阻止。




代码中实现:
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
Log.e("onTouchEvent", "onTouchEvent");
if (MotionEvent.ACTION_UP == event.getAction())
mPager.requestDisallowInterceptTouchEvent(false);
else
mPager.requestDisallowInterceptTouchEvent(true);
return super.onTouchEvent(event);
}


问题二:Gallery的左右滑未响应OnFling()事件
原文:http://my.oschina.net/u/578271/blog/78556
最主要的问题就是,你告诉了你的父控件不要拦截了,但是你并没有用代码告诉DOWN MOVE UP事件由自己处理,所以在Gallery自定义控件中,
还要在onInterceptTouchEvent()方法中返回true。事件才会自己处理。并且在MotionEvent类的DOWN MOVE UP,都返回true都由自己处理。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
Log.e("onInterceptTouchEvent", "onInterceptTouchEvent");
mPager.requestDisallowInterceptTouchEvent(true);
final int action = ev.getAction();//获取触摸事件类型
        final float x = ev.getX();//每次触摸事件的x坐标
        Log.e("x", ""+x);
        final float y = ev.getY();//每次触摸事件的y坐标
        switch (action) {
        case MotionEvent.ACTION_DOWN://按下事件
            mLastMotionX = x;//初始化每次触摸事件的x方向的初始坐标,即手指按下的x方向坐标
            mLastMotionY = y;//初始化每次触摸事件的y方向的初始坐标,即手指按下的y方向坐标
            return true;
            //break;
 
        case MotionEvent.ACTION_MOVE:
             deltaX = (int) (mLastMotionX - x);//每次滑动事件x方向坐标与触摸事件x方向初始坐标的距离
            final int deltaY = (int) (mLastMotionY - y);//每次滑动事件y方向坐标与触摸事件y方向初始坐标的距离
            boolean xMoved = Math.abs(deltaX) > mTouchSlop && Math.abs(deltaY/deltaX) < 1;
            //判断触摸事件处理的传递方向,该业务中是,
            //x方向的距离大于手指,并且y方向滑动的距离小于x方向的滑动距离时,Gallery消费掉此次触摸事件
            //如果需要,请在您的业务中,改变判断的逻辑
            if (xMoved) {//Gallery需要消费掉此次触摸事件
            Log.e("xMoved", "xMoved id true");
                return true;//返回true就不会将此次触摸事件传递给子View了,我的业务中是ListView
            }
            break;
        case MotionEvent.ACTION_UP:
        return true;
        }
        Log.e("xMoved", "xMoved id false");
        return true;//DOWN MOVE UP整个事件都有Gallery来处理 返回true

//return super.onInterceptTouchEvent(ev);
}


问题三:@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY)  执行过程中MotionEvent e1报null指针异常。


因为最开始按照别人代码,在DOWN事件,UP事件返回的是 return super.onInterceptTouchEvent(ev);.该事件并不是Gallery自定的事件,所以报了空指针。


问题四:动态刷新指引圆点 报空指针错误
viewHolder.mRecommendGallery.setOnItemSelectedListener(new OnItemSelectedListener() {


@Override
public void onItemSelected(AdapterView<?> adapter,
View view, int position, long id) {
//圆点初始化 动态添加
//viewHolder.initDynamicPoint(position);
}
因为我的ListView 的适配器Adapter中有2中布局ITEM样式。所以在滑动Gallery的时候,刷新界面,ViewHolder复用了我的第0项的布局,但是是在第四项中复用我的第0项的布局,所以在怎么弄,都会报null指针异常。
解决方案是:把圆点指引起写在gallery的适配器中,而不是写在ListView适配器里面,刷新gallery的时候就可以看见圆点跟新了,缺陷是,圆点布局不是跟gallery布局同一XML里面的。所以会多次重画。效果不好!
0 0
原创粉丝点击