2

ネイティブの Symbian コンポーネントがいかにうまく実装されているかに驚かされます。それらの 1 つが CAknSlider です。CAknSlider は、ユーザーが垂直方向または水平方向のバーに沿ってスライドするために使用できるスライダーを持つコントロールです。

スライダーをスライドさせると、スライドが非常にスムーズになり、ちらつきがなくなりました。しかし、何らかの理由でカスタム スライダー コントロールを実装することになった場合、CAknSlider ほどきれいにはなりません。

したがって、私の質問は、CAknSlider が内部でどのように実装されているかをどのように理解できるかということです。ラジオ アプリケーションにカスタム スライダーを実装して、オーディオ ストリームの音量を制御したいと考えています。

どうすればいいですか。


[編集: laalto からのコメントに応えて]

CAknSlider コントロールは、設定画面の設定項目として実装されることが多いです。

複合コントロール コンテナー ( CCoeControl や CAknView など) 内のコンポーネント コントロールとして実装されているのを見たことがありません。これは私がこれまでに試したことです:

最初に、以下のようなスライダー コントロールを記述するリソース ファイルを作成しました。

RESOURCE SLIDER r_volume_slider
{
 layout=EAknCtSlider;
 minvalue=0;
 maxvalue=10;
 step=1;
 valuetype=EAknSliderValuePercentage;
 minlabel="mute";
 maxlabel="full";
}

次に、ソースのリソース ファイルを使用して、以下のようなスライダーを作成しています。

void CVolumePopupAppView::ConstructL(const TRect& aRect)
{
// Create a window for this application view
CreateWindowL();

InitComponentArrayL( );
iSlider = new ( ELeave ) CAknSlider( );
TResourceReader reader;
iEikonEnv->CreateResourceReaderLC( reader, R_VOLUME_SLIDER );

iSlider->ConstructFromResourceL( reader );
CleanupStack::PopAndDestroy ( );
iSlider->SetContainerWindowL( *this );
iSlider->SetParent( this );

Components().AppendLC( iSlider );

CleanupStack::Pop ( iSlider );

// Set the windows size
SetRect(aRect);

// Activate the window, which makes it ready to be drawn
ActivateL();
}

ここで、設定項目としての CAknSlider ( Screenshot1 ) と、上記の手法で作成された CAknSlider ( Screenshot2 ) の比較を示します。私が作成したものには、リソースで指定したにもかかわらず、パーセント値インジケーターと最小および最大のテキスト ラベルがないことに注意してください。見た目も手触りも残念。

4

2 に答える 2

2

画面全体のダブルバッファリングから、実際に変更されたコントロールの部分のみを再描画するなどのより単純な最適化まで、ちらつきを回避するための多くの手法があります。適切な長方形を事前に描画して、スライダーがあった場所とその次のステップをブリットすることは、おそらくそれを効率的に行う最も簡単な方法です.

CAknSlider がどのようにそれを行うかを正確に知るには、次のいずれかを実行できます。1) Symbian Foundation プラットフォームの関連パッケージがオープン ソース (EPL) になるのを待つ (今後 12 か月以内の予定)、または 2) Symbian Foundation に参加して入手する今すぐソースにアクセス

EDIT:(グラフィックスの最適化に関する詳細のリクエストに応じて)

最も一般的なちらつきは、コントロール全体を再描画することによって発生します。ちらつきのないいくつかのカスタム コントロールを (移植プロジェクトを通じて) ここに実装しました: http://developer.symbian.com/main/documentation/porting/#linux2 スライダーのようなものさえあります。この例は理想とはほど遠いものです。ブリッティング用に事前に描画された四角形はありませんが、グラフィックは非常に単純な線と塗りつぶされた四角形です。ただし、変更された部分だけを上書きするという概念は同じです。事前に描画されたセクションをブリットします。スライダーの背景をオフスクリーン ビットマップに描画し、スライダーの可動部分で同じことを行います。スライダーが移動したら、オフスクリーンの背景 (消去する必要がある部分のみ) から BitBlt() を実行して可動部分を消去し、次に可動部分を新しい位置に BitBlt() します。

それは理にかなっていますか?

于 2009-05-29T07:19:28.467 に答える
1

CAknSlider が必要ですか? それを盗みます!:) CAknSliderSettingPage がすべてを行います。私たちは、それを使うだけです。

iSettingPage = new(ELeave) CAknSliderSettingPage(R_SLIDER_PAGE, iValue);
iSettingPage->ConstructL();

iSettingPage->SetSize(iSettingPage->MinimumSize());

TInt CCustomColorPalette::CountComponentControls() const
{
    return 1;
}

CCoeControl* CCustomColorPalette::ComponentControl( TInt aIndex ) const
{
   return iSettingPage->SliderControl();
}
于 2009-06-01T20:43:09.653 に答える