Я ищу способ определить, полностью ли увеличен WebView. Я знаю, что вы можете получить логическое возвращаемое значение из ZoomOut(), но это приведет к уменьшению масштаба. Я просто хочу просто знать, может ли это сделать.
Я использую свой собственный класс WebView
.
Получите WebView
таблицу высот и внутреннюю html-страницу contentHeight
.
Рассчитайте defaultScale = WebView.getHeight() / WebView.getContentHeight();
и currentScale = WebView.getScale()
.
Если defaultScale
< currentScale
он увеличен.
public class NoZoomControllWebView extends WebView {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressWarnings("deprecation")
public boolean isZoomed () {
boolean result = false;
int contentHeight = getContentHeight();
int viewHeight = getHeight();
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1 ) {
float scale = getScale();
int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);
if (temp < (int)(scale * 100)) {
result = true;
}
} else {
float scale = getScale();
int temp = (int)(((float)viewHeight / (float)contentHeight) * 100);
if (temp < (int)(scale * 100)) {
result = true;
}
}
return result;
}
}
getScaled()
устарел, вы должны использовать onScaleChanged
вместо вашего WebViewClient
Вы можете использовать его следующим образом:
private boolean zoomed = false, firstRun = true;
@Override
public void onScaleChanged(WebView view, float oldScale,
float newScale) {
if (firstRun) {
initScale = newScale;
firstRun=false;
zoomed = false;
}
else {
if (newScale>oldScale) {
zoomed = true;
}
else {
if (newScale<initScale) {
zoomed = false;
}
}
}
super.onScaleChanged(view, oldScale, newScale);
}
если мы предположим, что WebView увеличен с самого начала.
Мне любопытно посмотреть, что еще кто-нибудь может придумать, но я смог выполнить это через javascript. Это разочаровывает, потому что я могу видеть значения, необходимые для того, чтобы легко определить это в исходном коде WebView, но они закрыты без геттеров...
В любом случае решение, которое я до сих пор добавляю, это JavaScriptInterface, который позволяет мне получить значение document.body.scrollWidth для страницы. Это дает мне прокручиваемую ширину, которая по какой-то причине недоступна, хотя существует метод getContentHeight(). Используя это, я могу рассчитать, полностью ли он увеличен.
Вот метод, который вызывает интерфейс javascript:
public void checkIfZoomedOut(int scrollWidth){
int zoomedOutThreshold = 5; // If you want to include "nearly zoomed out"
if( Math.abs(Math.ceil(mWebView.getScale() * scrollWidth) - mWebView.getWidth()) <= zoomedOutThreshold){
// It is zoomed out
} else {
// It is zoomed in
}
}
ScrollWidth - document.body.scrollWidth
Изменить: После дальнейших экспериментов я нашел защищенные методы, называемые computeHorizontalScrollRange() и computeHorizontalScrollExtent(), которые можно вызвать, если вы подклассифицируете WebView. Вы можете использовать их, чтобы определить, активна или необходима горизонтальная прокрутка. Тем не менее, некоторые веб-страницы могут быть полностью уменьшены (WebView не позволит вам уменьшить масштаб) и по-прежнему имеет горизонтальную полосу прокрутки, такую как веб-страницы с текстом. Так что это не идеально.
Создайте свой собственный класс, который расширяет WebView и отменяет метод zoomOut(). Каждый раз, когда пользователь масштабируется, вызывайте super.zoomOut(). Сохраните то, что возвращается логической переменной с областью класса, чтобы ее можно было сохранить с помощью onSaveInstanceState() или в SharedPreferences, если это необходимо.
public class MyWebView extends WebView {
// WebViews are generally zoomed out all the way when first created so set defaults
private boolean lastZoomInResult = true;
private boolean lastZoomOutResult = false;
@Override
public boolean zoomIn() {
lastZoomInResult = super.zoomIn();
return lastZoomInResult;
}
@Override
public boolean zoomOut() {
lastZoomOutResult = super.zoomOut();
return lastZoomOutResult;
}
РЕДАКТИРОВАТЬ: В ответ на это не работает для масштабирования зума... вы совершенно правы, и в конечном итоге ответ Кристиан верен.
Я подключил свой телефон через USB к моему компьютеру с помощью DDMS. Я вижу следующее, когда я зажимаю масштаб моего веб-представления...
01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.052: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x849ac0), pid=23072, w=1, h=1
01-06 03:18:19.082: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x849ac0), index=0, pid=23072, w=480, h=74 success
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.832: DEBUG/SurfaceFlinger(92): Layer::setBuffers(this=0x738378), pid=23072, w=1, h=1
01-06 03:18:19.852: DEBUG/SurfaceFlinger(92): Layer::requestBuffer(this=0x738378), index=0, pid=23072, w=480, h=74 success
Короче говоря, это не масштабирование WebView. То, что на самом деле происходит, - это цифровое масштабирование графического дисплея - содержимое WebView остается точно такого же размера, независимо от увеличения или уменьшения, но оно цифровое "увеличено" или "сжато", как цифровой зум на цифровой камере.
Я не совсем понимаю, что такое SurfaceFlinger, но из быстрого поиска Google мы говорим здесь о драйвере устройства.
Единственное, что изменяется в сообщениях журнала SurfaceFlinger, - это шестнадцатеричное значение для "this =", и они не имеют отношения к состоянию масштабирования. Вышеприведенная процедура регистрирует две попытки пинча, когда экран полностью уменьшен.
if( !webView.zoomOut () ){
// couldn't zoom out because the zoom out did nothing :(
// THIS IS WHAT YOU WANT TO KNOW!
} else{
webView.zoomIn(); // restore
}
Я просто хочу просто знать, может ли это сделать.
Нет способа сделать это.