スクロールを停止スクロール

ScrollView要素からDrag'n'Dropを作成する必要がありました。

また、Froyoから始めて、無関係なライブラリを使用せずに、すべてのデバイスでこの問題を解決します。

要素をドラッグするプロセスは問題ではありません。

問題は、リストのスクロールを無効にした後、リストのスクロールを無効にすることです。



実際、ScrollViewから要素をドラッグして適切な場所に移動した後、ScrollViewは引き続き動きを監視し、スクロールし続けます。 これは機能には影響しませんが、インターフェース設計の観点からは受け入れられません。

トピックは非常に簡単です。 ほとんどすべてのプログラマーが自分でこの問題を解決できると思います。

しかし問題は、自転車を発明する代わりに、解決策を求めてインターネットを頻繁に閲覧することです。

そして見つけます。 stackoverflowを含めると、完全に「実用的な」ソリューションが提供されます。

誰かが徹底的なチェックなしでコードに適用できることに驚かないでしょう...

ソリューションは次のようになります。

dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0));
      
      







一見-適切なソリューション。 そしてそれは動作します! ただし、ScrollViewのタッチ処理は中断されます。 その結果、予測できない時点でスタックオーバーフローが発生し、アプリケーションがクラッシュします。

ソリューションはきれいに見えますが、使用できません! ここでのポイントは、作成後にイベントをリリースする必要があるだけではありません。



もう少し洗練されたソリューションがありますが、はるかに安全で予測可能です。

ScrollViewの機能を次のように拡張する必要があります。

 public class ScrollViewEx extends ScrollView { protected boolean scrollActive = true; public ScrollViewEx(Context context) { super(context); } public ScrollViewEx(Context context, AttributeSet attrs){ super(context,attrs); } public ScrollViewEx(Context context, AttributeSet attrs, int defStyle){ super(context,attrs,defStyle); } public void stopScroll(){ scrollActive = false; } @Override public boolean dispatchTouchEvent(MotionEvent event){ if (event.getAction()==MotionEvent.ACTION_DOWN) scrollActive = true; if (scrollActive || event.getAction()!=MotionEvent.ACTION_MOVE) return super.dispatchTouchEvent(event); return false; } }
      
      







ここでは非常に簡単なことを行います-スクロールを無効にするための変数が作成されます。

変数はプログラマーによって適切なタイミングで設定され、要素をクリックすると自動的にリセットされます。

変数が行うことは、ウィジェットが「タッチムーブ」イベントを処理するのをブロックすることだけです。

したがって、適切なタイミングでstopScrollメソッドを呼び出します。その後、リストはタッチメッセージを処理し続けますが、移動には応答しません。 スクロールは発生しません。

ユーザーがリストを再度クリックすると、スクロールが再びオンになります。

問題は解決しました。 さらに、コードははるかに予測可能で正確です。



All Articles