FrameLayoutにTouchEventを実装したいことってありますよね。
自分はGestureDetector.OnGestureListener
を使いたい時にこんな感じで実装しました。
TouchableFrameLayout.java
public class TouchableFrameLayout extends FrameLayout {
private static final String TAG = TouchableFrameLayout.class.getSimpleName();
private OnTouchListener onTouchListener;
public TouchableFrameLayout(Context context) {
super(context);
}
public TouchableFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchableFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TouchableFrameLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public void setOnTouchListener(OnTouchListener l) {
this.onTouchListener = l;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// ここでtrueを返すとonTouchEventが呼ばれるようになる
return onTouchListener != null;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return onTouchListener.onTouch(getRootView(), event);
}
}
MainActivity.java
//onCreateとかに
FrameLayout layout = (FrameLayout) findViewById(R.id.frame_layout);
layout.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// ここで処理。たとえばgesture関連とか。
return gestureDetector.onTouchEvent(event);
}
}
これでonTouchをとれました。
ちなみにOnGestureListenerはonDown
でtrueを返さないと以降のEventを処理しなくなってonDown, onShowPress, onLongPres
しか呼ばれなくなるので注意が必要です。
詳しくは参考のリンクから。
参考
android - FrameLayout click event is not firing - Stack Overflow
Androidあれこれ: 子Viewのタッチイベントを取得する
onScroll()というかonTouchEvent()が呼ばれない