21 Stimmen

Ist es möglich, einen Farbverlauf zu dithern, der gezeichnet werden kann?

Ich verwende die folgende Zeichenfläche:

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <gradient 
        android:startColor="@color/content_background_gradient_start"
        android:endColor="@color/content_background_gradient_end" 
        android:angle="270"
        />

</shape>

Das Problem ist, dass ich auf HDPIGeräten (wie dem Nexus One und Droid) starke Streifenbildung erhalte, da der Farbverlauf vom oberen Rand des Bildschirms bis zum unteren Rand reicht.

Según http://idunnolol.com/Android/drawables.html#shape_gradient Es gibt kein "Dither"-Attribut für einen Farbverlauf. Kann ich etwas tun, um den Farbverlauf zu glätten?

Hinweis: Das Hinzufügen von dither="true" zu shape scheint nicht zu funktionieren.

11voto

Dan Lew Punkte 83507

Ich habe die Dokumentation geschrieben, auf die Sie Bezug nehmen. Ich habe noch einmal einen Blick auf den Code geworfen und leider gibt es keine Möglichkeit, das Dithering für ein GradientDrawable zu aktivieren, außer durch den expliziten Aufruf von GradientDrawable.setDither() im Code.

(So wie die Codes aussehen, technisch können Sie den Farbverlauf als sólo Kind eines <selector> und aktivieren Sie das Dithering für den gesamten Selektor; es ist jedoch definitiv ein Hack).

Ich bin nicht überzeugt, dass die Aktivierung von Dithering tatsächlich Ihr Problem lösen wird, da Dithering (zumindest wie es in den offiziellen Android-Dokumenten vermerkt ist) für die Lösung von Banding-Problemen sind, wenn das Gerät eine zu kleine Farbpalette hat. Dies scheint ein Banding Problem aufgrund der Größe des Gradienten zu sein.

7voto

Mojo Risin Punkte 8132

Hallo zusammen, ich habe das gleiche Problem, es gibt eine Lösung, die funktioniert, aber sie ist nicht sehr gut.

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

Bei mir funktioniert es, aber das Problem ist, dass das ganze Windows zittert. Ich habe nach einer Möglichkeit gesucht, nur den Farbverlauf zu dithern, aber ich konnte nichts finden. Android:dither="true" in xml funktioniert nicht und GradientDrawable.setDither(true) funktioniert auch nicht. Irgendwelche Ideen, wie ich nur den Farbverlauf dithern kann?

0 Stimmen

Die gewählte Antwort hat mir nicht geholfen, Ihre schon! Habe ein Galaxy S mit Android 2.2.

2voto

Christopher Orr Punkte 108221

Ich stand letztes Jahr vor einem sehr ähnlichen Problem und kam auf der Liste der Android-Entwickler zu keinem brauchbaren Ergebnis.

Vor einiger Zeit entdeckte ich jedoch - nach einigen Versuchen <gradient> und alle Arten von Drawable s mit verschiedenen dither Attribute und die manuelle Erstellung von Dither-PNGs - dass, wenn ich manuell ein neues Bild mit GIMP y die Dichte an diesem Punkt angeben (d.h. explizit 120 oder 240 usw.) bei der Erstellung des Bildes eingeben, sieht es großartig aus, sogar auf hdpi Geräte. Und das, obwohl es sich um einen Graustufenverlauf handelt, der nicht so viele Farben hat.

Die PNG-Datei ist beim Speichern relativ groß (zumindest für 240 dpi), aber sie sieht gut aus.

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