苦しかった。デベロッパーサンプル見ても??サッパリだった。なんとか、クラス宣言とディスパッチで必要なコールバックが受けられるようになった。
ScrollView の下の階層にある Viewクラスで GestureDetector のシンプルメソッドをオーバーライドする方法が完成です。
xml で id を宣言。
<com.????.mytest2.MyScrollView
・・ 中略 ・・
<HorizontalScrollView
・・ 中略 ・・
<LinearLayout
android:id="@+id/L_layout" レイアウトに id を付ける
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView/ > ・・省略・・
< /LinearLayout>
< /HorizontalScrollView>
< /com.????.mytest2.MyScrollView>
ソースでイベントリスナーに使用する。
public class MainActivity extends AppCompatActivity {
private View mLayoutView;
private GestureDetectorCompat mDetector;
private MyGestureListener mGestureListener = new MyGestureListener(); // Myクラス
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/* 中略 */
mLayoutView = findViewById( R.id.L_layout ); // ライナーレイアウト
mLayoutView.setOnTouchListener( MyTouchEventListener ); // レイアウトにリスナー設定
mDetector = new GestureDetectorCompat( this, mGestureListener ); // MyクラスをGestureDetectorへ
mDetector.setOnDoubleTapListener( mGestureListener ); // SimpleOnGestureListeneを設定
}
@Override // ディスパッチを要請
public boolean dispatchTouchEvent( MotionEvent event ) {
super.dispatchTouchEvent(event);
mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
// mLayoutView にタッチイベントリスナーを設定
private final View.OnTouchListener MyTouchEventListener = new View.OnTouchListener() {
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
mDetector.onTouchEvent(event); // レイアウトビューのタッチイベントをGestureDetectorへ飛ばす
return false;
}
};
// 新クラス、GestureDetector.SimpleOnGestureListenerを継承
class MyGestureListener extends GestureDetector.SimpleOnGestureListener {
public boolean onTouchEvent( MotionEvent event) {
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
};
}
自分が使うメソッドだけは呼ばれていることを確認しました。多分、全部動くでしょう^^;
難航状態から急展開したのは、デベロッパーでGestureDetectorクラスの継承を見つけたこと。
class MyListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return false;
}
}
mDetector = new GestureDetector( PieChart.this.getContext(), new MyListener() );
それから、"【Android】画面タッチイベントを実装する " (@KawasakiAtsushi様)
スクロールビュー領域のディスパッチ設定の記事がありました。感謝!
@Override
public boolean dispatchTouchEvent( MotionEvent event ) {
super.dispatchTouchEvent(event);
mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
参考資料
【Android】画面タッチイベントを実装する " (@KawasakiAtsushi様)
ビューをインタラクティブにする デベロッパー