2012年11月28日水曜日

ViewFlipperでページめくり ~おまけ編

ここからはおまけ.

前回の続きでフリックでページをめくる処理を実装する.
要するにフリックイベントを取りに行くわけでもはやViewFlipperほとんど関係ない気がする('A`)

OnGestureListenerをもちいたフリックイベントの取得

ついにタイトルすらViewFlipperから遠のいたけど気にしない.
実装するのはActivity. ここに

implements OnGestureListener

してやる. 当然 eclipse「メソッドのオーバーライド足りてねぇぞゴルァ(゚Д゚#)」と怒られるので言われるままに作成.
ただし今回使うメソッドは2つのみ.

① onFling
② dispatchTouchEvent

特に②が忘れられがちなので注意

① onFling

実際に受け取ったフリックイベントから処理を行なうクラス. 

@Override
public boolean onFling(final MotionEvent e1, final MotionEvent e2, final float velocityX, final float velocityY) {
    float dx = Math.abs(e1.getX() - e2.getX());
    float dy = Math.abs(e1.getY() - e2.getY());
    if (dx > dy) {
      if (velocityX > 0) {
        flipper.setInAnimation(slideInFromLeft);
        flipper.setOutAnimation(slideOutToRight);
        flipper.showPrevious();
      } else {
        flipper.setInAnimation(slideInFromRight);
        flipper.setOutAnimation(slideOutToLeft);
        flipper.showNext();
      }
      return true;
    }
    return false;
}

たまにはsyntaxhighlighterの色を変えてみたかった(言い訳)ので参考サイトをほぼコピペを更にコピペというだめっぷりorz
3行目, 4行目でフリックのX方向, Y方向の移動距離をそれぞれ取得,
5行目で比較してX方向のほうが大きい=横にフリックする気でフリックした 時のみ処理を行なう.
6行目でフリックのベクトルが右方向か左方向かを判定, 右なら1ページ戻る, 左なら1ページ進む, を処理させる. 処理の内容は前回参照.
それだけ. これでイベントが飛んでくれば処理してくれる.

②dispatchTouchEvent

一度ここを設定し忘れて「あっれーうごかないぞー(゜д゜;三;゜д゜)」とか言ってたことがあるのでorz
まずonCreateあたりで

GestureDetector gestureDetector = new GestureDetector(this, this);

を取得.
そして問題のdispatchTouchEvent
@Override
public boolean dispatchTouchEvent(final MotionEvent event) {
  return gestureDetector.onTouchEvent(event) || super.dispatchTouchEvent(event);
}

eclipseの自動生成に出てこない引っ掛けっぷり. ひどすぎる('A`)
コイツを作っておかないとそもそもイベントを取ってくれませんorz


これらを設定してやると, おめでとう!ボタンで動いていた画面がフリックで移動するようになったぞ!
となる.

onFlingの3行目, 4行目でとったように, e1.getX()でとった座標で条件分岐してやれば, 特定の範囲でフリックしたときのみイベントを取るなんてのもできそう. やってないけど(・ω・`)





長かった…('A`)

0 件のコメント:

コメントを投稿