Android WebView использует setWideViewPort, отключить двойное увеличение, но сохранить масштабирование?
Я использую этот код, и он работает именно так, как я хочу. Но я должен реализовать другую функцию при двойном касании и хотел бы отключить масштабирование двойным касанием (но с сохранением функции масштабирования по пинчу).
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setSupportZoom(true);
webView.setInitialScale(1);
Попытка вручную вычислить масштаб, но безуспешно (что кажется сложным для этого). Отключить двойное нажатие Zoom/Unzoom на веб-просмотр
Android Webview - веб-страница должна соответствовать экрану устройства
Есть ли способ использовать setUseWideViewPort и Zoomcontrolls, но только отключить или переопределить масштабирование двойным касанием?
4 ответа
Лучшее решение, просто расширьте свой WebView из MyWebView
public class HelpWebView extends WebView {
private GestureDetector gestureDetector;
private AtomicBoolean mPreventAction = new AtomicBoolean(false);
private AtomicLong mPreventActionTime = new AtomicLong(0);
public HelpWebView(Context context) {
super(context);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public HelpWebView(Context context, AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public HelpWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
gestureDetector = new GestureDetector(context, new GestureListener());
}
public HelpWebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing) {
super(context, attrs, defStyle, privateBrowsing);
gestureDetector = new GestureDetector(context, new GestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int index = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
int pointId = event.getPointerId(index);
// just use one(first) finger, prevent double tap with two and more fingers
if (pointId == 0){
gestureDetector.onTouchEvent(event);
if (mPreventAction.get()){
if (System.currentTimeMillis() - mPreventActionTime.get() > ViewConfiguration.getDoubleTapTimeout()){
mPreventAction.set(false);
} else {
return true;
}
}
return super.onTouchEvent(event);
} else {
return true;
}
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
mPreventAction.set(true);
mPreventActionTime.set(System.currentTimeMillis());
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
mPreventAction.set(true);
mPreventActionTime.set(System.currentTimeMillis());
return true;
}
}
}
Нашел решение:
class MyWebView extends WebView {
public boolean onTouchEvent(MotionEvent event) {
gd.onTouchEvent(event);
// disable double tap zooming
if(doubleTap)
{
doubleTap = false;
return false;
}
return super.onTouchEvent(event);
}
GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
public boolean onDoubleTap(MotionEvent e) {
showToast("Double tap");
doubleTap = true;
return false;
}
}
Извините, у меня нет времени, чтобы проверить это, но попробуйте:
GestureDetector.SimpleOnGestureListener sogl = new GestureDetector.SimpleOnGestureListener() {
public boolean onDoubleTap(MotionEvent e) {
showToast("Double tap");
return true; //instead of false
}
}
GestureDetector с решением "одним (первым) пальцем" не работает надежно. Веб-представление по-прежнему иногда увеличивается на Galaxy S3 Android 4.0.4. Дополнительный WebViewClient, подобный этому, может быть использован для восстановления масштаба при увеличении вида:
public class NoZoomedWebViewClient extends WebViewClient {
private static final String LOG_TAG = "NoZoomedWebViewClient";
private static final long STABLE_SCALE_CALCULATION_DURATION = 2 * 1000;
private long stableScaleCalculationStart;
private String stableScale; // Avoid comparing floats
private long restoringScaleStart;
NoZoomedWebViewClient() {
stableScaleCalculationStart = System.currentTimeMillis();
}
@Override
public void onScaleChanged(final WebView view, float oldScale, float newScale) {
Log.d(LOG_TAG, "onScaleChanged: " + oldScale + " -> " + newScale);
long now = System.currentTimeMillis();
boolean calculating = (now - stableScaleCalculationStart) < STABLE_SCALE_CALCULATION_DURATION;
if (calculating) {
stableScale = "" + newScale;
} else if (!stableScale.equals("" + newScale)) {
boolean zooming = (now - restoringScaleStart) < STABLE_SCALE_CALCULATION_DURATION;
if (!zooming) {
Log.d(LOG_TAG, "Zoom out to stableScale: " + stableScale);
restoringScaleStart = now;
view.zoomOut();
// Just to make sure, do it one more time
view.postDelayed(new Runnable() {
@Override
public void run() {
view.zoomOut();
}
}, STABLE_SCALE_CALCULATION_DURATION);
}
}
}
}