FrameLayout中的Android中心视图不起作用

Ali*_*lin 74 layout android gravity

我有一个FrameLayout,其中我有2个控件: - 一个自定义视图,在其上绘制图像和一些文本 - 带有文本的textview

我想在FrameLayout中居中,但我无法做到.Texview的中心很好,当我看到它时,我的视图仍然在左侧.

<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>
Run Code Online (Sandbox Code Playgroud)

对Mathias来说,我在构造函数中没有做任何事情,这很简单

   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();
    }
}
Run Code Online (Sandbox Code Playgroud)

use*_*825 354

我们可以FrameLayout通过设置layout_gravity子视图来将视图对齐在中心.

在XML中:

android:layout_gravity="center"
Run Code Online (Sandbox Code Playgroud)

在Java代码中:

FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
Run Code Online (Sandbox Code Playgroud)

注意:使用FrameLayout.LayoutParams而不是其他现有的LayoutParams

  • 这应该是公认的答案.另一个改变问题而不是回答问题. (99认同)
  • 现在它对我有用.我的错误是我导入了错误的包裹.4个小时后,我误以为导入的Actual包是android.widget.FrameLayout.LayoutParams; (8认同)
  • @Akanksha这是*唯一的*正确答案:)你们必须使用FrameLayout.LayoutParams将视图居中到FrameLayout. (2认同)

Oct*_*ean 36

我建议使用RelativeLayout而不是FrameLayout.

假设您希望TextView始终位于ImageView下方,我将使用以下布局.

<?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>
Run Code Online (Sandbox Code Playgroud)

请注意,如果visibility将元素设置为,gone则元素将消耗的空间消失,而当您使用时,它将消耗invisible的空间将被保留.

如果你想让TextView位于ImageView之上,那么只需将其android:layout_alignParentTop设置为或将其设置false为TextView并忽略该android:layout_below="@id/imageview"属性.像这样.

<?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>
Run Code Online (Sandbox Code Playgroud)

我希望这就是你要找的东西.

  • 您希望尽可能避免使用RelativeLayouts.每个RelativeLayout需要2次测量 - 因此嵌套的RelativeLayout具有指数测量时间.每次添加新的嵌套RelativeLayout时,您的测量时间都会增加一倍. (4认同)

Roh*_*ngh 7

只需按照这个顺序

您可以将任意数量的孩子集中在一个FrameLayout.

<FrameLayout
    >
    <child1
        ....
        android:layout_gravity="center"
        .....
        />
    <Child2
        ....
        android:layout_gravity="center"
        />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

所以关键是

添加android:layout_gravity="center"子视图。

例如:

我将一个CustomView和一个TextView集中在FrameLayout这样的

代码:

<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>
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明