onTouchListener와 onClickListener 구현 차이(서비스에서 보이지 않는 버튼 구현하기)와 이벤트 리스너들
안드로이드 엑티비티대신 서비스에서 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