首页 > Android > ViewFlipper与ScrollView共存的问题
2011一月24

ViewFlipper与ScrollView共存的问题

最近在做一个应用,要用到ViewFlipper实现滑动切换屏幕的效果,同时由于一屏显示不了,要用到ScrollView实现拖动,以便能完全显示内容,在他们两个单独存在的时候,显示效果是完全没有问题的,但如果ViewFlipper包含ScrollView,或ScrollView包含ViewFlipper时,ViewFlipper的滑动效果就会失效,不知道大家有没有遇到类似的问题,现在我把我的方法晒出来和大家一起共享,希望对遇到类似问题的朋友有所帮助,也欢迎高手指点。
首先要重写ScrollView,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.gigabud;
 
import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ScrollView;
 
public class FriendlyScrollView extends ScrollView {
 
	GestureDetector gestureDetector;
 
    public FriendlyScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
 
	public FriendlyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
 
	public FriendlyScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}
 
	public void setGestureDetector(GestureDetector gestureDetector) {
		this.gestureDetector = gestureDetector;
	}
 
	@Override
	public boolean onTouchEvent(MotionEvent event) {
	    super.onTouchEvent(event);
	    return gestureDetector.onTouchEvent(event);
	}
 
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev){
	    gestureDetector.onTouchEvent(ev);
	    super.dispatchTouchEvent(ev);
	    return true;
	} 
 
}

然后再xml布局文件中,要将相应的ScrollView修改为重写侯的FriendlyScrollView,代码如下:


		

最后修要修改设置FriendlyScrollView的setOnTouchListener以及setGestureDetector,代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
       FriendlyScrollView scroll = (FriendlyScrollView) findViewById(R.id.scroll);
        scroll.setOnTouchListener(onTouchListener);
        scroll.setGestureDetector(detector);
 
        private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
 
		public boolean onTouch(View v, MotionEvent event) {
			// TODO Auto-generated method stub
			return detector.onTouchEvent(event);
		}
	};
 
	public boolean onDown(MotionEvent arg0) {
		// TODO Auto-generated method stub
		return false;
	}
 
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		if (e1.getX() - e2.getX() > 60) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));
			this.flipper.showNext();
			loadListView();
			return true;
		} else if (e1.getX() - e2.getX() < -60) {
			this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_in));
			this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_right_out));

由于篇幅有限,这里我只是给出了实现的思路以及部分代码的实现,如果有网友仍然有疑问,欢迎留言或发E-mail,同时也非常感谢翰鸿凌风的这篇文章http://blog.liaoxiaoqi.com/?p=484

文章作者:ithouge
本文地址:http://bg135.com/viewflipper-problems-with-coexistence-scrollview.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

2 Responses to “ViewFlipper与ScrollView共存的问题”

  1. #1 小鰻 回复 | 引用 Post:2011-04-01 17:20

    两个元件都有用到左右滑动的针测器,当然会发生这种问题。
    像我以前就写Gallery + ListView,
    结果程式也是判断不出来使用者的滑动是哪一种元件的判断手势。
    你必须想想别的办法才行。

  2. #2 Vinda 回复 | 引用 Post:2011-04-16 19:07

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
    detector.onTouchEvent(ev);
    scroll.onTouchEvent(ev);
    return super.dispatchTouchEvent(ev);

    }

发表评论

5+7= (必填)