2

単一のImageViewを保持するViewFlipperがあります。スワイプして画像/ビューを変更し、画像をクリックしてサウンドを再生できるようにしたい。

ビューを変更するためにOnFlingを処理しているGestureDetectorがあります。onClickListenerをimageviewに配置しようとしましたが、これは機能しましたが、OnFlingの機能を停止しました。

最後に、GestureDetectorにonSingleTapConfirmedを追加しました。これは機能しましたが、ImageViewだけでなく、アクティビティ内の任意の場所でクリックを登録します。

onSingleTapConfirmedを絞り込んでImageviewで作業する方法を誰かが提案できますか?

これまでの私のコードは次のとおりです。

 class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return false;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Log.v("Swipe", "Right to Left");

                viewFlipper.setInAnimation(slideLeftIn);
                viewFlipper.setOutAnimation(slideLeftOut);
                viewFlipper.addView(nextImage(true));

                viewFlipper.showNext();

            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                Log.v("Swipe", "Left to Right");

                viewFlipper.setInAnimation(slideRightIn);
                viewFlipper.setOutAnimation(slideRightOut);
                viewFlipper.addView(nextImage(false));
                viewFlipper.showNext();
            }
        } catch (Exception e) {
            // nothing
        }
        return false;
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent e)
    {
        // TODO Auto-generated method stub

        Log.v("SingleTap", "OnSingleTapConfirmed Run");

        return super.onSingleTapConfirmed(e);   

    }    

}

private View nextImage(boolean righttoleft) {
    ImageView imgv1 = new ImageView(this);

    if(righttoleft == true)
    {

            Uri image = Uri.parse("android.resource://com.owentech.brainybaby/drawable/" + variables.letters[variables.currentpos]);
            imgv1.setImageURI(image);
            imgv1.setScaleType(ImageView.ScaleType.CENTER_INSIDE);

    return imgv1;
}
4

1 に答える 1

3

私は過去にこの問題に遭遇しました。

OnTouchListenerをViewFlipperに設定することで、シングルタップの実装を試みることができるかもしれません。したがって、ViewFlipperが唯一のタッチイベントレシーバーになります。次に、onTouch関数で再生サウンドコードを記述します。最後に、onFlingを機能させ続けるために、onTouch関数の戻り値をfalseに設定します。

viewFlipper.setOnTouchListener(new OnTouchListener()
{
      @Override
      public boolean onTouch(View view, MotionEvent e) {
          // TODO Auto-generated method stub
          switch(e.getActionMasked())
          {
             case MotionEvent.ACTION_DOWN:
                  //put the playing sound code here.
                  break;
          }
          return false;  //means that the listener dosen't consume the event
      }
}
);

これは、この問題を解決するための単純な解決策です。画面を指でスワイプしてビューを変更するときに音が鳴らないようにするなど、より複雑な機能を実現したい場合は、ACTION_DOWNイベントとACTION_UPイベントの間の時間を計算し、次の場合に音を鳴らすなど、ジェスチャーを区別するためにさらに努力する必要があります。 300ms未満です。

これがお役に立てば幸いです。:)

于 2011-07-01T04:17:49.203 に答える