2016-11-01 3 views
0

Ich versuche, benutzerdefinierte Layout "SquareBox" basierend auf relativen Layout zu erstellen, um ein ImageView in der Mitte zu halten. Und dieses benutzerdefinierte Layout wird immer in quadratischer Größe sein (abhängig von ImageViews Höhe und Breite).Center in Parent funktioniert nicht für benutzerdefinierte relative Layout

protected void onMeasure(int width, int height) { 
    super.onMeasure(width, height); 
    int measuredWidth = getMeasuredWidth(); 
    int measuredHeight = getMeasuredHeight(); 
    int size; 
    if (measuredWidth > measuredHeight) { 
     size = measuredWidth; 
    } else { 
     size = measuredHeight; 
    } 
    setMeasuredDimension(size, size); 
} 

Hier ist mein Layout-Code:

<com.example.tools.SquareBox 
     android:id="@+id/square_box" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:background="@android:color/darker_gray"> 

    <ImageView 
     android:id="@+id/canvas_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="0dp" 
     android:layout_centerInParent="true" 
     android:adjustViewBounds="true" 
     android:scaleType="fitCenter" 
     tools:src="@drawable/demo_image" /> 
</com.example.tools.SquareBox> 

Es funktioniert gut, aber die Bildansicht ist nicht in der Mitte dieser benutzerdefinierten Ansicht. Ich habe Folgendes versucht: -> Android: layout_centerInParent = "True" für ImageView.

-> Android: Schwerkraft = "Mitte" für "SquareBox".

-> Hinzufügen von CENTER_IN_PARENT programmgesteuert zu ImageView in SquareBox onMeasure-Methode.

Aber nichts funktioniert. Was fehlt mir hier?

Antwort

0

ich emuliert haben das Verhalten der quadratischen Box auf andere Weise. Ich denke, es ist ein Workaround und es ist vielleicht nicht die beste Lösung, aber es funktioniert. Ich würde gerne eine bessere und sauberere Lösung wissen.

Layout-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:id="@+id/square_box_holder" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_margin="0dp" 
     android:layout_weight="3"> 

     <View 
      android:id="@+id/square_box" 
      android:layout_width="0dp" 
      android:layout_height="0dp" 
      android:layout_centerInParent="true" 
      android:background="@android:color/darker_gray" /> 


     <ImageView 
      android:id="@+id/canvas_image" 
      style="@style/CanvasImageStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_centerInParent="true" 
      android:layout_margin="0dp" 
      android:adjustViewBounds="true" 
      tools:src="@drawable/demo_image2" /> 

    </RelativeLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 

    </LinearLayout> 
</LinearLayout> 

-Code der Ansicht, um die Größe:

squareImageView.setImageBitmap(getResultBitmap()); 
      squareBoxHolder.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
       @Override 
       public boolean onPreDraw() { 
        squareBoxHolder.getViewTreeObserver().removeOnPreDrawListener(this); 
        Log.i(TAG, "onPreDraw: squareBoxHolder"); 
        squareBoxHolderSize = new Point(squareBoxHolder.getMeasuredWidth(), squareBoxHolder.getMeasuredHeight()); 
        return true; 
       } 
      }); 
      squareImageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
       @Override 
       public boolean onPreDraw() { 
        squareImageView.getViewTreeObserver().removeOnPreDrawListener(this); 
        Log.i(TAG, "onPreDraw: squareImageView"); 
        int imageWidth = squareImageView.getMeasuredWidth(); 
        int imageHeight = squareImageView.getMeasuredHeight(); 
        int size; 
        ViewGroup.LayoutParams layoutParams = squareImageView.getLayoutParams(); 
        if (imageWidth > imageHeight) { 
         if (imageWidth > squareBoxHolderSize.y) { 
          size = squareBoxHolderSize.y; 
          layoutParams.width = size; 
          squareImageView.setLayoutParams(layoutParams); 
         } else { 
          size = imageWidth; 
         } 
        } else { 
         if (imageHeight > squareBoxHolderSize.x) { 
          size = squareBoxHolderSize.x; 
          layoutParams.height = size; 
          squareImageView.setLayoutParams(layoutParams); 
         } else { 
          size = imageHeight; 
         } 
        } 

        layoutParams = squareBox.getLayoutParams(); 
        layoutParams.height = size; 
        layoutParams.width = size; 
        squareBox.setLayoutParams(layoutParams); 
        return true; 
       } 
      }); 
0

Try this: - android:layout_gravity="center_horizontal"

+0

ich dies auch versucht haben. Aber nicht funktioniert. –

0

ändern Ihr Layout dieser (ändern layout_width-match_parent):

<com.example.tools.SquareBox 
     android:id="@+id/square_box" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:background="@android:color/darker_gray"> 

    <ImageView 
     android:id="@+id/canvas_image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="0dp" 
     android:layout_centerInParent="true" 
     android:adjustViewBounds="true" 
     android:scaleType="fitCenter" 
     tools:src="@drawable/demo_image" /> 
</com.example.tools.SquareBox> 

Und Ihr eigenes Layout dies ändern:

@Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
    int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
    int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
    int heightSize = MeasureSpec.getSize(heightMeasureSpec); 

    int size; 
    if(widthMode == MeasureSpec.EXACTLY && widthSize > 0){ 
     size = widthSize; 
    } 
    else if(heightMode == MeasureSpec.EXACTLY && heightSize > 0){ 
     size = heightSize; 
    } 
    else{ 
     size = widthSize < heightSize ? widthSize : heightSize; 
    } 

    int finalMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); 
    super.onMeasure(finalMeasureSpec, finalMeasureSpec); 
    } 
+0

Ich habe das versucht. Es zentriert das Bild in der benutzerdefinierten Ansicht. Nach der Größenanpassung der benutzerdefinierten Ansicht bleibt ImageView jedoch basierend auf der vorherigen Größe im Mittelpunkt, wodurch es beschnitten wird. –

Verwandte Themen