これに対する回避策が見つかりました。恐ろしいですが、うまくいきます。
まず第一に、私の問題の原因となっているギャラリーのコードの部分は次のとおりです。
public boolean onDown(MotionEvent e) {
// Kill any existing fling/scroll
mFlingRunnable.stop(false);
// Get the item's view that was touched
mDownTouchPosition = pointToPosition((int) e.getX(), (int) e.getY());
if (mDownTouchPosition >= 0) {
mDownTouchView = getChildAt(mDownTouchPosition - mFirstPosition);
mDownTouchView.setPressed(true);
}
// Reset the multiple-scroll tracking state
mIsFirstScroll = true;
// Must return true to get matching events for this down event.
return true;
}
より正確には、この行:
mDownTouchView.setPressed(true);
ここでスライドのレイアウトが押され、LinearLayout の setPressed のデフォルトの動作はすべての子にディスパッチされるため、すべての子が押されます。
まず Gallery のサブクラスを作って onDown をオーバーライドしてみました。false を返して他に何も返さなかった場合は機能しましたが、スライドに触れると次のスライドにジャンプするという奇妙な動作が発生しました。それは、次の行が原因でした。
mFlingRunnable.stop(false);
これは実行されませんでした。この変数はプライベートで、Gallery クラスの他のすべてに関連しているため、サブクラスから使用する方法が見つかりませんでした。ギャラリーのコードもすべてコピーしてみましたが、パッケージ アクセスしかできないものがたくさん使用されているため、うまくいきませんでした。
そこで、onSetPressed をオーバーライドする LinearLayout のサブクラスを作成しました。
public class LinearLayoutOnSetPressedDoNothing extends LinearLayout {
public LinearLayoutOnSetPressedDoNothing(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void setPressed(boolean pressed) {
}
}
LinearLayout の代わりに私のレイアウトでそれを使用します。
<?xml version="1.0" encoding="utf-8"?>
<com.test.LinearLayoutOnPressDoNothing
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!-- content -->
</com.test.LinearLayoutOnPressDoNothing>
そして、これはうまくいきます。