2010-12-28 1 views
2

それで、基本的には、さまざまなViewGroupsを持つScrollViewがあり、その中にビューが追加され、アクティビティはそれらのビューのクリックに応答する必要があります。残念ながら、私がOnClickListenerを設定すると、ScrollViewsの反応時間が遅くなり、スクロールやフリングの動作が遅くなります(問題のビューから開始するとき)。添付されたOnClickListenersを持つビューは、ScrollViewを遅くします。何ができますか?

この問題を解決する方法はありますか?

+0

スクロールビューを使用する必要がありますか?あなたはリストビューを使用できませんか? – Falmarri

+0

私のレイアウトは複雑すぎる(見た目も使い勝手も良いので単純化できない)。それを行で分割することができても、すべての行にはクリックに個別に対応する必要があります。 – sniurkst

+0

あなたは、1つのジェスチャーがスロー・ビューをスクロールさせ、リスナーが発言することが遅い振る舞いを引き起こすと言っていますか?それは起こってはならないし、それがバグであるならば、 –

答えて

3

ええ、私はあなたのレイアウトの複雑さを低減することがあなたを助けることはよく分かりません。あなたのデバイス/エミュレータはどのAPIバージョンで動作していますか?なぜなら、あなたが説明したように、クリック可能なビュー上でスクロールイベントを開始することについて、2.1から2.2への変更が気づいたからです。

私の場合、requestDisallowInterceptTouchEvent()メソッドを使用してネストスクロールを有効にしています。通常これにより、ScrollViewまたはListView を別のScrollView内に内に配置しても、正しくスクロールできます。ただし、APIレベル8から、「クリック可能」コントロールでタッチイベントが開始された場合、この「ネストされたスクロール」は機能しなくなりました。ああ!なぜそれが起こるのかを正確に判断するためにソースを見ていないが、それはあなたの問題に関連しているように思える。

クリック可能なコントロールがタッチイベントを消費する方法が最近変更されたようで、場合によっては両親に悪影響を及ぼします。私は解決策があるのか​​疑問だ。

編集:
あなたは「クリック」別の方法を実装したい場合は、それは確かに可能です。私は通常それをお勧めしませんが、あなたのスクロールのパフォーマンスがどれほど悪いのか分かりません。あなた次第。

もしあなたがそれをしたいのであれば、あなたのScrollViewにOnTouchListenerを追加することができますが、それはもっと難しい方法でしょう。 ACTION_UPイベントをリッスンする必要がありますが、対応するACTION_DOWNイベントがy方向に遠くにあるtouchSlop未満の場合のみイベントを消費します(touchSlopListViewがスクロールを開始する前にタッチが移動する最小距離です... ViewConfigurationからこの値を取得します)。イベントを消費するときは、クリック可能なコントロールの位置と比較するために、イベントの座標にとListView.getScrollY()を追加する必要があります。また、「長いクリック」が必要な場合は、それらを実装するためにさらに多くの作業を行う必要があります。また、タッチイベントのためのものだけです...ユーザーがトラックボールをクリックするためにキーリスナーを追加する必要もあります。

代わりに、OnClickListenerではなくOnTouchListenerを各コントロールに追加できると思います。ソースコードの表示を確認して、クリックがどのように登録されているかを確認します。あなたは "長いクリック"を登録する必要がない場合は、それははるかに簡単になります。次に、ACTION_UPイベントをクリックして処理することができます。トラックボールのクリックを処理するには、キーリスナーも必要です。

マイナースクロールしゃっくりのための多くの作業のようです。私はそれが本当により深刻な問題であると私は思うよりも、正しく質問を理解していないのだろうか?

+0

まあ、これは今のところ "答え"でなければならないと思う。スクロールビューで起こっているタップイベント(残念なことに、クリックと同じくらいうまくいかない)を聞く方法や、クリック可能なコントロールが検出されたことを検出してそのコントロールにクリック/タップイベントを渡す方法があると思いますか? – sniurkst

+0

あなたのコメントへの返信として私の投稿を編集しました。 –

2

Androidプラットフォームの仕様はわかりませんが、一般的にはイベントハンドラでできるだけ少なくすることをお勧めします。興味のあるイベントであることをすばやく確認し、タスクをキューに入れます。別のスレッドを使用してキューからタスクを取り出し、集約して実行します。

+0

これは良いアドバイスですが、私の場合は「タッチレスポンダがタッチを処理すべきである」というより多くのコンフリクトがあります。 – sniurkst

0

なぜあなたはそれを遅くするOnClickListenersだと思いますか?

すべてのクリックリスナーをnullに設定し、アプリを使用しようとします。今は速いですか?

それ以外の場合は、あなたのアプリをプロファイリングして、遅いことを確認してください。

+0

私のscrollviewが遅くて不安定な状態で走っていたので、私は本当にこのポストを感謝しています。各ビューには、長いクリックとontouchイベントリスナーのonclickがあります。私はそれをテストすることにより、大変遅くなっていたオンタッチリスナーであることが分かったので、大規模なスクロールビューで1000を超えるテキストビューでも、コードをontouch listnerで実行していたプロセスを大幅に削減しました。ファンタスティック!!!!! – gbotha

関連する問題