FrameLayout의 Android 센터보기가 작동하지 않습니다.


83

2 개의 컨트롤이있는 FrameLayout이 있습니다.-이미지와 텍스트를 그리는 사용자 지정보기-텍스트가있는 텍스트보기

둘 다 FrameLayout의 가운데에두고 싶지만 할 수 없습니다. Texview는 중앙에 잘 있으며, 내가 보이게 할 때 내 cusom view는 왼쪽에 남아 있습니다.

<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>

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();
    }
}

1
사용자 정의보기는 어디에서 확장됩니까? 생성자에서 매개 변수를 처리하고 있습니까?
— Mathias Conradt

FrameLayout을 사용해야하는 특별한 이유가 있고 TextView가 View 위에 표시되어야합니까?
— Octavian A. Damiean

1
예, FrameLayout은 그렇게 할 수 없습니다. 그것은 단지 하나의 뷰를 유지하기위한 것입니다. 언급 한 정확한 동작을 갖는 것보다 더 많은 것을 추가하면 왼쪽 상단에 고정하여 수직 스택에 요소를 추가합니다. developer.android.com/reference/android/widget/FrameLayout.html
— plainjimbo

답변:


42

FrameLayout 대신 RelativeLayout을 제안합니다.

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>

visibility요소의를 gone로 설정하면 요소가 소비하는 공간이 사라지고 invisible대신 사용하면 소비되는 공간이 보존됩니다.

ImageView 위에 TextView를 두려면 간단히를 생략 android:layout_alignParentTop하거나 falseTextView에 설정 하고 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>

나는 이것이 당신이 찾고 있던 것이기를 바랍니다.


귀하의 설명은 매우 좋아 보이며 제 경우에는 작동하지만 그렇지 않습니다. 내 RelativeLayout에는 2 개의 사용자 지정 뷰, LinearLayout, Button 및 TextView가 있습니다. 모든 것이 내 사용자 정의보기를 제외하고 작동한다는 것이 궁금합니다. 다른 사용자 정의보기는 fill_parent 속성으로 영향을받지 않습니다. 그러나 나는 내가 무언가를 놓치지 않았는지 확인하려고 노력하고 있습니다. 감사합니다.
— Alin

사용자 정의보기의 목적은 무엇입니까?
— Octavian A. Damiean 2010

질문에 대한 사용자 정의보기의 전체 코드를 추가했습니다. 기본적으로 큰 이미지를 배경으로 그리고 더 작은 이미지를 x, y 위치에 그립니다.
— Alin

ImageView에 src를 지정하는 경우에만 예상대로 작동합니다. 나중에 채워질 ImageView 아래에 텍스트 (또는 버튼 등)를 넣으려고하면 onResume ( ) 끝내다.

4
가능하면 RelativeLayouts를 피하고 싶습니다. 각 RelativeLayout에는 2 개의 측정 패스가 필요하므로 중첩 된 RelativeLayouts에는 지수 측정 시간이 있습니다. 새 중첩 RelativeLayout을 추가 할 때마다 측정 시간이 두 배로 늘어납니다.
— Martin Konecny

389

중앙에 뷰를 정렬 할 수 있습니다 FrameLayout.layout_gravity자식보기를 있습니다.

XML에서 :

android:layout_gravity="center"

자바 코드에서 :

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

참고 : FrameLayout.LayoutParams다른 기존 LayoutParams를 사용 하지 마십시오.


109
이것은 받아 들여진 대답이어야합니다. 다른 하나는 대답하는 대신 질문을 변경합니다.
— Muz

Y이 솔루션은 나를 위해 작동하지 않았습니다. 프레임 레이아웃 중앙에 Imageview 추가 .cap = new ImageView (CameraActivity.this); LayoutParams params2 = 새 LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params2.gravity = Gravity.CENTER; cap.setLayoutParams (params2); cameraView.addView (cap);
— Akanksha Rathore 2014 년

8
이제 그것은 나를 위해 일했습니다. 내 실수는 잘못된 패키지를 가져 왔다는 것입니다. 4 시간 후 실제 패키지가 android.widget.FrameLayout.LayoutParams라는 실수를했습니다.
— Akanksha Rathore 2014 년

2
@Akanksha는 유일한 정답입니다 :) 여러분은 FrameLayout.LayoutParams를 사용하여 뷰를 FrameLayout에 중앙에 배치해야합니다.
— hrules6872

5

이 순서를 따르십시오.

원하는 수의 자식을 FrameLayout.

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

그래서 열쇠는

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>

결과:

여기에 이미지 설명 입력


1
이것은 나를 위해 일한 유일한 대답이었습니다. 나는 FrameLayout하나 TextureView와 둘 을 포함하고 있습니다 SurfaceView. 이것으로 (그리고 setZOrderOnTop(true);표면에서 나는 마침내 모든 오버레이를 중심으로했습니다
— Xavi

1

위젯의 layout_gravity 속성의 'center_horizontal'및 'center_vertical'또는 'center'만 설정

    <?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

Framelayout에서 뷰를 중앙에 배치하려면 몇 가지 트릭을 사용할 수 있습니다. Webview 및 Progressbar에 사용한 가장 간단한 것 (두 개체 레이아웃과 매우 유사), 방금 추가했습니다.android:layout_gravity="center"

다른 사람이 동일한 작업을 수행해야하는 경우를 대비하여 완전한 XML이 있습니다.

<?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>

내 결과는 다음과 같습니다.

스크린 샷

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.