반응형
/*
핸들러의 우선순위
핸들러가 동시 콜 되는 것을 막기위해 안드로이드는 아래와 같이 처리해두었다.
뷰의 리스너 -> 뷰의 onTouchEvent callback 메서드 -> 액티비티의 onTouchEvent callback 메서드
순서로 이벤트를 처리한다.
자세히보면 좁은 범위 -> 넓은 범위로 가게됨을 알 수 있다.
*/
package com.example.test;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 1. 콜백 이용
public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new MyView(this);
        setContentView(vw);
    }
    protected class MyView extends View {
        public MyView(Context context) {
            super(context);
        }
        // 이미 존재하는 메서드 재정
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
}





package com.example.test;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 2. 리스너 인터페이스 이용
public class MainActivity extends AppCompatActivity {
    TouchListenerClass TouchListener = new TouchListenerClass();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new View(this);
        vw.setOnTouchListener(TouchListener);
        setContentView(vw);
    }
    class TouchListenerClass implements View.OnTouchListener {
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
}





package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 3. 액티비티가 리스너 구현
/*
액티비티 자신이 View.OnTouchListener 선언문을 작성하여 액티비티가 직접 인터페이스를 구현하는 방법이다.
따라서 vw.setOnTouchListener에는 액티비티 자신인 this가 들어간다.
*/
public class MainActivity extends Activity implements View.OnTouchListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new View(this);
        vw.setOnTouchListener(this);
        setContentView(vw);
    }
    public boolean onTouch(View v, MotionEvent event){
        if(event.getAction() == MotionEvent.ACTION_DOWN){
            Toast.makeText(this, "Touch Event Received", Toast.LENGTH_SHORT).show();
            return true;
        }
        return false;
    }
}





package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 4. 뷰가 리스너 구현
/*
액티비티에서 바로 implements를 하는 것이 아닌 뷰 클래스를 하나 더 만들어 거기서 만들어낸다.
이렇게 하면 클래스 재사용이 유리해지고 액티비티가 깔끔해진다.(자기 스스로 처리하는 것 처럼 되기 때문에)
*/
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        MyView vw = new MyView(this);
        vw.setOnTouchListener(vw);
        setContentView(vw);
    }
    protected class MyView extends View implements View.OnTouchListener{
        public MyView(Context context){
            super(context);
        }
        public boolean onTouch(View v, MotionEvent event){
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    }
}





package com.example.test;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 5. 익명 이너 클래스 사용
/*
    액티비티에서 바로 implements를 하는 것이 아닌 뷰 클래스를 하나 더 만들어 거기서 만들어낸다.
    이렇게 하면 클래스 재사용이 유리해지고 액티비티가 깔끔해진다.(자기 스스로 처리하는 것 처럼 되기 때문에)
 */
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new View(this);
        vw.setOnTouchListener(TouchListener);
        setContentView(vw);
    }
    /*
        일반적인 코드
        class MyClass implements Interface {
            // 구현
        }
        MyClass obj = new MyClass();
        축약된 코드
        Interface obj = new Interface() {
            // 구현
        }; // 변수 선언문이므로 문장의 끝은 ;
    */
    private View.OnTouchListener TouchListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event){
            if(event.getAction() == MotionEvent.ACTION_DOWN){
                Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    };
}





package com.example.test;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;
// 6. 익명 이너 클래스의 임시 객체 사용
/*
    5번 익명 이너 클래스에서
    Class obj = new Class();
    Method(obj);
    에서
    Method(new Class());
    로 바꾼 형태(완전 람다 함수 형태)
 */
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View vw = new View(this);
        vw.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    Toast.makeText(MainActivity.this, "Touch Event Received", Toast.LENGTH_SHORT).show();
                    return true;
                }
                return false;
            }
        });
        setContentView(vw);
    }
}
반응형