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"자식 뷰에 추가 .

예를 들면 :

나는 CustomViewTextViewFrameLayout이와 같은 중심에 두었습니다.

암호:

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