2013-08-17 48 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; 
     } 
    }); 
} 

這對我有效。