2016-08-16 2 views
4

Ich arbeitete vor kurzem mit Animationen und geriet in Schwierigkeiten, als FrameLayout seinen Schatten nicht richtig aus seltsamen Gründen zeigte.Klarstellung über Android clipToPadding Eigenschaft

Ich fand eine gute Antwort, die mir geholfen hat, aber es wurde eine Eigenschaft namens clipToPadding verwendet. Antwort kann hier gefunden werden: Android “elevation” not showing a shadow

Allerdings wollte ich wirklich den Zweck dieser Eigenschaft verstehen. Ich ging zur Dokumentation von Android, die besagt, dass:

Legt fest, ob die Viewgroup seine Kinder Clip und die Größe (aber nicht clip) jede EdgeEffect seiner Polsterung, wenn padding nicht Null ist. Diese -Eigenschaft wird standardmäßig auf true festgelegt.

Ich habe es für viele Male gelesen und ich suchte nach Beispielen im Web, aber ich konnte wirklich einige nicht finden. Die einzigen Visuals ich fand, war ähnlich wie dieses ClipToPadding difference

ich die Wirkung auf der Liste sehen kann, aber wie es beeinflussen kann, wenn es nur ein View im ViewGroup zum Beispiel ist usw.

Es wäre schön, wenn jemand mir ein paar Schlüsselpunkte über diese Eigenschaft und wie es mit ein paar Beispielen funktioniert.

+2

Hehe. Android-Dokumentation kann manchmal verwirrend sein, ganz zu schweigen von grammatikalischen Fehlern und was nicht. Vielleicht kann [dies] (https://plus.google.com/photos/+AndroidDevelopers/albums/5984848297731814001) helfen? (Sie müssten den Text erweitern, indem Sie auf Weiterlesen klicken, direkt über dem GIF.) –

+0

Wenn Sie "clipToPadding = true" verwenden, werden die untergeordneten Elemente grundsätzlich abgeschnitten, als ob der aufgefüllte Teil einen Teil des untergeordneten Elements verbirgt . Ich weiß nicht, ob ich dir viel Sinn mache ...:/ –

+1

Nun, ich habe es auch geschafft, das gleiche Beispiel mit Listen zu finden, aber ich kann nicht verstehen, wie es funktioniert, wenn es keine Listen gibt, aber gewöhnlich [keine Liste] views :( – rofl

Antwort

3

clipToPadding bedeutet im Wesentlichen "Wenn die Ansicht über ihre Grenzen hinaus in den Padding-Bereich gezeichnet wird, überschreiben Sie diese Zeichnung mit dem Padding des übergeordneten Elements".

Der Schatten einer erhöhten Ansicht wird außerhalb der Grenzen der Ansicht gezeichnet. Damit es sichtbar ist, müssen Sie sicherstellen, dass um die Ansicht herum Platz ist. Sie können dies erreichen, indem Sie für das übergeordnete Element Auffüllung festlegen, aber dann müssen Sie clipToPadding=false festlegen, damit der Schatten nicht überschrieben wird.

Wie in this answer erwähnt, ist dies auch nützlich, wenn Sie eine scrollbare Ansicht wie eine ListView oder RecyclerView haben. Beim Scrollen zeichnet die Liste Inhalte außerhalb ihrer Grenzen auf. Wenn Sie clipToPadding=false festlegen, können Sie diesen Inhalt anstelle der Auffüllung sehen und sehen nur die Auffüllung, wenn Sie vollständig nach oben oder unten gescrollt haben.

Als Beispiel, legen wir eine ovale Form als Hintergrund einer Ansicht und lassen Sie uns diese Ansicht erhöhen. Wir werden auch etwas Padding auf den Container setzen. Der folgende Screenshot wurde mit "Layout-Grenzen anzeigen" in den Optionen für Entwickler erstellt. Der Bereich zwischen den beiden roten Rechtecken ist das Padding der Eltern.

Bounds and padding

Dies ist, wie es mit clipToPadding=true schaut darauf, wie der Schatten am unteren Rand abgeschnitten wird, wo es zwischen den beiden roten Rechtecke liegen würde:

clipToPadding=true

Mit clipToPadding=false, wir Siehe den ganzen Schatten:

enter image description here

Hier ist der XML-I verwendet:

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent" 
    android:background="#8888ff"> 

    <RelativeLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:paddingLeft="40dp" 
     android:paddingRight="40dp" 
     android:paddingTop="20dp" 
     android:paddingBottom="20dp" 
     android:clipToPadding="false" 
     android:layout_centerInParent="true"> 

     <View 
      android:layout_width="170dp" 
      android:layout_height="170dp" 
      android:background="@drawable/oval" 
      android:alpha="0.5" 
      android:elevation="5dp" 
      /> 

    </RelativeLayout> 

</RelativeLayout> 

Und hier ist der oval ziehbar:

<shape android:shape="oval"> 
     <solid android:color="#f2f2f2"/> 
</shape> 
Verwandte Themen