2016-03-28 6 views
0

Ich habe eine benutzerdefinierte Ansicht geschrieben. Abhängig von seinem Inhalt möchte ich es ein wenig nach oben verschieben, dass es die ImageView überlappt.Kann eine benutzerdefinierte Ansicht ihre Position ändern?

Dazu setze ich einen neuen Y-Wert in onLayout. Der Blick nach oben bewegt, aber es gibt jetzt einen leeren Raum unterhalb der Ansicht links :-(

onLayout in meiner benutzerdefinierten Ansicht:

@Override 
protected void onLayout(boolean changed, int left, int top, int right, int bottom) { 
    super.onLayout(changed, left, top, right, bottom); 
    setY(getY() - mOverlap); 
} 

Dies ist das Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginBottom="4dp" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="4dp" 
    app:cardBackgroundColor="@color/eventitem_background"> 

    <android.support.percent.PercentRelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <ImageView 
      android:id="@+id/imageView_cell_event" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      app:layout_aspectRatio="266%" 
      app:layout_widthPercent="100%"/> 

     <me.veents.ui.views.EventListView 
      android:id="@+id/eventListView_cell_event" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_below="@id/imageView_cell_event"/> 

    </android.support.percent.PercentRelativeLayout> 

</android.support.v7.widget.CardView> 
+0

Um die Y-Position der Ansicht einzustellen, tun Sie das besser in 'onDraw()' als 'onLayout()' oder schließen Sie die 'nineolddroids'-Bibliothek ein, da Sie darauf zugreifen können die X/Y-Positionen der Ansichten und animieren ihre Übergänge zu neuen Werten. Andernfalls verschiebe es zuerst und rufe dann 'super.onLayout (geändert, links, top-moverp, rechts, unten-moverp) auf; aber ich bin mir nicht sicher, ob das funktioniert. – Shark

+0

Es hat den gleichen Effekt. Es sieht so aus, dass das übergeordnete Layout seine Größe nicht verringert, wenn ich die Ansicht verschiebe. –

+0

parentLayout wird niemals wirklich neu skalieren, wenn die Kindsansichten verschoben werden, um (hoffentlich) das zu erreichen, müssen Sie 'parentLayout.requestLayout();' ausführen, da dies intern 'measure();' und 'layout() ; 'was (hoffentlich hoffentlich) das gewünschte Ergebnis liefert und seine Dimensionen aktualisiert/neu berechnet. – Shark

Antwort

0

Ich würde empfehlen zu verwenden:

1) FrameLayout - es zieht seine Kinder eine auf der anderen

2) leere Ansichten (<View .../>) unterhalb und oberhalb Ihrer Ansicht positionieren Sie Ihre Ansicht mit den Höhen dieser leeren Ansichten. (Dieselbe Technik funktioniert auch für die horizontale Positionierung.)

Verwandte Themen