AndroidのWebViewで,ズーム処理を自前で実装する方法.縮尺ごとに内容を切り替える場合などに使えると思います.

WebViewのズーム処理をカスタマイズする

電子国土の閲覧プログラムの関係で,WebViewが持っているズームバーは拝借して表示するが, 実際のズーム処理は自前で実装するということをやってみた.結構面倒だったのでメモ.

ズームバー ↓
zoombar.png

概要

  1. WebViewの派生クラスを作る
  2. WebView#zoomIn(),WebView#zoomOut()をオーバーライドする
  3. WebSettings#setBuiltInZoomControls(true) にする
  4. ズームバーを出したいタイミング(タッチイベント)で,WebView#invokeZoomPicker() を呼び出す

実装

ビュークラス
import android.app.Activity;
import android.util.Log;
import android.view.MotionEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class CustomZoomWebView extends WebView {
	public CustomZoomWebView(Activity act, String url) {
		super(act);

		setFocusable(true);
		setFocusableInTouchMode(true);
		setWebViewClient(new WebViewClient());
		getSettings().setBuiltInZoomControls(true);

		loadUrl(url);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_UP && event.getHistorySize() <= 1) {
			// ズームバーを表示する
			invokeZoomPicker();
		}
		return true;
	}

	@Override
	public boolean zoomIn() {
		// 自前のズームイン処理
		Log.d("test", "zoomIn");
		return true;
	}

	@Override
	public boolean zoomOut() {
		// 自前のズームアウト処理
		Log.d("test", "zoomOut");
		return true;
	}
}
アクティビティからの呼び出し例
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.webkit.WebView;

public class TestAct extends Activity
{
	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);

		WebView webView = new CustomZoomWebView(this, "http://kamoland.com/rss.html");

		setContentView(webView, new LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
			ViewGroup.LayoutParams.FILL_PARENT));
	}
}
ズームバーを表示するタイミングの判定は,微妙です. 俺はこんな感じでいいかなと思ってますが,お好みに合わせて...


© 2024 KMIソフトウェア