2 Stimmen

CAknSlider-Steuerung innerhalb eines CAknView-Containers (nicht als Einstellungselement)

Ich bin erstaunt, wie gut die nativen Symbian-Komponenten implementiert sind. Eine davon ist CAknSlider. CAknSlider ist ein Steuerelement mit einem Schieberegler, den die Benutzer entlang einer Leiste verschieben können, deren Ausrichtung vertikal oder horizontal sein kann.

Wenn Sie nun den Schieberegler verschieben, ist das Gleiten sehr gleichmäßig und flackert nicht mehr. Aber wenn ich aus irgendeinem Grund ein benutzerdefiniertes Schieberegler-Steuerelement zu implementieren würde ich nicht bekommen es so ordentlich wie CAknSlider.

Also meine Frage ist, wie kann ich herausfinden, wie CAknSlider unter der Haube implementiert ist. Ich möchte einen benutzerdefinierten Schieberegler für meine Radio-Anwendung implementieren, um die Lautstärke des Audio-Streams zu steuern.

Haben Sie eine Idee, wie ich vorgehen soll?


(EDIT: Als Antwort auf den Kommentar von laalto)

Das CAknSlider-Steuerelement wird häufig als Einstellungsposten im Einstellungsbildschirm .

Ich habe noch nie gesehen, dass es als Komponentensteuerelement innerhalb eines zusammengesetzten Steuerelementcontainers (wie CCoeControl oder CAknView) implementiert wurde. Dies ist, was ich bis jetzt versucht habe:

Zuerst habe ich eine Ressourcendatei erstellt, die das Schieberegler-Steuerelement wie unten beschrieben hat:

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

Dann verwende ich die Ressourcendatei in meinem Quellcode, um den 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 nun der Vergleich zwischen dem CAknSlider als Einstellungselement ( Bildschirmfoto1 ) und der CAknSlider, der durch die oben beschriebene Technik erzeugt wird ( Bildschirmfoto2 ). Beachten Sie, dass die von mir erstellte Datei keine Prozentwertanzeige und keine Mindest- und Höchstwertbeschriftung enthält, obwohl ich sie in der Ressource angegeben habe. Auch das Aussehen und die Handhabung sind erbärmlich.

2voto

Mark Wilcox Punkte 389

Es gibt viele Techniken zur Vermeidung von Flimmern, von der doppelten Pufferung des gesamten Bildschirms bis hin zu einfacheren Optimierungen, wie z. B. nur die Teile des Steuerelements neu zu zeichnen, die sich tatsächlich geändert haben. Geeignete Rechtecke zu haben, die im Voraus gezeichnet werden, um zu überblenden, wo der Schieberegler war und seinen nächsten Schritt ist wahrscheinlich der einfachste Weg, um es effizient zu tun.

Um herauszufinden, wie CAknSlider das genau macht, können Sie entweder: 1) darauf warten, dass das entsprechende Paket in der Symbian Foundation Plattform als Open Source (EPL) veröffentlicht wird - dies sollte irgendwann in den nächsten 12 Monaten geschehen, oder 2) der Symbian Foundation beitreten und sofort Zugang zum Quellcode erhalten

EDIT: (Als Antwort auf die Bitte um mehr Details zur Grafikoptimierung)

In den meisten Fällen wird das Flimmern durch das Neuzeichnen des gesamten Steuerelements verursacht. Ich habe (über ein Portierungsprojekt) einige benutzerdefinierte Steuerelemente implementiert, die hier nicht flackern: http://developer.symbian.com/main/documentation/porting/#linux2 Es gibt sogar so etwas wie einen Schieberegler. Dieses Beispiel ist bei weitem nicht ideal, denn es hat keine vorgezeichneten Rechtecke für Blitting, sondern die Grafiken sind sehr einfache Linien und gefüllte Rechtecke. Das Konzept, nur den geänderten Teil zu überschreiben, ist jedoch identisch. So blenden Sie vorgezeichnete Abschnitte aus. Zeichnen Sie den Hintergrund des Schiebereglers in eine Bitmap außerhalb des Bildschirms und machen Sie dasselbe mit dem beweglichen Teil des Schiebereglers. Wenn der Schieberegler bewegt wird, löschen Sie den beweglichen Teil, indem Sie ein BitBlt() vom Offscreen-Hintergrund ausführen (nur für den Teil, der gelöscht werden muss) und dann BitBlt() den beweglichen Teil in die neue Position bringen.

Ergibt das einen Sinn?

1voto

Sie brauchen CAknSlider? klauen Sie es! :) CAknSliderSettingPage macht alles für uns. Wir, verwenden Sie einfach, dass.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X