背景:外部ソースからテキストの断続的なストリームを受け取る ScrollView / TextView ペアがあります。更新ごとに自動的に一番下までスクロールします。
ユーザーがどこかに手動でスクロールして自動スクロールダウンモードから抜け出せるようにしたいのですが、手動スクロールと自分で行っているプログラムスクロールを区別する方法がわかりません。
私の UI 更新は、再描画をバッファリングするためにタイマーで実行されます。
private Handler outputUpdater = new Handler ();
private static String outputBuffer = "";
private static boolean outputHasChanged = false;
private static final Object lock = new Object ();
private Runnable outputUpdaterTask = new Runnable () {
public void run () {
synchronized (lock) {
// if the output has changed, update the TextView
if (outputHasChanged) {
TextView tv = (TextView) findViewById (R.id.textView);
tv.setText (outputBuffer);
}
// if the output has changed, or the scroll hasn't reached the bottom yet
// then keep scrolling down
if (outputHasChanged || !scrollAtBottom ()) {
ScrollView sv = (ScrollView) findViewById (R.id.scrollView);
sv.fullScroll (View.FOCUS_DOWN);
}
outputHasChanged = false;
}
outputUpdater.postDelayed (this, 100);
}
};
scrollAtBottom
onScrollChanged
ハンドラから値を取得します。
これはすべてうまくいきます。TextView の更新が行われている場合、または仮想キーパッドの可視性が変更された場合などは、fullScroll
への 1 回の呼び出しが常に一番下に移動するとは限らないため、テキストの更新がなかった場合でも呼び出す必要があります。fullScroll
ユーザーが手動でスクロールした場合、呼び出しを停止する決定を下すことができるようにしたいと思いますfullScroll
。
残念ながら、さまざまな UI の変更によってスクロール ビューが下部から移動するように見えるため、「下部の自動モード」から「下部ではない」への遷移を手動モードに切り替える手がかりとして単純に扱うだけでは十分ではないようです (たとえば、仮想キーパッドが表示されます)。
質問の再表示: ユーザーが開始したスクロールとプログラムによるスクロールを区別するにはどうすればよいですか?