Android WebView에서 확대 / 축소 활성화 / 비활성화
WebSettings에는 확대 / 축소와 관련된 몇 가지 방법이 있습니다.
- WebSettings.setSupportZoom
- WebSettings.setBuiltInZoomControls
일부 장치에서는 다르게 작동하는 것으로 나타났습니다. 예를 들어, 내 Galaxy S에서는 확대 / 축소가 기본적으로 활성화되어 있지만 LG P500에서는 비활성화되어 있습니다 (이제 확대 / 축소하려면 확대 / 축소 만 활성화하고 확대 / 축소 버튼 숨기기).
P500에서 전화 setBuiltInZoomControls(true)
하면이 두 가지 변형 (멀티 터치 및 버튼)이 모두 작동합니다.
LG P500과 같은 장치에서 멀티 터치 줌을 활성화하고 줌 버튼을 비활성화하는 방법은 무엇입니까? (또한 HTC 장치에서도 동일한 문제가 있음을 알고 있습니다.)
업데이트 : 다음은 솔루션에 대한 거의 전체 코드입니다.
if (ev.getAction() == MotionEvent.ACTION_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_1_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_2_DOWN ||
ev.getAction() == MotionEvent.ACTION_POINTER_3_DOWN) {
if (multiTouchZoom && !buttonsZoom) {
if (getPointerCount(ev) > 1) {
getSettings().setBuiltInZoomControls(true);
getSettings().setSupportZoom(true);
} else {
getSettings().setBuiltInZoomControls(false);
getSettings().setSupportZoom(false);
}
}
}
if (!multiTouchZoom && buttonsZoom) {
if (getPointerCount(ev) > 1) {
return true;
}
}
이 코드는 onTouchEvent
WebView의 재정의 된 메서드에 있습니다.
나는 소스 코드를 살펴본 결과 WebView
당신이 요구하는 것을 성취 할 수있는 우아한 방법이 없다는 결론을 내 렸습니다.
내가 한 일은 서브 클래 싱 WebView
과 재정의 OnTouchEvent
였다. 에 OnTouchEvent
대한 ACTION_DOWN
, 나는이 사용하는 얼마나 많은 포인터 확인 MotionEvent.getPointerCount()
. 포인터가 두 개 이상 있으면을 호출 setSupportZoom(true)
하고 그렇지 않으면을 호출 setSupportZoom(false)
합니다. 그런 다음super.OnTouchEvent().
이것은 스크롤 할 때 확대 / 축소를 효과적으로 비활성화하고 (따라서 확대 / 축소 컨트롤을 비활성화) 사용자가 확대 / 축소하려고 할 때 확대 / 축소를 활성화합니다. 좋은 방법은 아니지만 지금까지는 잘 작동했습니다.
주 getPointerCount()
당신이 1.6를 지원하는 경우 몇 가지 여분의 물건을해야 할 것이다, 그래서 2.1에 도입되었다.
API> = 11에서는 다음을 사용할 수 있습니다.
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().setDisplayZoomControls(false);
SDK에 따라 :
public void setDisplayZoomControls (boolean enabled)
이후 : API 레벨 11
화면 줌 버튼 사용 여부를 설정합니다. 내장 확대 / 축소 컨트롤이 활성화되고 화면 확대 / 축소 컨트롤이 비활성화되어 화면 컨트롤 없이도 핀치로 확대 / 축소 할 수 있습니다.
고객을 위해 Android 애플리케이션을 작업하는 동안 동일한 문제가 발생했으며이 제한을 "해킹"할 수있었습니다.
WebView 클래스의 Android 소스 코드를 updateZoomButtonsEnabled()
살펴본 결과 브라우저의 현재 크기에 따라 확대 / 축소 컨트롤을 활성화 및 비활성화 하는 ZoomButtonsController
-object 와 함께 작동 하는 -method 를 발견했습니다 .
나는 -instance 를 반환하는 메소드를 찾고 바로이 인스턴스를 반환 ZoomButtonsController
하는 getZoomButtonsController()
-method를 찾았습니다 .
메소드가 선언되었지만 -documentation에 public
문서화되어 WebView
있지 않으며 Eclipse도 찾을 수 없습니다. 그래서 나는 그것에 대해 약간의 반성을 시도 하고 컨트롤을 트리거하는 WebView
-method를 재정의하기 위해 자신의 -subclass를 만들었습니다 onTouchEvent()
.
public class NoZoomControllWebView extends WebView {
private ZoomButtonsController zoom_controll = null;
public NoZoomControllWebView(Context context) {
super(context);
disableControls();
}
public NoZoomControllWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
disableControls();
}
public NoZoomControllWebView(Context context, AttributeSet attrs) {
super(context, attrs);
disableControls();
}
/**
* Disable the controls
*/
private void disableControls(){
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
// Use the API 11+ calls to disable the controls
this.getSettings().setBuiltInZoomControls(true);
this.getSettings().setDisplayZoomControls(false);
} else {
// Use the reflection magic to make it work on earlier APIs
getControlls();
}
}
/**
* This is where the magic happens :D
*/
private void getControlls() {
try {
Class webview = Class.forName("android.webkit.WebView");
Method method = webview.getMethod("getZoomButtonsController");
zoom_controll = (ZoomButtonsController) method.invoke(this, null);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
super.onTouchEvent(ev);
if (zoom_controll != null){
// Hide the controlls AFTER they where made visible by the default implementation.
zoom_controll.setVisible(false);
}
return true;
}
}
불필요한 생성자를 제거하고 예외에 대해 반응 할 수 있습니다.
이것은 불안정하고 불안정 해 보이지만 API 레벨 4 (Android 1.6)로 돌아갑니다.
으로 @jayellos이 코멘트에 지적, 민간 getZoomButtonsController()
-method는 안드로이드 4.0.4에 존재하는 더 이상 없습니다.
그러나 그럴 필요는 없습니다. 조건부 실행을 사용하면 API 레벨 11 이상을 사용하는 기기에 있는지 확인하고 노출 된 기능 ( @Yuttadhammo 답변 참조 )을 사용하여 컨트롤을 숨길 수 있습니다.
정확히 그렇게하기 위해 위의 예제 코드를 업데이트했습니다.
Lukas Knuth의 해결책을 약간 수정했습니다.
1) webview를 하위 클래스로 만들 필요가 없습니다.
2) 존재하지 않는 메서드를 별도의 클래스에 넣지 않으면 일부 Android 1.6 장치에서 바이트 코드 확인 중에 코드가 충돌합니다.
3) 사용자가 페이지를 위 / 아래로 스크롤하면 확대 / 축소 컨트롤이 계속 나타납니다. 줌 컨트롤러 컨테이너를 가시성 GONE으로 설정하기 만하면됩니다.
wv.getSettings().setSupportZoom(true);
wv.getSettings().setBuiltInZoomControls(true);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {
// Use the API 11+ calls to disable the controls
// Use a seperate class to obtain 1.6 compatibility
new Runnable() {
public void run() {
wv.getSettings().setDisplayZoomControls(false);
}
}.run();
} else {
final ZoomButtonsController zoom_controll =
(ZoomButtonsController) wv.getClass().getMethod("getZoomButtonsController").invoke(wv, null);
zoom_controll.getContainer().setVisibility(View.GONE);
}
Lukas Knuth에는 좋은 솔루션이 있지만 Samsung Galaxy SII의 Android 4.0.4에서는 여전히 확대 / 축소 컨트롤이 보입니다. 그리고 나는 그것을 통해 그것을 해결합니다
if (zoom_controll!=null && zoom_controll.getZoomControls()!=null)
{
// Hide the controlls AFTER they where made visible by the default implementation.
zoom_controll.getZoomControls().setVisibility(View.GONE);
}
대신에
if (zoom_controll != null){
// Hide the controlls AFTER they where made visible by the default implementation.
zoom_controll.setVisible(false);
}
The solution you posted seems to work in stopping the zoom controls from appearing when the user drags, however there are situations where a user will pinch zoom and the zoom controls will appear. I've noticed that there are 2 ways that the webview will accept pinch zooming, and only one of them causes the zoom controls to appear despite your code:
User Pinch Zooms and controls appear:
ACTION_DOWN
getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false);
ACTION_POINTER_2_DOWN
getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true);
ACTION_MOVE (Repeat several times, as the user moves their fingers)
ACTION_POINTER_2_UP
ACTION_UP
User Pinch Zoom and Controls don't appear:
ACTION_DOWN
getSettings().setBuiltInZoomControls(false); getSettings().setSupportZoom(false);
ACTION_POINTER_2_DOWN
getSettings().setBuiltInZoomControls(true); getSettings().setSupportZoom(true);
ACTION_MOVE (Repeat several times, as the user moves their fingers)
ACTION_POINTER_1_UP
ACTION_POINTER_UP
ACTION_UP
Can you shed more light on your solution?
Improved Lukas Knuth's version:
public class TweakedWebView extends WebView {
private ZoomButtonsController zoomButtons;
public TweakedWebView(Context context) {
super(context);
init();
}
public TweakedWebView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TweakedWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
getSettings().setBuiltInZoomControls(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getSettings().setDisplayZoomControls(false);
} else {
try {
Method method = getClass()
.getMethod("getZoomButtonsController");
zoomButtons = (ZoomButtonsController) method.invoke(this);
} catch (Exception e) {
// pass
}
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
boolean result = super.onTouchEvent(ev);
if (zoomButtons != null) {
zoomButtons.setVisible(false);
zoomButtons.getZoomControls().setVisibility(View.GONE);
}
return result;
}
}
hey there for anyone who might be looking for solution like this.. i had issue with scaling inside WebView so best way to do is in your java.class where you set all for webView put this two line of code: (webViewSearch is name of my webView -->webViewSearch = (WebView) findViewById(R.id.id_webview_search);)
// force WebView to show content not zoomed---------------------------------------------------------
webViewSearch.getSettings().setLoadWithOverviewMode(true);
webViewSearch.getSettings().setUseWideViewPort(true);
참고URL : https://stackoverflow.com/questions/5125851/enable-disable-zoom-in-android-webview
'developer tip' 카테고리의 다른 글
문자열에 알파벳 문자가 포함되어 있는지 어떻게 확인할 수 있습니까? (0) | 2020.11.19 |
---|---|
scrollIntoView 너무 멀리 스크롤 (0) | 2020.11.19 |
각도 4 단위 테스트 오류`TypeError : ctor is not a constructor` (0) | 2020.11.19 |
null을 확인하고 그렇지 않은 경우 다른 값을 할당하는 가장 짧은 방법 (0) | 2020.11.19 |
입력 IP가 특정 IP 범위에 속하는지 확인하는 방법 (0) | 2020.11.19 |