2013-08-17 46 views
2

我有一个片段,其中包含两个ScrollView的ViewFlipper。我想在ViewFlipper上检测滑动并更改ScrollView。我试图这样做:ViewFlipper里面的片段

public class HomeFragment extends Fragment implements OnGestureListener 
{ 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_TRESHOLD_VELOCITY = 200; 


    private View thisFragment; 

    private Animation slideLeftIn; 
    private Animation slideLeftOut; 
    private Animation slideRightIn; 
    private Animation slideRightOut; 

    private GestureDetector detecture; 

    private ViewFlipper riddleFlipper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     thisFragment = LayoutInflater.from(getActivity()).inflate(R.layout.home_fragment, null); 

     //views 
     riddleFlipper = (ViewFlipper) thisFragment.findViewById(R.id.home_fragment_riddle_flipper_ViewFlipper); 

     slideLeftIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_in); 
     slideLeftOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_out); 
     slideRightIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_in); 
     slideRightOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_out); 

     //sliding 
     detecture = new GestureDetector(getActivity(), this); 

     riddleFlipper.setOnTouchListener(new OnTouchListener() 
     { 

      @Override 
      public boolean onTouch(View view, MotionEvent event) 
      { 
       return detecture.onTouchEvent(event); 
      } 
     }); 


     return thisFragment; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
    { 
     if(Math.abs(e1.getY() - e2.getY()) > 250) 
      return false; 
     if((e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY) 
     { 
      riddleFlipper.setInAnimation(slideLeftIn); 
      riddleFlipper.setOutAnimation(slideLeftOut); 
      riddleFlipper.showNext(); 
     } 
     else if((e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY) 
     { 
      riddleFlipper.setInAnimation(slideRightIn); 
      riddleFlipper.setOutAnimation(slideRightOut); 
      riddleFlipper.showNext(); 
     } 

     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) 
    { 

    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) 
    { 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) 
    { 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     return false; 
    } 

} 

似乎riddleFlipper不“感觉”任何触摸事件。

编辑

我已经改变了代码如下:

public class HomeFragment extends Fragment implements OnGestureListener 
{ 
    private static final int SWIPE_MIN_DISTANCE = 120; 
    private static final int SWIPE_MAX_OFF_PATH = 250; 
    private static final int SWIPE_TRESHOLD_VELOCITY = 200; 


    private View thisFragment; 
    private ImageView userImage; 
    private ViewFlipper riddleFlipper; 
    private RelativeLayout usersRiddleLinearLayout; 
    private RelativeLayout favoriteLinearLayout; 

    private Animation slideLeftIn; 
    private Animation slideLeftOut; 
    private Animation slideRightIn; 
    private Animation slideRightOut; 

    private GestureDetector detecture; 



    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     thisFragment = LayoutInflater.from(getActivity()).inflate(R.layout.home_fragment, null); 

     //views 
     riddleFlipper = (ViewFlipper) thisFragment.findViewById(R.id.home_fragment_riddle_flipper_ViewFlipper); 
     userImage = (ImageView) thisFragment.findViewById(R.id.home_fragment_user_image_ImageView); 
     usersRiddleLinearLayout = (RelativeLayout) thisFragment.findViewById(R.id.home_fragment_users_riddles_LinearLayout); 
     favoriteLinearLayout = (RelativeLayout) thisFragment.findViewById(R.id.home_fragment_favorite_riddles_LinearLayout); 

     slideLeftIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_in); 
     slideLeftOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_out); 
     slideRightIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_in); 
     slideRightOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_out); 

     //sliding 
     detecture = new GestureDetector(getActivity(), this); 

     usersRiddleLinearLayout.setOnTouchListener(new OnTouchListener() 
     { 

      @Override 
      public boolean onTouch(View view, MotionEvent event) 
      { 

       return detecture.onTouchEvent(event); 
      } 
     }); 

     favoriteLinearLayout.setOnTouchListener(new OnTouchListener() 
     { 

      @Override 
      public boolean onTouch(View view, MotionEvent event) 
      { 

       return detecture.onTouchEvent(event); 
      } 
     }); 
     return thisFragment; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
    } 

    @Override 
    public boolean onDown(MotionEvent e) 
    { 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) 
    { 
     if(Math.abs(e1.getY() - e2.getY()) > 250) 
      return false; 
     if((e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY) 
     { 
      Toast.makeText(getActivity(), "a", Toast.LENGTH_SHORT).show(); 
      riddleFlipper.setInAnimation(slideLeftIn); 
      riddleFlipper.setOutAnimation(slideLeftOut); 
      riddleFlipper.showNext(); 
     } 
     else if((e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY) 
     { 
      Toast.makeText(getActivity(), "b", Toast.LENGTH_SHORT).show(); 
      riddleFlipper.setInAnimation(slideRightIn); 
      riddleFlipper.setOutAnimation(slideRightOut); 
      riddleFlipper.showNext(); 
     } 

     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) 
    { 

    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) 
    { 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) 
    { 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) 
    { 
     return false; 
    } 

} 

现在,触摸事件,但条记录它从来没有得到的onFling。为什么???

感谢

+0

但是最好使用View分页器而不是ViewFlipper。 – Piyush

+0

我无法获得'riddleFlipper.setOnTouchListener(new OnTouchListener()'来捕获任何触摸事件 – vlio20

+2

从'onDown()'返回'true'。 – Luksprog

回答

2

如果你试图重写您活动onTouchEvent(MotionEvent event),并从那里调用detecture.onTouchEvent(event),而不是使用OnTouchListener

+0

但是我正在使用片段(活动有片段,ViewFlipper在片段中) – vlio20

+0

您可以将TouchListener设置为片段的根视图。 –

+0

您可以提供一些代码? – vlio20

0

我已经有更好的运气在onActivityCreated方法初始化我的事件处理程序。尝试把你的触摸听众放在那里。

1
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.charts,container,false); 

    viewFlipper = (ViewFlipper) view.findViewById(R.id.viewFlipper); 

    viewFlipper.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      switch (motionEvent.getAction()) 
      { 
       case MotionEvent.ACTION_DOWN: 
        lastX = motionEvent.getX(); 
        return true; 

       case MotionEvent.ACTION_UP: 
        float currentX = motionEvent.getX(); 
        if(lastX < currentX) 
        { 
         if(viewFlipper.getDisplayedChild() == 0) { 
          return true; 
         } 
         viewFlipper.showNext();       
        }else if (lastX > currentX){ 
         if(viewFlipper.getDisplayedChild() == 1) { 
          return true; 
         } 
         viewFlipper.showPrevious();        
        } 
        return true; 
      } 
      return false; 
     } 
    }); 
} 

这对我有效。