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
版权所有 © 转载时必须以链接形式注明作者和原始出处!


两个元件都有用到左右滑动的针测器,当然会发生这种问题。
像我以前就写Gallery + ListView,
结果程式也是判断不出来使用者的滑动是哪一种元件的判断手势。
你必须想想别的办法才行。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
detector.onTouchEvent(ev);
scroll.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}