it-swarm.com.de

Zeichnen der oberen Grenze einer Form auf Android

Ich erstelle einen benutzerdefinierten Fortschrittsbalken (unter einem WebViewname__) und möchte eine 1dp-breite Linie zwischen dem WebViewund dem ProgressBarzeichnen. Ich ändere das vorhandene Drawable, nämlich progress_horizontal.xml, und versuche es in etwa so:

<?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>

Diese Linie ist jedoch vertikal zentriert, aber ich möchte, dass sie über der Zeichenfläche gezeichnet wird. Die einzige Idee, die ich mir einfallen lassen könnte, ist die Verwendung dieses "hackigen" Verlaufs:

<?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 Sie eine einzelne Linienform zeichnen können, die am oberen Rand der mit layer-list definierten Zeichenfläche ausgerichtet ist?

17
Marek Stój

Ich habe eine Weile damit verbracht, das herauszufinden. Hoffentlich gibt es einen besseren Weg, aber hier ist die Methode, die ich verwendet habe, die auch irgendwie hackisch ist, aber falls es jemandem hilft, dachte ich, ich würde teilen.

Das erste Element in Ihrer Ebenenliste sollte ein Volumenkörper mit der Farbe sein, die Sie als Rahmen verwenden möchten. Dem zu folgen, wäre die Sache, die Sie den Rand haben möchten, mit Auffüllen auf der Seite, auf der Sie den Rand haben möchten.

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 Gegenstand die feste Form dahinter enthüllt und den Rand aussehen lässt. Sie können jeder Seite einen Rand hinzufügen, um einen Rand hinzuzufügen. Ich stelle mir vor, Sie könnten komplizierter werden und auf diese Weise auch verschiedenfarbige Ränder haben.

Scheint wie ein Hack, aber es hat bei mir funktioniert.

EDIT: Ich sagte "Auffüllen", aber in Ebenenlisten ist es eher ein Offset.

47
cottonBallPaws

ich habe alle verwandten Themen durchgearbeitet, aber niemand konnte mein Problem lösen. Einige von ihnen waren jedoch sehr nützlich, um zu verstehen, wie die Parameter für Ebenenlisten oder Formen funktionieren.

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

    <?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>
12
Şükriye

Haben Sie versucht, dies durch so etwas auszugleichen?

http://Android.amberfog.com/?p=9

1
Bo.

Meine Lösung ist, 9-Patch als letzte Ebene 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>
0
Mickey Tin