LoginSignup
26
22

More than 5 years have passed since last update.

WebViewでスクロール時のタッチ情報を取得する

Last updated at Posted at 2014-11-02

背景

WebViewにはListView#onScrollStateChangedのように、スクロール時のタッチ情報を取得できる仕組みがありません。
GestureDetector.OnGestureListenerをimplementしてあげることで、詳細なスクロール情報を取得できますが、これだと指を離した状態(Motion.ACTION_UP)がうまく取得できません。(多分。onFling()メソッドの引数情報を工夫すれば取得できそうでしたが、大変そうです)

そこでWebViewのソースコードを読んでみると、onTouchEvent()というメソッドがありました。これをカスタマイズしてあげることで、スクロール時のタッチ情報を取得できるようにします。

やり方

カスタムWebViewを作ります。


public class CustomWebView extends WebView{


    private OnTouchEventCallback mOnTouchEventCallback;

    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public CustomWebView(Context context) {
        super(context);

    }

    public void setmOnTouchEventCallback(final OnTouchEventCallback onTouchEventCallback){
        mOnTouchEventCallback = onTouchEventCallback;
    }

    //(※)コールバック関数に渡してあげる。
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if(mOnTouchEventCallback != null) mOnTouchEventCallback.onTouchStateChanged(event.getAction());
        return super.onTouchEvent(event);
    }


    public static interface OnTouchEventCallback
    {
        public void onTouchStateChanged(int state);
    }
}

(※)の部分で、WebViewのonTouchEvent()をオーバーライドして、コールバック関数に渡してあげることで、別のクラスからこのCustomViewを定義すれば、スクロール時の情報をよしなに扱うことができます。
注意すべきなのは、返り値で super.onTouchEvent(event)を呼ぶことです。これを呼ばないと、スクロールができなくなります。

このCustomWebViewをActivityやFragmentで利用する場合は以下のようにします。


public class HogeActivity extends Activity{
    private CustomWebView mWebView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_hoge);
        mWebView = (CustomWebView) view.findViewById(R.id.web_view);
        //スクロールのタッチ情報をよしなに処理する
        mWebView.setmOnTouchEventCallback(new CustomWebView.OnTouchEventCallback(){

            @Override
            public void onTouchStateChanged(int state) {
                switch(state){
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        scrollMoved();
                        break;
                    case MotionEvent.ACTION_UP:
                        scrollStopped();
                        break;
                }
            }
        });
    }
}

activity_hoge.xmlでカスタムビューを定義します


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <com.tomoima.hogeapp.ui.view.CustomWebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

</FrameLayout>

26
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
22