ViewPagerを縦で利用する。

ViewPagerを横向きだけではなく縦向きで利用する必要があり、外部ライブラリを利用したのだがその際結構手間取ってしまったのでメモ。

ActionBarSherlockで有名な、JakeWharton氏のAndroid-DirectionalViewPagerを利用。
https://github.com/JakeWharton/Android-DirectionalViewPager
ActionBarSherlockといい、ViewPagerIndicatorといい、氏には一切頭が上がりません。
弱小Corderのありがたい味方です、ありがとうございます。

さて、このjarライブラリ、そのまま導入しようとすると、エラーを吐きまくる。
プロジェクトのlibsの中に入れれば良いだけのはずなのだが、どうもsupportPackageとの相性が悪いのか動かない。

StackOverflowにその旨の投稿と、更にFixedされたjarが上がっていたので本当に助かった。Link

後はjarファイルを導入して、有り体に言えば、

<com.directionalviewpager.DirectionalViewPager
    android:id="@+id/pager"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    /*important*/
    android:orientation="vertical" />

とすれば動く。この辺はまぁGitHubにも書いてあるので割愛するとして、縦で利用する際に一番問題になるのが、
ListViewのスクロール と ViewPagerのスワイプ がどちらも縦スワイプになるということ。

ListViewが動かないのでは?と心配していたのだが、とりあえずListView以外の部分をスワイプしたり、
ListViewを下までスクロールした後にスワイプすれば、きちんと縦のViewPagerとして判別される。

ただ、ユーザビリティ的には優れていないので、ViewPagerのスワイプを無効にした。
(ViewPagerの意味が無い、と言われるかもしれないが、
実際Activityを切り替えるよりFragmentがビュンと流れるほうがきれいに見えるので……
切替のイベントのためのメニューとかは今はやりのNavigationDrawerを使ったりするとオシャレ)

話はそれたが、ViewPagerのスワイプを無効にするには、ViewPagerのonTouchEventとonInterceptTouchEventがfalseを返すようにすればよい。

public class CustomDirectionalViewPager extends DirectionalViewPager{

	public CustomDirectionalViewPager(Context context) {
		super(context);
	}
	public CustomDirectionalViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent ev){
		return false;	
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent event){
		return false;
	}
}

これで、とりあえずViewPagerのスワイプを無効にできる。
あとは、適当な部分でイベントを取って、

mViewPager.setCurrentItem(position);

してやればよい。

横画面でも同じようなことができるので、海外アプリケーションによくある初期起動時の横スワイプでのHowToPageなんかも作れるのではないだろうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です