2012-06-14 3 views

Antwort

17

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.

+2

'myLayout.getBackground(). SetColorFilter (greyFilter);' Ich habe es gesucht. Tolles Zeug. –

+0

Ich denke, die Sam Lu Ansewr ist die genaueste – Moxor

7

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); 
    } 
} 
+0

Nein, nein, nicht deaktivieren. Grau out (color!) – Ixx

12

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. :-)

8

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.

+0

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 –

0

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); 
Verwandte Themen