웹뷰(WebView)는 View를 상속받아서, 뷰에서 클릭 이벤트를 처리할 수 있도록 OnClickListener를 등록할 수 있다. 하지만, 웹뷰는 OnClickListener로 이벤트를 알려 주지 않는다. 그래서, OnClick 이벤트를 처리하기 위해서는 이 이벤트에 대한 처리를 직접해야 한다.
웹뷰의 OnClick 이벤트를 캐치하기 위해서는 OnTouch 이벤트에서 조건에 맞는 경우에 OnClick으로 간주하면 된다.
조건은 아래의 코드에서 볼 수 있듯이 다음과 같다.
– 클릭시 1초이내(1초를 넘어가면 롱클릭)에 손가락이 떨어져야 한다.
– 그리고 손가락의 이동이 15dp이내이어야 한다. 그 이상 멀어진 경우 드레그를 했다고 간주한다.
import android.content.Context; import android.view.MotionEvent; import android.view.View; public class OnClickWithOnTouchListener implements View.OnTouchListener { public interface OnClickListener { void onClick(); } /** * Max allowed duration for a "click", in milliseconds. */ static final int MAX_CLICK_DURATION = 1000; /** * Max allowed distance to move during a "click", in DP. */ static final int MAX_CLICK_DISTANCE = 15; private Context mContext; private OnClickListener mClickListener; private long pressStartTime; private float pressedX; private float pressedY; private boolean stayedWithinClickDistance; public OnClickWithOnTouchListener(Context context, OnClickListener clickListener) { this.mContext = context; this.mClickListener = clickListener; } @Override public boolean onTouch(View v, MotionEvent event) { if(mClickListener == null) { return false; } int eventAction = event.getAction(); if(eventAction == MotionEvent.ACTION_DOWN) { pressStartTime = System.currentTimeMillis(); pressedX = event.getX(); pressedY = event.getY(); stayedWithinClickDistance = true; } else if(eventAction == MotionEvent.ACTION_MOVE) { float distance = distance(pressedX, pressedY, event.getX(), event.getY()); if (stayedWithinClickDistance && distance > MAX_CLICK_DISTANCE) { stayedWithinClickDistance = false; } } else if(eventAction == MotionEvent.ACTION_UP) { long pressDuration = System.currentTimeMillis() - pressStartTime; if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) { mClickListener.onClick(); } } return false; } private float distance(float x1, float y1, float x2, float y2) { float dx = x1 - x2; float dy = y1 - y2; float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy); return pxToDp(mContext, distanceInPx); } public static float pxToDp(Context context, float px) { if(context == null) { return 0f; } return px / context.getResources().getDisplayMetrics().density; } }
이제 위 코드를 사용해서 웹뷰의 OnClick 이벤트를 처리해 보자.
mWebview.setOnTouchListener(new OnClickWithOnTouchListener(this, new OnClickWithOnTouchListener.OnClickListener() { @Override public void onClick() { // onclick 이벤트 처리 } }));
* 레퍼런스
- https://stackoverflow.com/questions/9965695/how-to-distinguish-between-move-and-click-in-ontouchevent/17911861#17911861
감사합니다~~!~!!~