Как отключить двойное масштабирование в Android WebView?
Как отключить двойное масштабирование в Android webview
, Я перепробовал много вещей, но это не сработало. Пожалуйста, предложите мне правильное решение для достижения этой цели.
На самом деле я загружаю изображение из пользовательского HTML. Я должен отключить полное масштабирование для этого.
Я попробовал следующие вещи,
webview.getSettings().setSupportZoom(false);
и даже я сохранил метатег в HTML, и я делаю это как userscalable= no
, Даже это не сработало для меня.
И я попытался с помощью GestureDetector.SimpleOnGestureListener
Пожалуйста, дайте мне знать, что я должен масштабировать что-либо в onDoubleTap
,
4 ответа
Override
onTouchEvent
в вашем WebView
,
Это работает во всех случаях.
@Override
public boolean onTouchEvent( MotionEvent event ) {
if (event.getAction() == MotionEvent.ACTION_UP) {
event.setAction(MotionEvent.ACTION_CANCEL);
super.onTouchEvent(event);
event.setAction(MotionEvent.ACTION_DOWN);
super.onTouchEvent(event);
event.setAction(MotionEvent.ACTION_UP);
}
return super.onTouchEvent(event);
}
После долгих исследований я объединил некоторые ответы, которые не работали отдельно, и понял, что вместе они отлично сработали для меня.
Это отключает двойное масштабирование в WebView.
Во-первых, вам нужно установить это в вашем WebView:
YourWebView.getSettings().setUseWideViewPort(false);
Затем вам нужно масштабировать свой WebView. Но сначала нужно получить значение шкалы:
private int GetWebViewScale(){
int WebViewWidth = YourWebView.getWidth();
Double WebViewScale = new Double(WebViewWidth)/new Double(YourWebWidth); //Here, you must change YourWebWidth with your web width (in pixels)
WebViewScale = WebViewScale * 100d;
return WebViewScale.intValue();
}
Теперь вы можете получить значение шкалы с помощью:
YourWebView.setInitialScale(GetWebViewScale());
Но это не будет работать, если вы начнете код слишком рано, поэтому вы поместите этот код в переопределение onLayoutChange WebViewClient следующим образом:
YourWebView.addOnLayoutChangeListener(new View.OnLayoutChangeListener(){
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
YourWebView.setInitialScale(getScale());
}
});
Внимание: у вас, вероятно, возникнут проблемы: (оба случилось со мной)
- WebView движется немного горизонтально. (#1)
- WebView не масштабируется. (#2)
Исправить проблему № 1:
- Просто добавьте несколько пикселей в значение "YourWebWidth". Например:
До:
Double WebViewScale = new Double(WebViewWidth)/new Double(500); //(500 is my web's width)
После:
Double WebViewScale = new Double(WebViewWidth)/new Double(505); //(500+5) - (This will add some padding at the left and right of your WebView. 2,5px at the left side; 2,5 at the right side)
Исправить проблему № 2
Вероятно, видимость вашего WebView "исчезла", и когда он есть, он не имеет ширины. Поэтому вызов GetWebViewScale не будет работать.
Вы должны называть это, когда его видимость "видима" или "невидима".
Вы проверяли вопрос ниже? Пожалуйста, проверьте, это может быть связано с вашим вопросом.
После многих проб и ошибок и исследований SO, я придумаю следующее решение, которое работает для моего приложения.
public class HelpWebView extends WebView {
private GestureDetector gestureDetector;
private AtomicBoolean mPreventAction = new AtomicBoolean(false);
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()){
mPreventAction.set(false);
return true;
}
return super.onTouchEvent(event);
} else {
return true;
}
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDoubleTap(MotionEvent e) {
mPreventAction.set(true);
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
mPreventAction.set(true);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// onSingleTapConfirmed will only be called after the detector is confident
// that the user's first tap is not followed by a second tap leading to a double-tap gesture
return false; // it doesn't matter for the return value here as we only check mPreventAction above
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
mPreventAction.set(true); // this is the key! this would block double tap to zoom to fire
return false;
}
}
}
Я воспользовался ссылкой на следующие ответы SO: /questions/25576711/android-obnaruzhivaet-dvojnoe-kasanie-bez-edinogo-kasaniya/25576729#25576729 /questions/15928069/android-webview-ispolzuet-setwideviewport-otklyuchit-dvojnoe-uvelichenie-no-sohranit-masshtabirovanie/15928083#15928083