在WebView中禁用滚动?
-
22-09-2019 - |
题
到目前为止,我一直是iPhone开发人员,现在我决定给Android旋转。我无法在Android上弄清楚的事情是如何在编程中防止滚动 WebView
?
类似于预防iPhone的东西 onTouchMove
活动会很棒!
解决方案
这是我的代码 禁用所有滚动 在WebView:
// disable scroll on touch
webview.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
仅隐藏滚动条,但不会禁用滚动:
WebView.setVerticalScrollBarEnabled(false);
WebView.setHorizontalScrollBarEnabled(false);
或者您可以尝试使用 单列布局 但这仅适用于简单的页面,并且可以禁用水平滚动:
//Only disabled the horizontal scrolling:
webview.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
你也可以尝试 包装您的网络浏览量 通过垂直滚动滚动浏览和禁用所有滚动在WebView上:
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical" >
<WebView
android:id="@+id/mywebview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none" />
</ScrollView>
并设置
webview.setScrollContainer(false);
不要忘记添加 webview.setOnTouchListener(...)
上面的代码禁用WebView中的所有滚动。垂直卷轴将允许滚动WebView的内容。
其他提示
我不知道您是否仍然需要它,但这是解决方案:
appView = (WebView) findViewById(R.id.appView);
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
制作 WebView
忽略运动事件是错误的方法。如果是 WebView
需要听到这些事件吗?
而不是子类 WebView
并覆盖非私有卷轴方法。
public class NoScrollWebView extends WebView {
...
@Override
public boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY, int maxOverScrollX,
int maxOverScrollY, boolean isTouchEvent) {
return false;
}
@Override
public void scrollTo(int x, int y) {
// Do nothing
}
@Override
public void computeScroll() {
// Do nothing
}
}
如果您的内容正确包装,则将保证金详细信息添加到身体中会阻止滚动:
<body leftmargin="0" topmargin="0" rightmargin="0" bottommargin="0">
足够容易,更少的代码 +错误开销:)
在您的WebView上设置侦听器:
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return(event.getAction() == MotionEvent.ACTION_MOVE));
}
});
我还没有尝试过这个问题,但也许您可以超越滚动功能?
@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}
我的肮脏,但易于实施和工作良好的解决方案:
只需将WebView放入滚动视图中即可。使WebView远大于可能的内容(根据要求,在一个或两个方面)。 ..并根据需要设置ScrollView的滚动条。
在网络浏览量上禁用水平滚动条的示例:
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="vertical"
>
<WebView
android:id="@+id/mywebview"
android:layout_width="1000dip"
android:layout_height="fill_parent"
/>
</ScrollView>
我希望这有帮助 ;)
禁用滚动使用此
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event)
{
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
这可能不是您问题的根源,但是我花了几个小时试图跟踪为什么我在iPhone上工作正常的应用程序导致Android浏览器不断地抛出垂直/水平滚动条并实际移动页面。我有一个HTML车身标签,高度和宽度设置为100%,并且车身在不同位置都有各种标签。无论我尝试什么,Android浏览器都会显示其滚动条,并将页面移动一点,尤其是在快速滑动时。不必在APK中做任何事情的解决方案就是将以下内容添加到身体标签中:
leftmargin="0" topmargin="0"
似乎在机器人上应用了车身标签的默认利润率,但在iPhone上忽略了
我解决了闪烁和自动滚动:
webView.setFocusable(false);
webView.setFocusableInTouchMode(false);
但是,如果由于某种原因仍然不起作用,请简单地完成扩展WebView的类,然后将此方法放在上面:
// disable scroll on touch
setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return (event.getAction() == MotionEvent.ACTION_MOVE);
}
});
我建议扩展WebView,以提供更有效的控制,例如禁用/启用滑动,启用/禁用触摸,听众,控制过渡,动画,在内部定义设置。
如果你 子类 WebView,您只需覆盖OnTouchEvent即可滤除触发滚动的移动事件。
public class SubWebView extends WebView {
@Override
public boolean onTouchEvent (MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_MOVE) {
postInvalidate();
return true;
}
return super.onTouchEvent(ev);
}
...
研究上述答案几乎对我有用...但是我仍然遇到了一个问题,我可以在2.1上“揭开”观点(似乎用2.2&2.3固定)。
这是我的最终解决方案
public class MyWebView extends WebView
{
private boolean bAllowScroll = true;
@SuppressWarnings("unused") // it is used, just java is dumb
private long downtime;
public MyWebView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public void setAllowScroll(int allowScroll)
{
bAllowScroll = allowScroll!=0;
if (!bAllowScroll)
super.scrollTo(0,0);
setHorizontalScrollBarEnabled(bAllowScroll);
setVerticalScrollBarEnabled(bAllowScroll);
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
if (!bAllowScroll)
downtime = ev.getEventTime();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (!bAllowScroll)
{
try {
Field fmNumSamples = ev.getClass().getDeclaredField("mNumSamples");
fmNumSamples.setAccessible(true);
Field fmTimeSamples = ev.getClass().getDeclaredField("mTimeSamples");
fmTimeSamples.setAccessible(true);
long newTimeSamples[] = new long[fmNumSamples.getInt(ev)];
newTimeSamples[0] = ev.getEventTime()+250;
fmTimeSamples.set(ev,newTimeSamples);
} catch (Exception e) {
e.printStackTrace();
}
}
break;
}
return super.onTouchEvent(ev);
}
@Override
public void flingScroll(int vx, int vy)
{
if (bAllowScroll)
super.flingScroll(vx,vy);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
if (bAllowScroll)
super.onScrollChanged(l, t, oldl, oldt);
else if (l!=0 || t!=0)
super.scrollTo(0,0);
}
@Override
public void scrollTo(int x, int y)
{
if (bAllowScroll)
super.scrollTo(x,y);
}
@Override
public void scrollBy(int x, int y)
{
if (bAllowScroll)
super.scrollBy(x,y);
}
}
这应该是完整的答案。如@Gdanger的建议。扩展WebView以覆盖滚动方法,并在布局XML中嵌入自定义WebView。
public class ScrollDisabledWebView extends WebView {
private boolean scrollEnabled = false;
public ScrollDisabledWebView(Context context) {
super(context);
initView(context);
}
public ScrollDisabledWebView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
initView(context);
}
// this is important. Otherwise it throws Binary Inflate Exception.
private void initView(Context context) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY,
int scrollRangeX, int scrollRangeY, int maxOverScrollX,
int maxOverScrollY, boolean isTouchEvent) {
if (scrollEnabled) {
return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,
scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent);
}
return false;
}
@Override
public void scrollTo(int x, int y) {
if (scrollEnabled) {
super.scrollTo(x, y);
}
}
@Override
public void computeScroll() {
if (scrollEnabled) {
super.computeScroll();
}
}
}
然后将布局文件嵌入如下
<com.sample.apps.ScrollDisabledWebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
tools:context="com.sample.apps.HomeActivity"/>
然后,在活动中,也使用一些其他方法来禁用滚动条。
ScrollDisabledWebView webView = (ScrollDisabledWebView) findViewById(R.id.webView);
webView.setVerticalScrollBarEnabled(false);
webView.setHorizontalScrollBarEnabled(false);
只是使用 android:focusableInTouchMode="false"
在你的 WebView.