IT이야기/Android

onTouchListener와 onClickListener 구현 차이(서비스에서 보이지 않는 버튼 구현하기)와 이벤트 리스너들

FelixShin 2015. 12. 17. 01:17
반응형


안드로이드 엑티비티대신 서비스에서 always view on top view를 구현하면서 서비스를 구현해 보았다.


일반적으로 안드로이드 이벤트에서는 아래와 같은 종류의 리스너들이 있다.


View.OnClickListener - 살짝 클릭을 했을때  

View.OnCreateContextMenuListener - 꾸욱 눌렀을때

View.OnFocusChangeListener - 뭔가 포커스가 변경되었을때

View.OnKeyListener - 키보드로 입력했을때

View.OnLongClickListener - 클릭보다 길게 눌렀을때

View.OnTouchListener - 터치를 했을때




onTouchListener와 onClickListener 구현 방법 차이를 좀 더 알아보도록 하겠다.


쓰임새로 보면 

onClickListener는 단순 클릭 이벤트를 받아 이벤트 구현이 가능한 반면,


onTouchListener는

ACTION_UP

ACTION_DOWN

ACTION_MOVE 등 사용자의 손가락 방향, 드래그 등 행동에 맞게 구현, 이벤트 설정이 가능하다.


두 방법 다 서비스나 액티비티 단에서 구현가능하다. 아래는 참고 코드이다.

private WindowManager mWindowManager;
private WindowManager.LayoutParams mParams;
private TextView mPopupView;
private int clickIndex = 0;
mPopupView = new TextView(this);
mPopupView.setText("Go To");
mPopupView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
mPopupView.setTextColor(Color.TRANSPARENT);
mPopupView.setBackgroundColor(Color.TRANSPARENT);

mParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE, // touch event can be always received
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // not get focus
PixelFormat.TRANSLUCENT // transparent
);
mParams.gravity = Gravity.LEFT | Gravity.TOP; // Location

mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mWindowManager.addView(mPopupView, mParams); //put view into window

mPopupView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(serviceTag, "OnClickListener");
clickIndex++;
if (clickIndex == 1) {
startTimer();
}

Log.i("check number", String.valueOf(clickIndex));

if (clickIndex == 3) {
Intent settingIntent = new Intent(context, SettingActivity.class);
settingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(settingIntent);
}
}
});
mPopupView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d(serviceTag, "Action_DOWN");
clickIndex++;

if(clickIndex==1){
startTimer();
}

Log.i("check number", String.valueOf(clickIndex));

if(clickIndex==3){
Intent settingIntent = new Intent(context, SettingActivity.class);
settingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(settingIntent);
}
break;
}

return false;
}
});



참고 페이지 :

http://stackoverflow.com/questions/9122679/difference-between-ontouch-and-onclick-android

http://stackoverflow.com/questions/29295491/android-onclicklistener-inside-services