2016-02-15 20 views
13

Ich habe das folgende Layout:Porter-Duff: unterschiedliches Verhalten für verschiedene Formen?

  <LinearLayout 
       android:id="@+id/myButton" 
       android:layout_width="@dimen/logo_radius" 
       android:layout_height="match_parent" 
       android:background="@drawable/myShape"> 

       <ImageView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:src="@drawable/driver_half"/> 
      </LinearLayout> 

und die folgenden myShape drawable:

<selector> 
     <item><shape android:shape="oval"> 
      <stroke android:color="@android:color/black" android:width="4dp"/> 
      <solid android:color="@android:color/white" /> 
     </shape></item> 
    </selector> 

I angewandt, um die folgenden Filter:

myButton.getBackground().setColorFilter(orange, PorterDuff.Mode.ADD); 

das Ergebnis, dass Art und Weise hat:

enter image description here

Dann änderte I myShape ein Rechteck mit abgerundeten Ecken sein:

<selector> 
     <item> 
      <shape 
       android:shape="rectangle"> 
       <corners android:bottomLeftRadius="@dimen/logo_radius" android:bottomRightRadius="2dp" android:topLeftRadius="@dimen/logo_radius" android:topRightRadius="2dp"/> 
       <stroke 
        android:width="4dp" 
        android:color="@android:color/black"/> 
       <solid android:color="@android:color/white"/> 
      </shape> 
     </item> 
    </selector> 

das Ergebnis sah wie:

enter image description here

linken Teil ist, ohne den Filter angelegt wird, der rechte Teil mit den Filter.

, was ich zu bekommen:

enter image description here

Was soll ich tun, um richtig die Grenze orange Farbe der Porter-Duff-Filter? Gibt es noch andere Optionen?

+0

Soll es orange werden, während es gedrückt wird? –

+0

nein, die Grenze sollte immer orange bleiben. – injecteer

+0

Warum nicht die orange Farbe direkt anstelle von @android verwenden: Farbe/Schwarz? –

Antwort

6

Die Porter/Duff-Filterung hängt vom Alphakanal ab. Malen nur Formen Grenze (ohne andere Form Raum) sollten Sie von weiß bis transparent Form Hintergrund ändern:

<selector> 
    <item> 
     <shape 
      android:shape="rectangle"> 
      <corners android:bottomLeftRadius="@dimen/logo_radius" android:bottomRightRadius="2dp" android:topLeftRadius="@dimen/logo_radius" android:topRightRadius="2dp"/> 
      <stroke 
       android:width="4dp" 
       android:color="@android:color/black"/> 
      <solid android:color="@android:color/transparent"/> 
     </shape> 
    </item> 
</selector> 

und korrekte PorterDuff.Mode für diesen Fall sollte SRC_IN sein.

Aber ich weiß nicht, warum Oval-Form richtig gemalt.

UPD:

mit SRC_IN die Grenze orange lackiert wird, aber die Füllung bleibt transparent ...

Sie können Ihre Wähler auf layer-list ziehbar wie folgt ändern:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
     <item android:id="@+id/background"> 
      <shape android:shape="rectangle"> 
       <corners 
        android:bottomLeftRadius="32dp" 
        android:bottomRightRadius="2dp" 
        android:topLeftRadius="32dp" 
        android:topRightRadius="2dp" /> 
       <solid android:color="@android:color/white" /> 
      </shape> 
     </item> 
     <item android:id="@+id/border"> 
      <shape android:shape="rectangle"> 
       <corners 
        android:bottomLeftRadius="32dp" 
        android:bottomRightRadius="2dp" 
        android:topLeftRadius="32dp" 
        android:topRightRadius="2dp" /> 
       <stroke 
        android:width="4dp" 
        android:color="@android:color/black" /> 
       <solid android:color="@android:color/transparent" /> 
      </shape> 
     </item> 
</layer-list> 

und setzen Sie den Farbfilter nur für den Rahmen:

LayerDrawable background = LayerDrawable.class.cast(findViewById(R.id.target).getBackground()); 
    background.findDrawableByLayerId(R.id.border).setColorFilter(Color.CYAN, PorterDuff.Mode.SRC_IN); 
+0

mit 'SRC_IN' ist die Umrandung orange, aber die Füllung bleibt transparent ... – injecteer

Verwandte Themen