背景
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>