Wie grau erichte ich einheitlich eine Ansicht, die viele verschiedene Elemente enthält - ImageViews, TextViews, Hintergrundbild. Muss ich jedes Ding einzeln ausgrauen? Oder gibt es eine Möglichkeit, den gleichen Farbfilter auf alle anzuwenden?So wenden Sie einen Farbfilter auf eine Ansicht mit allen untergeordneten Elementen an
Antwort
Es sei denn, jemand anderes eine bessere Antwort hat, meine aktuelle Methode ist Vergrauung jeden Gegenstand einzeln aussortieren.
PorterDuffColorFilter greyFilter = new PorterDuffColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
myLayout.getBackground().setColorFilter(greyFilter);
myImageView.setColorFilter(greyFilter);
myTextView.setTextColor(0xff777777);
Für mehr oder verschachtelte Kinder wäre wahrscheinlich eine Schleife mit instanceof geeignet, aber ich brauche sie nicht.
Edit: Dieser Filter ist eigentlich nicht grau, ein besserer Filter ist hier: Drawable => grayscale Welche können auf die gleiche Weise verwendet werden.
Es hängt vollständig von der Methode ab, die Sie verwenden, um Elemente "auszugrauen". Wenn Sie dies tun, indem Sie setEnabled(false)
auf dem übergeordneten ViewGroup
aufrufen, werden Status Flags (wie deaktiviert) standardmäßig nicht zu den untergeordneten Sichten herunterrieseln. Es gibt jedoch zwei einfache Möglichkeiten, wie Sie das anpassen können:
Eine Option ist Fügen Sie das Attributandroid:duplicateParentState="true"
zu jeder untergeordneten Ansicht in Ihrem XML hinzu. Dies wird den Kindern sagen, dass sie ihre Statusflags von den Eltern erhalten sollen. Dies wird jedoch alle Flags spiegeln, einschließlich gedrückt, aktiviert, etc ... nicht nur aktiviert.
Eine weitere Option ist eine benutzerdefinierte Unterklasse Ihrer ViewGroup
erstellen und überschreiben setEnabled()
alle untergeordneten Ansichten auch zu nennen, das heißt
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
for(int i=0; i < getChildCount(); i++) {
getChildAt(i).setEnabled(enabled);
}
}
Nein, nein, nicht deaktivieren. Grau out (color!) – Ixx
Es ist einfach durch die Definition einer benutzerdefinierten Ansicht Gruppe zu tun, dass Sie wie folgt vor:
public class MyViewContainer extends XXXLayout {
//XXLayout could be LinearLayout, RelativeLayout or others
private Paint m_paint;
//define constructors here and call _Init() at the end of constructor function
private void
_Init()
{
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
m_paint = new Paint();
m_paint.setColorFilter(new ColorMatrixColorFilter(cm));
}
@Override protected void
dispatchDraw(Canvas canvas)
{
canvas.saveLayer(null, m_paint, Canvas.ALL_SAVE_FLAG);
super.dispatchDraw(canvas);
canvas.restore();
}
}
Alle Kinder Blick auf MyViewContainer grau dargestellt wird. :-)
Sam Lu's Antwort ist ein guter Anfang, aber ich hatte Leistungsprobleme und entschied mich für Hardware-Ebenen. Mit Hardware-Schichten, können Sie es wie folgt tun:
private final Paint grayscalePaint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
grayscalePaint.setColorFilter(new ColorMatrixColorFilter(cm));
public void setGrayedOut(boolean grayedOut) {
if (grayedOut) {
setLayerType(View.LAYER_TYPE_HARDWARE, grayscalePaint);
} else {
setLayerType(View.LAYER_TYPE_NONE, null);
}
}
Darauf achten, dass die Schichten in dispatchDraw()
selbst zu tun, als dass die App abstürzt.
einfach auf LAYER_TYPE_HARDWARE wechseln wird dazu führen, "" W/OpenGLRenderer: Layer überschreitet maximale Dimensionen unterstützt von der GPU (1088x4288, max = 4096x4096) "'Absturz auf große Ansichten. Und "max = 4096x4096" hängt vom Telefonmodell ab –
Was ich tun möchte, ist eine Ansicht zu erstellen, die die zu überprüfende Ansicht überlappt und den Hintergrund auf eine transparente Farbe setzt. Dann können Sie den Farbton ein- und ausschalten, indem diese Ansichten Sichtbarkeit
Einstellung<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewYouWantToTint
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<View
android:id="@+id/disabled_tint_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/darkTint"
android:visibility="invisible"/>
</FrameLayout>
dann in Ihrem Controller:
m_DisabledBlackTintOverlay = (View) view.findViewById(R.id.login_disabled_black_tint_overlay);
m_DisabledBlackTintOverlay.setVisibility(View.VISIBLE);
- 1. Wenden Sie viele Farbfilter auf das gleiche Zeichen an
- 2. So wenden Sie einen benutzerdefinierten Stil auf SwitchCompat an
- 3. Wie wenden Sie eine Skalierungsübersetzung auf einen DrawingContext an?
- 4. Warum wird ein ziehbarer Farbfilter an allen Stellen angewendet?
- 5. Wie wenden Sie einen Patch auf Ruby auf Schienen an?
- 6. Rendern Sie eine Ansicht mit einer untergeordneten Ansicht?
- 7. TortoiseHg Wenden Sie einen Patch an
- 8. Wenden Sie Material Design Touch Ripple auf ImageButton an?
- 9. So wenden Sie einen linearen Farbverlauf für IE8 an
- 10. Wenden Sie einen Lambda-Verschluss an
- 11. Apache Poi wenden Sie einen Stil auf verschiedene Arbeitsmappen an
- 12. So wenden Sie Bewertungssterne in UITableViewCells an
- 13. So wenden Sie CSS-Stile nur auf Text an
- 14. So wenden Sie die Berechtigung auf Benutzerebene in opencart an
- 15. So wenden Sie mehrere Effekte auf dasselbe Element an
- 16. So wenden Sie eine Funktion auf einen mehrfach codierten Pandas-Datenrahmen an
- 17. So wenden Sie die gleiche Funktionalität auf zwei Schaltflächen an
- 18. So wenden Sie eine alphanumerische Sortierung in XSLT an
- 19. So wenden Sie Hex auf die ganze Welt an
- 20. Wenden Sie Matrixtransformationen auf BoundingBox an
- 21. So wenden Sie UTF-8 auf RDS an
- 22. So wenden Sie die jquery-Funktion auf jede Instanz an
- 23. So wenden Sie ein Attribut mit Jquery "appendTo" an
- 24. Wenden Sie einen "langen Touch" -Ereignishandler auf Google Maps an
- 25. So erstellen Sie eine Kategorie und wenden sie auf eine E-Mail an
- 26. Wie wenden Sie ein .net-Attribut auf einen Rückgabetyp an
- 27. Wenden Sie einen Standard-Ressourcenstil auf alle DataGridTextColumns an
- 28. So senden Sie eine Nachricht an eine Ansicht von vielen
- 29. Wenden Sie Winkelbindung auf dynamisches HTML an
- 30. Wenden Sie eine App.config auf meine DLL-Assembly an?
'myLayout.getBackground(). SetColorFilter (greyFilter);' Ich habe es gesucht. Tolles Zeug. –
Ich denke, die Sam Lu Ansewr ist die genaueste – Moxor