2017-10-12 4 views
0

ConstraintLayout benötigt zwei Durchläufe, bevor es sich für Ansichten mit beliebiger Größe misst (Ansichten mit 0 dpi für Bemaßung). Also ich habe eine Ansicht, die Verhältnis basiert und ich möchte messen, wie groß es sein wird, bevor die Ansicht vom Benutzer gesehen wird. Ich mache das ist ein Adapter für eine Recyclerview, wenn es darauf ankommt. was ich bisher versucht, ist die folgende:Android - Wie man eine Ansicht 'beliebiger Größe' misst, die in ein constraintLayout eingewickelt ist?

iv.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); 
width = iv.getMeasuredWidth(); 
height = iv.getMeasuredHeight(); 

und hier ist das Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.constraint.ConstraintLayout 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="wrap_content"> 

    <ImageView 
     android:id="@+id/iv" 
     android:layout_width="0dp" 
     android:layout_height="0dp" 
     android:layout_marginLeft="11dp" 
     android:layout_marginRight="11dp" 
     android:layout_marginTop="0dp" 
     app:layout_constraintDimensionRatio="H,3:2" 
     app:layout_constraintHorizontal_bias="0.0" 
     app:layout_constraintLeft_toLeftOf="parent" 
     app:layout_constraintRight_toRightOf="parent" 
     app:layout_constraintTop_toTopOf="parent" 
     /> 
</android.support.constraint.ConstraintLayout> 

aber das gibt mir immer 1 für Breite und 1 für die Höhe. Wie kann ich die tatsächlichen Messungen erhalten?

Der Grund, warum ich die gemessene Ansicht brauche, ist eine URL zu konstruieren. hier ist ein Beispiel url ich brauche:

mywebsiteAtImgix.com/img/books/20170316171929_6b1c02a5.jpg?auto=compress&dpr=1&fit=clip&ixlib=java-1.1.1&q=75&w=1&h=1 

MEHR INFO: ich eine Firma namens imgix verwende und sie skaliert alle meine Bilder für mich. Es ist sehr schnell und sie cachen etc, also ist es nützlich für Web-Bilder.
Wie auch immer, beachten Sie, dass die Abfrageparameter eine Breite namens "w" und Höhe "h" haben. jetzt kommen sie als 1 aber für non constraintlayout Bildansichten, wenn ich es messe ich bekomme die Dimensionen in Ordnung und das Bild von Imgix zurückgegeben ist eine gute Größe. Wenn ich 1 und 1 für Dimensionen verwende, bringt es mir das Originalbild zurück, das extrem groß ist (2 MB bis 5 MB +). Ich muss die Dimensionen aus dem constraintLayout holen, damit ich die URL richtig erstellen kann. hoffe, dass dies die Dinge aufklärt.

+0

Nein. Ich füge das Zeichen ein, nachdem ich die Breiten- und Höhenabmessungen kenne. Ich mache tatsächlich einen Web-Call, nachdem ich die URL für das Bild erstellt habe. Aber diese URL benötigt Höhe und Breite des Bildes. Es ist eine Firma namens imgix – j2emanue

+0

Ich brauche nur eine Möglichkeit, ein Constraint-Layout zu messen, bevor es vom Benutzer – j2emanue

+0

gesehen wird, danke für das Folgen. Ich habe meine Frage aktualisiert, damit Sie sehen können, warum ich sie brauche. Grundsätzlich gilt . Ich muss eine URL mit der Höhe und Breite der Ansicht erstellen. Die Firma imgix wird mir dann das Bild genau in der Breite und Höhe zur Verfügung stellen. Android wird nichts skalieren. Die Bilder sind sehr Chips und sind schnell zu bekommen. – j2emanue

Antwort

1

Sie können ViewTreeObserver.OnPreDrawListener verwenden, um die Grenzen Ihres Bildes direkt vor dem Anzeigen des Layouts für den Benutzer zu erhalten.

onPreDraw

boolean onPreDraw()

Callback-Methode aufgerufen werden, wenn die Ansicht Baum im Begriff ist, zu ziehen. An diesem Punkt wurden alle Ansichten in dem Baum gemessen und ein Rahmen gegeben. Clients können damit ihre Scroll-Grenzen anpassen oder sogar ein neues Layout anfordern, bevor das Zeichnen erfolgt.

+0

es funktioniert. Ich war tatsächlich besorgt, dass es mit constraintLayout keine Größenansichten funktionieren würde. Vielen Dank! – j2emanue

Verwandte Themen