2009-05-29 1 views
2

Ich bin erstaunt, wie gut die nativen Symbian-Komponenten implementiert sind. Einer von ihnen ist CAKnSlider. CaknSlider ist ein Steuerelement mit einem Schieberegler, mit dem Benutzer es entlang einer Leiste verschieben können, deren Ausrichtung vertikal oder horizontal sein kann.CaknSlider-Steuerelement innerhalb eines CAknView-Containers (nicht als Einstellungselement)

Jetzt, wenn Sie den Schieberegler schieben, ist das Gleiten sehr glatt und flackert nicht. Aber wenn ich aus irgendeinem Grund einen benutzerdefinierten Schieberegler implementieren würde, würde ich es nicht so sauber wie CAKnSlider bekommen.

Also meine Frage ist, wie kann ich herausfinden, wie CaknSlider unter der Haube implementiert ist. Ich möchte einen benutzerdefinierten Schieberegler für meine Radioanwendung implementieren, um die Lautstärke des Audiostreams zu steuern.

Irgendeine Idee, wie ich darüber gehen sollte.


[EDIT: Als Reaktion auf den Kommentar von laalto]

Die CAknSlider Kontrolle oft als setting item in the settings screen umgesetzt wird.

Ich habe es noch nie als Komponente Kontrolle in einem Verbundsteuerungscontainer (wie CCoeControl oder CaknView) implementiert. Dies ist, was ich bisher versucht:

Zuerst habe ich eine Ressource-Datei erstellt mit dem Schieberegler wie unten beschreiben:

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

Dann habe ich die Ressource-Datei in meiner Quelle bin mit dem Schieberegler wie unten zu erstellen:

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(); 
} 

hier ist der Vergleich zwischen dem CAknSlider als Einstellungspunkt (Screenshot1) und dem CAknSlider, die durch die oben beschriebene Technik (Screenshot2) erstellt wird. Beachten Sie, dass die eine, die ich erstelle, keinen Prozentwert-Indikator und die minimalen und maximalen Textbeschriftungen hat, obwohl ich sie in der Ressource angegeben habe. Das Aussehen und das Gefühl ist auch erbärmlich.

+0

Es würde helfen, wenn Sie beschrieben, was Sie bisher versucht haben - es ist einfacher, Verbesserungsvorschläge zu geben, wenn ein Code oder Pseudo-Code gibt es zu kommentieren. – laalto

Antwort

2

Es gibt viele Techniken, um Flicker zu vermeiden, von der doppelten Pufferung des gesamten Bildschirms bis hin zu einfacheren Optimierungen, wie zum Beispiel nur die Teile des Steuerelements neu zeichnen, die sich tatsächlich geändert haben. Es ist wahrscheinlich der einfachste Weg, dies effizient zu tun, wenn entsprechende Rechtecke vorab gezeichnet werden, um über den Standort des Schiebereglers und seinen nächsten Schritt zu blitschen.

genau herauszufinden, wie CAknSlider es der Fall ist, können Sie entweder: 1) Warten Sie auf das entsprechende Paket in der Symbian Foundation Plattform Open Source (EPL) zu gehen - sollte 12 Monate irgendwann in den nächsten oder 2) Schließen Sie sich die Symbian Foundation und erhält Zugriff auf die Quelle jetzt

EDIT: (Als Reaktion für weitere Details über Grafik-Optimierung zu beantragen)

am häufigsten wird Flimmern verursacht durch die gesamte Steuerung neu erstellt. Ich habe (über ein Portierungsprojekt) einige benutzerdefinierte Steuerelemente implementiert, die hier nicht flackern: http://developer.symbian.com/main/documentation/porting/#linux2 Es gibt sogar etwas wie ein Schieberegler. Dieses Beispiel ist alles andere als ideal, es hat keine vorgezeichneten Rechtecke für das Blitting, aber die Grafiken sind sehr einfache Linien und gefüllte Rechtecke. Das Konzept, nur den geänderten Teil zu überschreiben, ist jedoch identisch. Bloit vorgezeichnete Abschnitte. Zeichnen Sie den Hintergrund des Schiebereglers auf eine Offscreen-Bitmap und machen Sie dasselbe mit dem beweglichen Teil des Schiebereglers.Wenn der Schieberegler bewegt wird, löschen Sie den beweglichen Teil mit einem BitBlt() vom Hintergrund außerhalb des Bildschirms (nur den Teil, der gelöscht werden muss) und dann BitBlt() den beweglichen Teil in die neue Position.

Macht das Sinn?

+0

BTW, ein Schieberegler für einen Lautstärkeregler kann ein wenig enttäuschend sein, da die zugrunde liegende Audioanpassung auf den meisten Nokia Geräten nur 10 diskrete Lautstärkestufen hat, obwohl die API Ihnen erlaubt, einen beliebigen Wert zwischen 0 und MaxVolume einzustellen. –

+0

Mark, in Ihrer Antwort haben Sie erwähnt, "vorgezeichnete Rectagles zu blit ..." als die einfachste Optimierungstechnik. Könnten Sie mich auf eine Beispielanwendung hinweisen, die diese Technik verwendet, oder mir helfen, indem Sie erklären, wie ich es selbst mache? – ardsrk

1

Sie benötigen CaknSlider? Stiehl es! :) CAKnSliderSettingPage tun alles für uns. Wir benutzen das einfach.

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(); 
} 
+0

Valentin, schöne Technik. Ich werde es versuchen und dich wissen lassen, was ich habe. Vielen Dank – ardsrk

Verwandte Themen