Danielku15
Erfahrenes Mitglied
Hallo Leute.
Ich habe vor kurzem damit begonnen Java ME zu programmieren. Ich wollte eine Art Button erstellen mit einem Farbverlauf im Hintergrund. Nur leider ist es mit der Graphics Klasse nur möglich einfarbige Flächen zu zeichnen. Nun hab ich mir gedacht: Mach ich mir selbst eine Methode. Jetzt habe ich nur 1 Problem. Ich durchlaufe wahlweise alle PixelZeilen oder PixelSpalten um zwischen horizontalem und vertikalem Farbverlauf zu unterscheiden. Nur wie kann ich bei einem mehrfarbigen Farbverlauf wo ich Positionen angeben kann die zugehörige Farbe berechnen. So sieht meine Methode bisher aus:
Beispiele für die Anwendung:
Und, kennt da jemand einen Alorithmus um die zugehörige Farbe zu berechnen? Oder hat gar jemand eine bessere Methode? Ich wäre euch echt dankbar.
gruß Daniel
Ich habe vor kurzem damit begonnen Java ME zu programmieren. Ich wollte eine Art Button erstellen mit einem Farbverlauf im Hintergrund. Nur leider ist es mit der Graphics Klasse nur möglich einfarbige Flächen zu zeichnen. Nun hab ich mir gedacht: Mach ich mir selbst eine Methode. Jetzt habe ich nur 1 Problem. Ich durchlaufe wahlweise alle PixelZeilen oder PixelSpalten um zwischen horizontalem und vertikalem Farbverlauf zu unterscheiden. Nur wie kann ich bei einem mehrfarbigen Farbverlauf wo ich Positionen angeben kann die zugehörige Farbe berechnen. So sieht meine Methode bisher aus:
Java:
/**
* Füllt ein Rechteck mit einem Linearen Farbverlauf
* @param colors Eine Liste mit den Farben welche im Farbverlauf vorkommen.
* @param positions Eine Liste mit den Positionen der Farben im Farbverlauf (0-1)
* @param graphic Die Grafik in welche gezeichnet wird.
* @param x X-Position des Rechtecks
* @param y Y-Position des Rechtecks
* @param w Breite des Rechtecks
* @param h Höhe des Rechecks.
* @param horizontal True wenn der Farbverlauf horizontal, false wenn er Vertikal sein soll.
*/
public static void fillLinearGradientRect(int[] colors, float[] positions, Graphics graphic, int x, int y, int w, int h, boolean horizontal)
{
// Werte überprüfen:
//-----------------------------------------------
// Anzahl Farben und Positionen
if (colors.length != positions.length)
{
throw new IllegalArgumentException("Die Anzahl der Farben muss mit der Anzahl der Positionen übereinstimmen");
}
//-----------------------------------------------
// Positionsbereiche überprüfen:
for (int i = 0; i < positions.length; i++)
{
if (positions[i] > 1 || positions[i] < 0)
{
throw new IllegalArgumentException("Die Positionsangaben der Farben müssen im Bereich von 0-1 liegen (Index der Ungültigen Farbe:" + i);
}
}
// Anfangs und Endpositionen überprüfen:
if (positions[0] != 0)
{
throw new IllegalArgumentException("Die Erste Position muss den Wert 0 haben");
}
if (positions[positions.length - 1] != 1)
{
throw new IllegalArgumentException("Die Letzte Position muss den Wert 1 haben");
}
// Positionsgrößen überprüfen:
for (int i = 0; i < positions.length; i++) // alle Farben durchlaufen
{
for (int j = i + 1; j < positions.length; j++) // alle Folgenden durchlaufen
{
// Wenn eine Kleinere Zahl folgt-> Fehler
if (positions[i] > positions[j])
{
throw new IllegalArgumentException("Die Positionsangaben müssen in aufsteigender Reihenfolge angegeben werden");
}
}
}
//-----------------------------------------------
// Zeilen Bzw. Spalten durchlaufen:
if (horizontal) // Spalten
{
// i=Anfangspixel X; Bis zum Ende (Anfang+Breite)
for (int i = x; i < (x + w); i++)
{
// Farbe berechnen: ?
// Spalte zeichnen (1px Breite)
graphic.fillRect(i, y, 1, h);
}
}
else // Zeilen
{
// i=Anfangspixel Y; Bis zum Ende (Anfang+Höhe)
for (int i = y; i < (y + h); i++)
{
// Farbe berechnen: ?
// Zeile zeichnen (1px Höhe)
graphic.fillRect(x, i, w, 1);
}
}
}
Java:
protected void paint(Graphics g, int w, int h)
{
// Rot, Weiß, Rot
int[] colors = {0xFFFF0000, 0xFFFFFFFF, 0xFFFF0000};
// Anfang Mitte Ende
float[] positions = {0F, 0.5F, 1F};
// Zeichnen
fillLinearGradientRect(colors, positions, g, 0, 0, w, h, false);
}
Und, kennt da jemand einen Alorithmus um die zugehörige Farbe zu berechnen? Oder hat gar jemand eine bessere Methode? Ich wäre euch echt dankbar.
gruß Daniel