Wie man zwei Drawables vergleicht, mache ich so, habe aber keinen Erfolg
public void MyClick(View view)
{
Drawable fDraw = view.getBackground();
Drawable sDraw = getResources().getDrawable(R.drawable.twt_hover);
if(fDraw.equals(sDraw))
{
//Not coming
}
}
Antworten:
Aktualisieren Sie https://stackoverflow.com/a/36373569/1835650
getConstantState () funktioniert nicht gut
Es gibt noch einen anderen Weg zu vergleichen:mRemeberPwd
ist einImageView
in diesem Beispiel. Wenn Sie a verwendenTextView
, verwenden SiegetBackground().getConstantState
stattdessen.quelle
Sich
getConstantState()
allein zu verlassen kann zu falschen Negativen führen .Der Ansatz, den ich gewählt habe, besteht darin, zunächst den ConstantState zu vergleichen, aber auf einen Bitmap-Vergleich zurückzugreifen, wenn diese Prüfung fehlschlägt.
Dies sollte in allen Fällen funktionieren (einschließlich Bilder, die keine Ressourcen sind), aber beachten Sie, dass es speicherhungrig ist.
quelle
getConstantState()
Vergleich verlassensetBounds
unddraw
auf einer Kopie anstelle des Originals stackoverflow.com/a/25462223/1916449Meine Frage war, nur zwei Drawables zu vergleichen. Ich habe versucht, aber keine Methode zu finden, die zwei Drawables direkt vergleicht. Für meine Lösung habe ich Drawable in Bitmap geändert und dann zwei Bitmaps verglichen, und das funktioniert.
quelle
für SDK 21+
Dies funktioniert in SDK -21
für SDK +21 Android 5. Setzen Sie die Drawable ID auf Imageview mit Tag
und vergleiche so
Diese Lösung ist für diejenigen
drawable
gedacht , die die ID vonimageview
mit der ID von vergleichen möchtendrawable.xxx
.quelle
Die Lösung für Android 5:
quelle
getDrawable (int) ist jetzt veraltet. Verwenden Sie getDrawable (Kontext, R.drawable.yourimageid)
Zwei Hintergründe vergleichen
quelle
context.getResources().getDrawable(R.drawable.***)
Android 6+ zurückgegeben, aber nicht mit Android 5. Mit dieser kleinen Änderung kann ich Hintergrund-Drawables für alle Android-Versionen fehlerfrei vergleichenVielleicht versuchen Sie es so:
oder bereiten Sie eine Methode vor, die zwei zeichnbare Argumente verwendet und einen Booleschen Wert zurückgibt. In dieser Methode können Sie Drawable in Bytes konvertieren und vergleichen,
quelle
e.g R.drawable.abc
beide Parameter zu übergeben?Ok, ich denke, ich habe die ultimative Lösung dafür gefunden. Aufgrund von AppCompat und Freunden wird das bereitgestellte Zeichen manchmal in verschiedenen Formen aufgeblasen, sodass dies nicht ausreicht
getResources().getBitmap(R.drawable.my_awesome_drawable)
.Um eine zeichnbare Instanz des gleichen Typs und der gleichen Form wie in der Ansicht zu erhalten, können Sie Folgendes tun:
Dies ist nützlich, wenn Sie Tests durchführen. Ich würde dies jedoch nicht in der Produktion empfehlen. Wenn nötig, ist zusätzliches Caching wünschenswert, um zu viele Reflexionen zu vermeiden.
Für Expresso-Tests können Sie dies ganz gut verwenden:
oder
Bevor Sie diese Hilfsklasse deklarieren müssen:
quelle
quelle
Ich habe hier bereits zu einem ähnlichen Thema geantwortet: Holen Sie sich die ID eines Zeichens in ImageView . Der Ansatz basiert auf dem Kennzeichnen einer Ansicht mit einer angegebenen Ressourcen-ID im benutzerdefinierten Bereich
LayoutInflater
. Der gesamte Prozess wird durch eine einfache Bibliothek TagView automatisiert .Infolgedessen können Sie zwei Drawables nur anhand ihrer IDs vergleichen:
quelle
Wenn Sie die Antwort von @vaughandroid erweitern, funktioniert der folgende Matcher für ein getöntes Vector Drawable. Sie müssen den Farbton angeben, der für das Drawable verwendet wurde.
quelle
Vergleiche 2 zeichnbare:
Wenn Sie
Drawable.toBitmap(...)
hier nicht finden können , ist es Drawable.ktquelle
Wenn Sie zwei Zeichen direkt vergleichen möchten, verwenden Sie den folgenden Code
Drawable fDraw = getResources (). GetDrawable (R.drawable.twt_hover);
Drawable sDraw = getResources (). GetDrawable (R.drawable.twt_hover);
quelle
Wenn Sie eine
equals()
Methode verwenden, wird diese zum Vergleichen des Inhalts verwendet. Sie sollten versuchen==
, zwei Objekte zu vergleichen.quelle