更新: 何が起こっているのかわかりました。コメントを参照してください。
スケール ジェスチャを受け取るまで、すべてのジェスチャを最初の子に渡す ViewSwitcher を作成しようとしています。次に、最初の子に戻るときに、その子が再び完全にズームアウトされるまで、それらを 2 番目の子に渡します。私のサブクラスには ScaleGestureDetector があり、非常に単純なリスナーを作成しました。
protected class OnScaleModeSwitcher implements ScaleGestureDetector.OnScaleGestureListener
{
protected PageFlipSwitcher owner;
public OnScaleModeSwitcher(PageFlipSwitcher newOwner)
{
super();
owner = newOwner;
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
return false;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
owner.onScaleBegin();
//returning false here causes the rest of the gesture to be ignored.
return false;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
owner.onScaleEnd();
}
}
ご覧のとおり、作成時に所有者オブジェクトへの参照を取得し、いくつかのイベントを所有者クラス内のメソッドに渡すだけです。ただし、コードは onScaleEnd() に到達していません。
onInterceptTouchEvent が少し危ないかもしれないことは承知しています。Android docs の提案に可能な限り厳密に従いました。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
onTouchEvent(ev);
return false;
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
//mode is the name of the ScaleGestureDetector
mode.onTouchEvent(ev);
//this code just passes events to the children
//it seems to work OK
if(zoomActive)
{
//ZoomSwitcher
getChildAt(1).onTouchEvent(ev);
}
else
{
//Gallery
getChildAt(0).onTouchEvent(ev);
}
return true;
}
GestureDetector が ACTION_UP イベントを受信しない可能性があることを別の場所で読みました。
それがここで起こっていることですか?もしそうなら、 onScaleEnd() メソッドのポイントは何ですか?
編集:
私はこれを解決しました。これは、私のメソッドが false を返すためです。Eclipse はいくつかのスタブを自動実装しましたが、それらを入力したときに戻り値を変更しませんでした。