wake-up-neo.com

Die Android-Center-Ansicht in FrameLayout funktioniert nicht

Ich habe ein FrameLayout, in dem ich zwei Steuerelemente habe: - eine benutzerdefinierte Ansicht, die ein Bild und Text darauf - eine Textansicht mit einem Text zeichnet

Ich möchte beide im FrameLayout zentrieren, schaffe es aber nicht. Der Texview ist gut zentriert, meine Ansicht bleibt auf der linken Seite, wenn ich sie sichtbar mache.

<FrameLayout Android:id="@+id/CompassMap"
               Android:layout_width="fill_parent" 
               Android:layout_height="wrap_content"
               Android:layout_weight="1"
               Android:gravity="center">

             <view class="com.MyView"
        Android:id="@+id/myView"
        Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:visibility="gone"/>

                <TextView Android:layout_width="wrap_content" 
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal"
        Android:text="CENTERED" /> 
</FrameLayout>

Für Mathias mache ich nichts im Konstruktor, das ist einfach

   public class MyMapView extends View {

private int xPos = 0; 
private int yPos = 0;
private Bitmap trackMap;

private Matrix backgroundMatrix;
private Paint backgroundPaint;

private Bitmap position;
private Matrix positionMatrix;
private Paint positionPaint;

public MyMapView(Context context) {
    super(context);
    init(context, null);
}

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

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

private void init(final Context context, AttributeSet attrs) {

backgroundMatrix = new Matrix();
backgroundPaint = new Paint();
backgroundPaint.setFilterBitmap(true);

position = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.position);
positionMatrix = new Matrix();

positionPaint = new Paint();
positionPaint.setFilterBitmap(true);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
}

@Override
protected void onDraw(Canvas canvas) {

    int width = getMeasuredWidth();
    int height = getMeasuredHeight();

    if (trackMap!=null)
    {
        Bitmap resizedBitmap = Bitmap.createScaledBitmap(trackMap, height, height, true);
        canvas.drawBitmap(resizedBitmap, backgroundMatrix, backgroundPaint);

    }

        canvas.save(Canvas.MATRIX_SAVE_FLAG);
        canvas.translate(xPos-position.getWidth()/2, yPos-position.getHeight()/2);
        canvas.drawBitmap(position, positionMatrix, positionPaint);

        canvas.restore();
}

    public void updatePosition(int xpos, int ypos, Bitmap trackImage)
    {
        xPos=xpos;
        yPos=ypos;
        trackMap = trackImage;
        invalidate();
    }
}
64
Alin

Ich würde ein RelativesLayout anstelle eines FrameLayouts vorschlagen.

Angenommen, Sie möchten die TextView immer unter der ImageView haben, würde ich folgendes Layout verwenden.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <ImageView
        Android:id="@+id/imageview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="true"
        Android:layout_centerInParent="true"
        Android:src="@drawable/icon"
        Android:visibility="visible"/>
    <TextView
        Android:id="@+id/textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:layout_below="@id/imageview"
        Android:gravity="center"
        Android:text="@string/hello"/>
</RelativeLayout>

Wenn Sie die visibility eines Elements auf gone setzen, ist der Platz, den das Element verbrauchen würde, verschwunden. Wenn Sie jedoch invisible verwenden, wird der von ihm verbrauchte Speicherplatz beibehalten.

Wenn Sie möchten, dass sich die Textansicht über der ImageView befindet, lassen Sie einfach den Android:layout_alignParentTop weg oder setzen Sie ihn auf false, und auf der TextView das Android:layout_below="@id/imageview"-Attribut. So was.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content">
    <ImageView
        Android:id="@+id/imageview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentTop="false"
        Android:layout_centerInParent="true"
        Android:src="@drawable/icon"
        Android:visibility="visible"/>
    <TextView
        Android:id="@+id/textview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:gravity="center"
        Android:text="@string/hello"/>
</RelativeLayout>

Ich hoffe, das ist, wonach Sie gesucht haben.

34

Wir können eine Ansicht in der Mitte der FrameLayout ausrichten, indem Sie den layout_gravity der untergeordneten Ansicht festlegen. 

In XML:

Android:layout_gravity="center"

In Java-Code:

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;

Hinweis: Verwenden Sie FrameLayout.LayoutParams, nicht die anderen vorhandenen LayoutParams

317
userrp1519825

Folgen Sie einfach dieser Reihenfolge

Sie können eine beliebige Anzahl von Kindern in einer FrameLayout zentrieren. 

<FrameLayout
    >
    <child1
        ....
        Android:layout_gravity="center"
        .....
        />
    <Child2
        ....
        Android:layout_gravity="center"
        />
</FrameLayout>

Der Schlüssel fügt also Android:layout_gravity="center" in den untergeordneten Ansichten hinzu.

Zum Beispiel:
Ich habe eine CustomView und eine TextView auf eine FrameLayout wie folgt zentriert

Code:

<FrameLayout
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    >
    <com.airbnb.lottie.LottieAnimationView
        Android:layout_width="180dp"
        Android:layout_height="180dp"
        Android:layout_gravity="center"
        app:lottie_fileName="red_scan.json"
        app:lottie_autoPlay="true"
        app:lottie_loop="true" />
    <TextView
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center"
        Android:textColor="#ffffff"
        Android:textSize="10dp"
        Android:textStyle="bold"
        Android:padding="10dp"
        Android:text="Networks Available: 1\n click to see all"
        Android:gravity="center" />
</FrameLayout>

Ergebnis:

 enter image description here

0
Rohit Singh

Um die Ansicht in Framelayout zu zentrieren, stehen einige Tricks zur Verfügung. Die einfachste, die ich für meine Webview- und Fortschrittsleiste verwendet habe (sehr ähnlich zu Ihrem Zwei-Objekt-Layout), habe ich gerade hinzugefügt Android:layout_gravity="center" 

Hier ist komplettes XML für den Fall, dass jemand anderes dasselbe tun muss

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".WebviewPDFActivity"
    Android:layout_gravity="center"
    >
    <WebView
        Android:id="@+id/webView1"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"

        />
    <ProgressBar
        Android:id="@+id/progress_circular"
        Android:layout_width="250dp"
        Android:layout_height="250dp"
        Android:visibility="visible"
        Android:layout_gravity="center"
        />


</FrameLayout>

Hier ist meine Ausgabe

 screenshot

0
Abdul Rehman

Legen Sie 'center_horizontal' und 'center_vertical' oder einfach 'center' des Attributs layout_gravity des Widgets fest

    <?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
    tools:context=".MovieActivity"
    Android:id="@+id/mainContainerMovie"
    >


    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:background="#3a3f51b5"
       />

    <ProgressBar
        Android:id="@+id/movieprogressbar"
        style="?android:attr/progressBarStyle"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="center_vertical|center_horizontal" />
</FrameLayout>
0
MN. Vala