[ME] Farbverlauf Zeichnen.

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:
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);
            }
        }
    }
Beispiele für die Anwendung:
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
 
Nicht wirklich. Das ist Swing. In der ME gibts es spezielle Klassen für die GUI. Das Zeichnen eines Bildes wäre meine Notlösung. Es kommt eben drauf an wie Performance-Lastig das Zeichnen wäre und wie viel Strom ich dadurch verpulvere.
 
Zurück