Java | Android

Android Activity 스와이프해서 닫기(SwipeBackLayout)

partner_jun 2017. 5. 4. 12:51

최근 출시되는 대부분의 앱은 스와이프해서 액티비티를 닫는 기능을 지원한다. 사용자 측면에서 생각해도 엄지손가락에 힘주고 닫기버튼을 찾아 누르는 것보다 화면을 스와이프하는게 당연히 더 편하다.


아무튼, 액티비티를 스와이프해서 닫는 가장 기본적인 방법은 Layout에 onTouchEvent를 구현하는 방법이다. 

new View.OnTouchListener(){
private float x;

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

switch (motionEvent.getAction()){

case MotionEvent.ACTION_DOWN :
x = motionEvent.getX();
break;

case MotionEvent.ACTION_UP :
if(motionEvent.getX() > x) {
/// ...
}
}
return false;
}
};

터치했을 때의 좌표를 기억하고 뗐을때의 좌표와 비교함으로써 스와이프를 감지하는 방법이다. 구글에서 검색하면 가장 처음 나오는 방법인데, 직접 써보면 앱을 곧바로 지워버릴만큼 엄청나게 끔찍한 사용감을 선사한다. 특히, 위의 이벤트를 적용한 Layout의 Child View들에서도 이벤트를 감지해야 하기 때문에

android:duplicateParentState="true"

설정이 필요해진다. (모든 Child View에 적어야 한다!)



너무 끔찍한 사용감 때문에 더 좋은 방법을 찾던 중 SwipeBackLayout이라는 라이브러리를 발견했다. 사용법도 간단하다.


1. 디펜전시를 추가한다.

compile 'me.imid.swipebacklayout.lib:library:1.0.0'



2. SwipeBackLayout을 사용할 액티비티가 SwipeBackActivity를 상속받게 한다.

public class Activity extends SwipeBackActivity



3. getSwipeBackLayout() 메소드로 SwipeBackLayout을 얻어온다.

SwipeBackLayout swipeBackLayout = getSwipeBackLayout();



4. SwipeBackLayout에 어느 모서리를 트래킹 할 것인지 설정한다.

swipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT | SwipeBackLayout.EDGE_RIGHT);

트래킹 할 수 있는 모서리는 

SwipeBackLayout.EDGE_LEFT

SwipeBackLayout.EDGE_RIGHT

SwipeBackLayout.EDGE_BOTTOM

SwipeBackLayout.EDGE_ALL

이렇게 네 종류다. 또 위의 예제처럼 or 연산자로 마음대로 섞어 쓸 수 있다.



5. addSwipeListener로 스와이프하면 할 동작을 설정한다.

기본적으로 액티비티를 닫는 동작은 구성되어 있지만 진동으로 햅틱 반응을 준다던지, 토스트나 스낵바 등을 띄우는 추가적인 기능을 구현 할 수 있다.

swipeBackLayout.addSwipeListener(new SwipeBackLayout.SwipeListener() {
@Override
public void onScrollStateChange(int state, float scrollPercent) {
// 스크롤 될 때
}

@Override
public void onEdgeTouch(int edgeFlag) {
// 설정된 모서리를 터치 했을 때
}
@Override
public void onScrollOverThreshold() {
// 창이 닫힐 정도로 스와이프 되었을 때
}
});

이게 끝이다. 이 라이브러리만으로도 간단하지만 훌륭한 사용감을 준다. 

구글 플레이스토어에서 'SwipeBackLayout' 으로 검색하면 이 라이브러리가 적용된 예제 앱을 다운 받을 수 있다.



마지막으로 이 라이브러리는 Apache 2.0 라이센스로 출처를 명시해야 한다.