私はこれと同じ問題を抱えていて、解決しなければなりませんでした。私はこれらの解決策を試しましたが、少なくともスクロールのパフォーマンスは最後にはまったく改善されませんでした。だからここで私が行ったworkaroudとそれが私のために働いた理由の説明。
「MiWebView」クラスを作成し、「onTouchEvent」メソッドを上書きして、少なくともすべてのドラッグイベントが発生する時間を出力することにより、ドラッグイベントを少しだけ調べる機会があった場合、それらが分離されていることがわかります。 9ミリ秒離れたところまで それは、イベント間の非常に短い時間です。
見てみましょうWebViewのソースコードを、そしてちょうどonTouchEvent機能を参照してください。プロセッサーが9ミリ秒未満で処理することは不可能です(夢を見続ける!!!)。そのため、「タッチダウンに対するWebCoreの応答を待機しているため、ドラッグに失敗しました」が常に表示されます。メッセージ。コードは時間どおりに処理できません。
それを修正するには?まず、onTouchEventコードを書き換えて改善することはできません。ただし、ドラッグムーブメントのイベントレートを、たとえば40ミリ秒または50ミリ秒に制限するために、「模擬」することができます。(これはプロセッサによって異なります)。
すべてのタッチイベントは、ACTION_DOWN-> ACTION_MOVE ...... ACTION_MOVE-> ACTION_UPのようになります。したがって、DOWNとUPの動きを維持し、MOVEレートをフィルタリングする必要があります(これらは悪者です)。
そして、これを行う方法があります(2本の指のタッチなどのイベントタイプをさらに追加できます。ここで興味があるのは、1本の指のスクロールだけです)。
import android.content.Context;
import android.view.MotionEvent;
import android.webkit.WebView;
public class MyWebView extends WebView{
public MyWebView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
private long lastMoveEventTime = -1;
private int eventTimeInterval = 40;
@Override
public boolean onTouchEvent(MotionEvent ev) {
long eventTime = ev.getEventTime();
int action = ev.getAction();
switch (action){
case MotionEvent.ACTION_MOVE: {
if ((eventTime - lastMoveEventTime) > eventTimeInterval){
lastMoveEventTime = eventTime;
return super.onTouchEvent(ev);
}
break;
}
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_UP: {
return super.onTouchEvent(ev);
}
}
return true;
}
}
もちろん、WebViewの代わりにこのクラスを使用してください。スクロールすると違いがわかります。
これはソリューションへのアプローチにすぎませんが、WebViewを使用しているときに画面がタッチするため、すべての遅延ケースに対して完全に実装されていません。しかし、それは私が見つけた最良の解決策であり、少なくとも私の特定のニーズにとってはそうです。