2010-02-08 12 views
17

Ich erstelle eine benutzerdefinierte Fortschrittsbalken (unter einer WebView positioniert) und was ich zeichnen möchte, ist eine 1DP-breite Linie zwischen der WebView und der ProgressBar. Ich bin die Änderung bereits bestehende ziehbar, nämlich progress_horizontal.xml und versuchte, so etwas wie diese:Zeichnung oberen Rand auf einer Form auf Android

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    (...) 

    <item> 
    <shape android:shape="line"> 
     <stroke android:width="1dp" android:color="#FF000000" /> 
    </shape> 
    </item> 

</layer-list> 

jedoch Diese Linie vertikal zentriert ist, aber ich will es auf dem ziehbar gezogen werden. Die einzige Idee, die ich kommen könnte mit ist dieses „Hacky“ Gradienten zu verwenden unter:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 

    (...) 

    <item> 
    <shape> 
     <gradient 
      android:startColor="#FF000000" 
      android:centerColor="#00000000" 
      android:centerY="0.01" 
      android:endColor="#00000000" 
      android:angle="270" 
     /> 
    </shape> 
    </item> 

</layer-list> 

Haben Sie bessere Ideen, wie haben ausgerichtet eine einzige Zeile Form zeichnen an der Spitze des ziehbar mit layer-list definiert?

Antwort

47

Ich versuche Ausgleich eine bei dem Versuch, dies auch zu verstehen. Hoffentlich gibt es einen besseren Weg, es zu tun, aber hier ist die Methode, die ich verwendet habe, die auch irgendwie hackish ist, aber für den Fall, dass es jemandem hilft, dachte ich, ich würde teilen.

Das erste Element in Ihrer Ebenenliste sollte ein Vollton sein, egal welcher Farbe Sie Ihren Rahmen haben möchten. Danach würden die Dinge, die Sie haben wollen, die Grenze haben, mit der Auffüllung auf welcher Seite Sie wollen, dass die Grenze an ist.

Zum Beispiel:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="YOUR BORDER COLOR" /> 
     </shape> 
    </item> 
    <item android:top="YOUR TOP BORDER THICKNESS"> 
     THE THING YOU WANT A BORDER ON 
    </item> 
</layer-list> 

Die Idee ist, dass die Polsterung auf dem Punkt dahinter die feste Form offenbart, so dass die Grenze Aussehen. Sie können auf jeder Seite einen Abstand hinzufügen, um einen Rahmen hinzuzufügen. Ich könnte mir vorstellen, dass Sie auf diese Weise komplizierter werden und auch andere farbige Ränder haben.

Scheint wie ein Hack, aber es hat für mich funktioniert.

EDIT: Ich sagte "Padding", aber in Layer-Listen ist es eher ein Offset.

+0

Es funktioniert! Danke – Kevin

+9

Das funktioniert offensichtlich nicht mit einem transparenten "THING". – Kenneth

+0

Vielen Dank dafür. :) Ich habe eine zusätzliche Ebene hinzugefügt, um eine untere Grenze zu haben, die ich brauche. – KarenAnne

12

Ich ging durch alle verwandten Themen, aber niemand konnte mein Problem lösen. Aber einige von ihnen waren sehr nützlich, um zu verstehen, wie die Parameter der Ebenenliste oder der Form funktionieren.

Mein Problem war, eine Schaltfläche mit einem linearen Farbverlauf zu definieren und eine obere und untere Zeile in verschiedenen Farben zu zeichnen. Immerhin habe ich diese Lösung gehackt. Ich speicherte die Datei unter res/ziehbar/blue_btn.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item android:state_pressed="true" >   
     <shape android:shape="rectangle"> 
      <solid android:color="@color/blue_end" /> 
      <padding 
        android:left="10dp" 
       android:top="10dp" 
       android:right="10dp" 
       android:bottom="10dp" /> 
      <stroke 
       android:width="1dp" 
       android:color="@color/bottomline_btn" />       
     </shape>  
    </item> 
    <item> 
     <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
      <item> 
       <shape android:shape="rectangle"> 
        <solid android:color="@color/blue" /> 
        <gradient 
         android:startColor="@color/blue" 
         android:endColor="@color/blue_end" 
         android:angle="270" /> 
       </shape> 
      </item> 
      <item android:top="0dp" android:bottom="-1dp" android:left="-1dp" android:right="-1dp"> 
       <shape android:shape="rectangle"> 
        <stroke 
         android:width="1dp" 
         android:color="@color/topline_btn" />      
        <solid android:color="#00000000" /> 
        <corners android:radius="0dp" /> 
       </shape> 
      </item> 
      <item android:top="-1dp" android:bottom="0dp" android:left="-1dp" android:right="-1dp"> 
       <shape android:shape="rectangle"> 
        <stroke 
         android:width="1dp" 
         android:color="@color/bottomline_btn" />       
        <solid android:color="#00000000" /> 
        <corners android:radius="0dp" /> 
       </shape> 
      </item>   
     </layer-list> 
    </item> 
</selector> 


<color name="topline_btn">#31ffffff</color> 
<color name="bottomline_btn">#31000000</color> 

<color name="blue">#449def</color> 
<color name="blue_end">#2f6699</color> 
0

Meine Lösung ist 9-Patch als letzte Schicht Element hinzuzufügen:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    <item> 
     <shape> 
      <solid android:color="@color/tab_button_active_layer2" /> 
     </shape> 
    </item> 
    <item android:bottom="@dimen/tab_button_active_bottom_bar_width"> 
     <shape> 
      <solid android:color="@color/tab_button_active_layer1" /> 
     </shape> 
    </item> 
    <!-- 9-patch drawable --> 
    <item android:drawable="@drawable/tab_button_border_top"/> 
</layer-list> 
Verwandte Themen