본문 바로가기

나의 플랫폼/안드로이드

[Android] ViewPager + SwipeRefreshLayout

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

ViewPager와 SwipeRefreshLayout을 같이 사용할 경우, 서로 스크롤이 엉켜 ViewPager의 스크롤이 엉성하게 된다.


이럴 경우 iOS 같이 Horizontal일 경우에 SwipeRefreshLayout을 Disable을 시키고,

Vertical 일 경우 Enable을 시키는 방식을 이용하면 된다.


1. Horizontal 인지 파악하는 Detector를 하나 만들어 둔다.

public static class XScrollDetector extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return Math.abs(distanceX) > Math.abs(distanceY);
}
}


2. 전역 변수를 아래와 같이 설정 한다.

private GestureDetector mGestureDetector;
private boolean isLockOnHorizontialAxis;


3. Detector를 정의 한다.

mGestureDetector = new GestureDetector(getContext(), new LayoutUtils.XScrollDetector());


4. ViewPager에 아래와 같은 TouchListener를 설정 한다.

View.OnTouchListener viewpagerTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (!isLockOnHorizontialAxis)
isLockOnHorizontialAxis = mGestureDetector.onTouchEvent(event);

if (event.getAction() == MotionEvent.ACTION_UP)
isLockOnHorizontialAxis = false;

if (isLockOnHorizontialAxis) {
mSwipeRefreshLayout.setEnabled(false);
} else if (!isLockOnHorizontialAxis) {
mSwipeRefreshLayout.setEnabled(true);
}
return false;
}
};

그럼 Horizontal 일 경우에는 SwipeRefreshLayout이 Disable이 되므로 동작이 이뤄지지 않는다.


참고 하세요.


참고 소스 : http://vision-apps.blogspot.ro/2013/05/4-directions-swipe-navigation.html