반응형

Drag를 이용하여 Activity 전환하기

 

휴대폰 화면을 드래그하여 화면을 전환하는 방법을 알아보겠습니다.

View.setOnTouchListener()를 이용하여 이벤트를 처리합니다.

 

Activity에서 onTouch-Event 감지

 

이벤트를 처리할 Activity에서 View.setOnTouchListener() 이벤트를 선언합니다.

DragEvent dragEvent = new DragEvent( getApplicationContext(), getClass() );

View view = findViewById( R.id.layoutBgMain );
view.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return dragEvent.onTouch( v, event );
    }
});

[소스] Activity.java 소스의 onTouch() 이벤트

 

View객체는 OnTouch()이벤트를 처리할 객체입니다.

onTouch() 이벤트의 MotionEvent는 사용자의 동작을 관리합니다.

 

위의 예저에서는 DragEvent라는 Class를 생성하여 처리하였습니다.

여러 화면에 적용할 것을 감안한 구조입니다.

 

package com.onemoresg.referencebook;

import android.content.Context;
import android.content.Intent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;

public class DragEvent {

    ArrayList<Class> arrClass = new ArrayList<Class>();

    Context context;
    Class mClass;
    float distance = 0;

    public DragEvent(Context context, Class pClass ) {
        this.context = context;
        this.mClass = pClass;

        arrClass.add( MainActivity.class );
        arrClass.add( SearchActivity.class );
        arrClass.add( InfoActivity.class );
        arrClass.add( ActivityRegister.class );
    }

    public boolean onTouch(View v, MotionEvent event) {

        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // 손가락을 touch 했을 떄 x 좌표값 저장
                distance = event.getX();

                break;

            case MotionEvent.ACTION_UP:
                // 손가락을 떼었을 때 저장해놓은 x좌표와의 거리 비교
                // 해당 거리가 100이 되지 않으면 이벤트 처리 하지 않는다.
                distance = distance - event.getX();
                if (Math.abs(distance) < 100) { return false; }

                int iClassIdx = arrClass.indexOf( mClass );  // 현재 Activity의 Index

                if ( distance > 0 ) {
                    // 손가락을 왼쪽으로 움직였으면 오른쪽 화면이 나타나야 한다.
                    if( iClassIdx == arrClass.size() - 1 ) { iClassIdx = 0; }
                    else { iClassIdx++; }
                } else {
                    // 손가락을 오른쪽으로 움직였으면 왼쪽 화면이 나타나야 한다.
                    if( iClassIdx == 0 ) { iClassIdx = arrClass.size() - 1; }
                    else { iClassIdx--; }
                }

                // 손가락을 왼쪽으로 움직였으면 오른쪽 화면이 나타나야 한다.
                Intent intent = new Intent( context, arrClass.get( iClassIdx ) );
                context.startActivity(intent);

                break;
        }

        return true;
    }
}

[소스] DragEvent.java

 

Activity의 Context정보와 Class정보

 

DragEvent.class의 생성자로 화면activity의 Context정보와 Activity.class정보를 전달받아 저장합니다.

  - Context는 이벤트를 처리하기 위함이며

  - Activity.class는 화면 전환시 현재의 화면을 인지하기 위한 용도입니다.

 

  ※ Drag이벤트를 별도의 Class로 분리하기 위해 전달받는 객체정보입니다.

 

MotionEvent 감지

 

onTouchListener에서 전달된 MotionEvent로 동작을 감지할 수 있습니다.

MotionEvent
  - ACTION_DOWN : 터치 되었을때( 화면에 손을 댔을 때 )
  - ACTION_MOVE  : 누른 상태에서 움직였을 때 (Drag)
  - ACTION_UP : 화면에서 손을 땠을 때

 

위의 소스에서는 ACTION_DOWN이벤트와 ACTION_UP이벤트를 이용하여, 일정 거래 100dp이상을 움직였을 때 화면을 전환하는 로직을 구현하였습니다.

 

The End.

반응형