今まで私は iPhone の開発者だけでしたが、Android を試してみることにしました。Androidで理解できなかったのは、プログラムでスクロールを防ぐ方法WebView
です ?
イベントのiPhoneの防止に似た何かonTouchMove
が素晴らしいでしょう!
今まで私は 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);
垂直方向にスクロールする scrollview でwebview をラップし、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 のすべてのスクロールを無効にすることを忘れないでください。垂直 ScrollView は、WebView のコンテンツのスクロールを可能にします。
モーション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
}
}
ソースを見ると、overScrollByWebView
をonTouchEvent
呼び出すdoDrag
呼び出しがわかります。
まだ必要かどうかはわかりませんが、解決策は次のとおりです。
appView = (WebView) findViewById(R.id.appView);
appView.setVerticalScrollBarEnabled(false);
appView.setHorizontalScrollBarEnabled(false);
本文に余白の詳細を追加すると、コンテンツが適切に折り返される場合にスクロールが妨げられます。次のようになります。
<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));
}
});
まだこの問題に遭遇していないので試していませんが、おそらく onScroll 関数をオーバーライドできますか?
@Override
public void scrollTo(int x, int y){
super.scrollTo(0,y);
}
私の汚いが、実装が簡単でうまく機能するソリューション:
webview を scrollview 内に配置するだけです。WebView を可能なコンテンツよりもはるかに大きくします (要件に応じて、1 つまたは両方のディメンションで)。..スクロールビューのスクロールバーを必要に応じて設定します。
Web ビューで水平スクロールバーを無効にする例:
<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);
}
});
ちらつきと自動スクロールを次の方法で解決しました。
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 を拡張することをお勧めします。
これはあなたの問題の原因ではないかもしれませんが、iPhone で正常に動作するアプリケーションが Android ブラウザで垂直/水平スクロールバーを常にスローし、実際にページを移動させる理由を追跡するのに何時間も費やしました。高さと幅が 100% に設定された html body タグがあり、body はさまざまな場所にさまざまなタグでいっぱいでした。私が何を試しても、Android ブラウザーはスクロール バーを表示し、ページを少しだけ移動します。APKで何もしなくてもうまくいった解決策は、bodyタグに次を追加することでした:
leftmargin="0" topmargin="0"
body タグのデフォルトのマージンがドロイドに適用されていたようですが、iPhone では無視されました。
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);
}
}