HardBirch

【完美解决冲突】Gallery与ScrollView每次滑动翻一页

时间:13-08-01 栏目:Android探究 作者:魔豆先生 评论:2 点击: 5,983 次

上一篇文章讲到 Gallery与ScrollView滑动冲突问题的处理  在解决完这个问题后,我们意外的发现上上篇文章提到的处理Gallery每次滑动翻动一页的效果又被ScrollView冲突了。

 

在这种情况,看来单独重载Gallery的方法还是不能解决所有问题的,在这里直接上代码,需要重载ScrollView和Gallery的Touch相关Event。

WallpaperGallery  Class 代码如下:

public class WallpaperGallery extends Gallery {
WallpaperScrollView currScrollView;

public WallpaperGallery(Context context) {
super(context);
}

public WallpaperGallery(Context context, AttributeSet attrs) {
super(context, attrs);
}

private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {
return e2.getX() > e1.getX();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
currScrollView = getCurrScrollView();
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(currScrollView != null && Math.abs(distanceX) < Math.abs(distanceY))
currScrollView.scrollBy(0, (int) distanceY);
return super.onScroll(e1, e2, distanceX, distanceY);
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if(currScrollView != null)
currScrollView.fling(-(int) distanceY);

        int kEvent;
        if (isScrollingLeft(e1, e2)) {
            kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
        } else {
            kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
        }
        onKeyDown(kEvent, null);
        return true;      
}

private WallpaperScrollView getCurrScrollView() {
//I have a load more button that shouldn't be cast to a scrollview
int pos = getFirstVisiblePosition();
if(this.getSelectedView() instanceof WallpaperScrollView)
return (WallpaperScrollView)this.getSelectedView();
else
return null;
}
}

 

WallpaperScrollView Class 代码如下:

 

public class WallpaperScrollView extends ScrollView {

public WallpaperScrollView(Context context) {
super(context);
}

public WallpaperScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return false;
}
}

 

这是在 最新出土,刚刚出炉,火热上线 的最新壁纸项目中用到的两个自定义的类,开肠破肚 分享如上~   使用上和一般的Gallery  ScrollView一样的使用,只需要在xml中定义控件的时候指定上自定义的这两个Widget就OK啦。

 

声明: 本文由( 魔豆先生 )原创编译,转载请保留链接: 【完美解决冲突】Gallery与ScrollView每次滑动翻一页

【完美解决冲突】Gallery与ScrollView每次滑动翻一页:目前有2 条留言

  1. 板凳
    魔豆先生:

    这个小伙的实现也挺不错的,分享下 开拓个思路~ http://www.wappu.cn/2013/interface_0730/1210.html

    2013-08-06 14:00 [回复]
  2. 沙发
    索额朗画:

    你好,我在做一个应用软件,现在需要的是二级栏目导航,就是,在左边和邮编滑动里面是一个新闻的子版块,每一个子版块有相应内容,我需要的是,在左右滑动的里面有的子办款是文字叙述,需要上下滑动,所以我就采用了你的代码,Gallery里面嵌套ScrollView,结果Gallery好着,可是ScrollView在父控件Gallery左右准备要移动的时候,就是鼠标在模拟器上向左右使点滑动的力时,上下拖动,那个ScrollView才滑动,麻烦你帮我解决一下,我的qq是609471999,陕西的上进观众,谢谢你 :cool:

    2014-04-15 17:25 [回复]

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐