2012-03-19 14 views
3

弾力のあるスクロール効果を実装するにはどうすればいいですか?デルファイXE2 FireMonkeyの標準TListBoxコンポーネントを使用してリスト上でlike this one(マウスドラッグでスクロール)するにはどうすればよいですか?TListBox弾みスクロール効果

+0

「バウンススクロール」とは何ですか? – Kromster

+0

@KromSternそれは「タッチスタイル」のスクロールで、スクロールするとコンテンツを上にスクロールできますが、スクロールすると正しい位置に戻ります。 –

+0

FireMonkeyについてnuthinは分かりません。しかし、それが "標準の" Win32の 'ListBox'の場合、その動作を取得することはできません.Windowsのコントロールはそれを提供しません。私はいくつかのカスタムコントロールで同じ効果を得ようとしましたが、思ったよりもずっと難しいです。 –

答えて

0

TListBox.ChildrenCount-1を使用して、Position.YTListBox.Parent.Height + TListBoxItem.height未満であるかどうかを確認することがあります。さらに、「MouseIsDown」などのグローバルboolean変数を作成します。

TListBox内のすべての項目は、実際に作業して直接変更できる子オブジェクトなので、大きな空のTListBoxItemを簡単に作成し、リストの最後のオブジェクトとして設定されていることを確認します。

OnMouseDownには、MouseIsDownをTrueに、OnMouseUpにはfalseを設定します。

補間プロパティをitElasticまたはitBounceに設定して、TListBoxにTFloatAnimationを追加します。 MouseIsDownがfalseに設定されている場合、このエフェクトを無効にし、MouseIsDownがtrueに設定されている場合はエフェクトを有効にします。リストの位置を最後の有効なオブジェクトにリセットするには、いくつかの作業を行う必要があります。おそらくアニメーション自体のOnFinishイベントでこれを行うでしょう。

さらに適切なのは、その最後のオブジェクトの位置を計算し、アニメーションのStopValueをその値に設定することです。


基本的に、あなたはリストの最後の有効なオブジェクト(すなわちない大きな空白オブジェクト)の座標は、リストボックスの高さを一致させるかどうかを確認する必要があります。もしそうで、マウスが押されていなければ、アニメーションが有効になり、スクロールボックスがバウンスします。それらが一致し、マウスがダウンしている場合、アニメーションは無効になるので、OnFinishも起動されないので、スクロールボックスはその位置をリセットしません。

それぞれの値が真であることを確認するには、繰り返しネストされたプロシージャを実行する必要があります。

これはiOSの実装ほど滑らかではありませんが、それはあなたに何かを与える必要があります。

関連する問題