Bitmap ne provenant pas d'anti-aliasing
J'ai un custom View
qui attire toujours une Bitmap
à une certaine rotation. J'ai remplacer le onDraw
méthode, tourner le Canvas
et dessiner l'image avec un anti-aliasing Paint
.
public RotatedImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
someBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.placeholder);
}
@Override
protected void onDraw(Canvas canvas) {
//Save and rotate canvas
canvas.save();
canvas.rotate(3F, getWidth() / 2, getHeight());
//Draw the icon
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
canvas.drawBitmap(someBitmap, 0, 0, p);
canvas.drawRoundRect(new RectF(75, 50, 225, 200), 10, 10, p);
//All done; restore canvas
canvas.restore();
}
Cependant, je reçois toujours des bords irréguliers sur l'image Bitmap. Notez que le roudned au rectangle obtient joliment contours lissés. Aussi, quand je l'applique p.setFilterBitmap(true);
cela fonctionne (la surface bitmap est filtré/lissé) correctement. Ai-je raté quelque chose?
Voici une minime projet Android avec exemple isolé d'un écran qui montre la Vue qui attire les non-anti-aliasing Bitmap, chargé à partir d'une ressource: https://bitbucket.org/erickok/antialiastest
Mise à JOUR: j'ai aussi essayé le suivant:
Paint p = new Paint();
p.setAntiAlias(true);
p.setFilterBitmap(true);
p.setDither(true);
canvas.drawBitmap(someBitmap, 0, 0, p);
Mais cela n'aide pas que setFilterBitmap
filtres de la surface; il n'a pas d'anti-alias les bords. Aussi, setAntiAlias
fait la même chose que directement le paramétrage de l'indicateur dans le Paint
constructeur. En cas de doute, s'il vous plaît essayer mon test minimal projet. Merci beaucoup pour toute aide!
OriginalL'auteur Eric Kok | 2013-01-17
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé pourquoi je n'ai pas d'anti-aliasing: l'accélération matérielle. Après j' (par hasard) testé sur mon Nexus One soudain, elle a travaillé, pendant que ma Nexus 7 n'a pas. Il s'avère que les
ANTI_ALIAS_FLAG
ne fait rien quand laCanvas
est dessiné à l'aide de l'accélération matérielle. Avec cette compréhension, j'ai trouvé Romain Guy de réponse sur StackOverflow qui répond à ma question.Solutions semblent être: l'ajout d'une bordure transparente à tous les bitmap (manuellement ou à la volée) ou de "faire quelque chose avec les shaders'. Ne sont ni très intéressant pour moi. Au lieu de cela je désactivé l'accélération matérielle sur mon affichage personnalisé à l'aide de la
setLayerType
méthode. Notez que cette option est disponible depuis l'API de niveau 11, mais (pas par hasard), vous n'aurez pas à traiter avec l'accélération matérielle avant de toute façon. Donc, j'ai ajouté, dans le constructeur de la vue:J'ai mis à jour ci-dessus référencé projet open-source sur BitBucket pour ceux qui sont intéressés.
OriginalL'auteur Eric Kok
Utilisation setFilterBitmap(true).
cela fonctionne pour moi aussi..
Je l'ai eu à partir de cette question
Dessin tourné bitmap avec anti alias
définir à la fois la AntiAlias drapeau et FilterBitmap drapeau à vrai dire, ils sont faire du bitmap bords lisses, je l'ai testé sur Samsung Galaxy Ace , android 2.2 ...
Mon Code de Test est
setFilterBitmap()
en combinaison avecsetLayerType(View.LAYER_TYPE_SOFTWARE, null)
fonctionne très bien pour moi. Avec le logiciel de la couche seul, j'avais encore quelques artefacts.OriginalL'auteur Swarnendu Paul
Dans mon cas, je l'ai fait, mais peut-être il vous aime :
Juste essayer.
Bonne chance!
OriginalL'auteur Ilya Demidov
J'ai testé les suggestions précédentes et ils font un travail pour moi. Peut-être que les questions dans votre bitmap ? Peut-être que dans votre appareil? Voici un code qui crée l'image bitmap en ligne. Vérifier si cet exemple fonctionne pour vous.
OriginalL'auteur yoah
J'ai eu le même problème, et j'ai essayé tous ces correctifs. Ce qui a fonctionné, c'est globalement la désactivation de l'accélération matérielle dans l'AndroidManifest.xml fichier:
et de désactivation inSampleSize quand j'ai chargé mon image bitmap, de sorte que (je présume), l'image serait de charger à une qualité suffisamment élevée pour éviter toute zigzags, et puis, pour mon ImageView, en utilisant les conseils ci-dessus: réglage du type de couche à Afficher.LAYER_TYPE_SOFTWARE, avec une peinture de l'objet avec le filtre bitmap définie sur true (comme ci-dessus) et l'anti-aliasing activé.
oui, il est de travail. Vous ma vie de veille))
OriginalL'auteur user3522492