WebViewにスワイプで進む、戻るを実装する

//MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

	@SuppressLint("SetJavaScriptEnabled")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//タイトルバーを削除する
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		MyWebView view= (MyWebView) findViewById(R.id.view);
		view.setWebViewClient(new WebViewClient());
		//javascriptを許可する
		view.getSettings().setJavaScriptEnabled(true);
		view.loadUrl("http://www.yahoo.co.jp/");
	}
}
//MyWebView.java
public class MyWebView extends WebView {
   private Context mContext;
   private GestureDetector mGestureDetector;
   private static final int SWIPE_MIN_DISTANCE = 120;
   private static final int SWIPE_MAX_OFF_PATH = 250;
   private static final int SWIPE_THRESHOLD_VELOCITY = 200;

   public MyWebView(Context context, AttributeSet attrs) {
      super(context, attrs);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

   public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

   public MyWebView(Context context) {
      super(context);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

   private final GestureDetector.SimpleOnGestureListener mSimpleOnGestureListener = new GestureDetector.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 super.onFling(e1, e2, velocityX, velocityY);
            }
            if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
               // 開始位置から終了位置の移動距離が指定値より大きい
               // X軸の移動速度が指定値より大きい
               MoveRightToLeft();
               Toast.makeText(mContext, "右から左", Toast.LENGTH_SHORT).show();
            } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
               // 終了位置から開始位置の移動距離が指定値より大きい
               // X軸の移動速度が指定値より大きい
               MoveLeftToRight();
               Toast.makeText(mContext, "左から右", Toast.LENGTH_SHORT).show();
            }
         } catch (Exception e) {
            // nothing
         }
         return super.onFling(e1, e2, velocityX, velocityY);
      }
   };

   @Override
   public boolean onTouchEvent(MotionEvent event) {
      return (mGestureDetector.onTouchEvent(event) | super.onTouchEvent(event));
   }

   private void MoveLeftToRight() {//左から右へ
      goForward();//進む
   }

   private void MoveRightToLeft() {//右から左
      goBack();//戻る
   }
}

//main_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:orientation="vertical"
    tools:context="jp.co.webview.MainActivity">

    <jp.co.webview.MyWebView
        android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>

※MebViewの継承をした時コンストラクタは

   public MyWebView(Context context) {
      super(context);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

   public MyWebView(Context context, AttributeSet attrs) {
      super(context, attrs);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

   public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      mContext = context;
      mGestureDetector = new GestureDetector(mContext, mSimpleOnGestureListener);
   }

の3つオーバーライドしないとコンパイル時にエラーが出ます

スポンサーリンク

シェアする

フォローする

スポンサーリンク