2016-11-08 3 views
0

Ich versuche, eine Bildansicht auf einem anderen Bildansicht zu platzieren wie folgt:Skala Image basierend auf Eigenschaften eines anderen Image

Desired Outcome

Dies ist das Layout ich dies zu erreichen, verwenden:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="8dp"> 

    <ImageView 
     android:id="@+id/list_item_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:adjustViewBounds="true" 
     android:scaleType="fitXY" 
     android:layout_gravity="center" /> 

    <ImageView 
     android:id="@+id/list_item_logo" 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:adjustViewBounds="true" 
     android:scaleType="fitCenter" 
     android:paddingLeft="10dp" 
     android:paddingTop="10dp" 
     android:layout_gravity="top|start" /> 
</FrameLayout> 

Das macht die Aufgabe, das Logo auf dem Bild zu platzieren, aber der Haken hier ist, dass ich auch das Logo skalieren sollte (die Originalgröße ist ungefähr das gleiche wie das Bild) basierend auf den Eigenschaften des Bildes. Genauer gesagt möchte ich das Logo auf ein Viertel der Breite des Bildes rendern, ein Seitenverhältnis von 1: 1 haben und 10% Auffüllung der Bildbreite hinzufügen.

Im Moment spiele ich nur mit den Werten von Layoutbreite, Layouthöhe, PaddingLeft und PaddingTop des Logos herum, bis ich das gewünschte Ergebnis bekomme. Gibt es eine Möglichkeit, die Eigenschaften des Logos basierend auf den Eigenschaften des Bildes dynamisch zu ändern?

Jede Hilfe wird sehr geschätzt.

Antwort

1

Verwenden Sie eine PercentRelativeLayout, um Ihr gewünschtes Layout zu erreichen, wobei Ihr Logo 10% obere und Anfangsseiten und 10% Breite (oder die von Ihnen benötigte Breite) aufweist. Beachten Sie, dass die SquareImageView eine benutzerdefinierte Ansicht ist, die sich derzeit im Paket com.example befindet und dass sie jeden angegebenen Höhenwert ignorieren und auf die berechnete Breite zurücksetzen wird (was 10% der Bildbreite entspricht).

Beispiel XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.percent.PercentRelativeLayout 
     android:layout_width="100dp" 
     android:layout_height="100dp" 
     android:layout_centerInParent="true"> 


     <ImageView 
      android:id="@+id/image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:background="#ff0000" /> 

     <com.example.SquareImageView 
      android:id="@+id/logo" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      android:background="#0000ff" 
      app:layout_heightPercent="10%" 
      app:layout_marginStartPercent="10%" 
      app:layout_marginTopPercent="10%" 
      app:layout_widthPercent="10%" /> 


    </android.support.percent.PercentRelativeLayout> 
</RelativeLayout> 

SquareImageView.java:

public class SquareImageView extends ImageView { 
    public SquareImageView(Context context) { 
     super(context); 
    } 

    public SquareImageView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SquareImageView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth()); // Snap to width 
    } 
} 
+0

Hey, vielen Dank für die Hilfe. Es funktioniert großartig. :) –

+1

Ich bin froh, dass ich helfen könnte. – MohanadMohie

+0

Ich stoße auf ein anderes Problem und ich frage mich, ob du mir helfen kannst. Die App: layout_marginTopPercent = "10dp" -Eigenschaft scheint nicht zu funktionieren, da das Logo immer oben auf dem Bild hängt, egal welchen Wert ich an diesen Parameter übergebe. Es ist vielleicht erwähnenswert, dass die XML-Datei ein Element in einer RecyclerView darstellt, das möglicherweise etwas damit zu tun hat, dass der Rand nicht funktioniert. Bearbeiten: Beachten Sie, dass app: layout_marginStartPercent = "10%" gut funktioniert, was es noch seltsamer macht, dass marginTopPercent nicht funktioniert. –