代码之家  ›  专栏  ›  技术社区  ›  Alin

框架布局中的Android Center视图不工作

  •  68
  • Alin  · 技术社区  · 14 年前

    我有一个框架布局,其中有两个控件: -一种在其上绘制图像和文本的自定义视图。 -带有文本的文本视图

    我想在框架布局中两者都居中,但我做不到。TexView的中心正好,当我使其可见时,我的Cusom视图仍保留在左侧。

    <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();
        }
    }
    
    5 回复  |  直到 6 年前
        1
  •  33
  •   Octavian Helm    14 年前

    我建议使用相对布局而不是框架布局。

    假设您希望文本视图始终位于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 相反,它将占用的空间将被保留。

    如果您想让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>
    

    我希望这就是你要找的。

        2
  •  327
  •   Borzh brauliobo    6 年前

    我们可以在 FrameLayout 通过设置 layout_gravity 儿童视角。

    在XML中:

    android:layout_gravity="center"
    

    在Java代码中:

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

    注意:使用framelayout.layoutParams而不是其他现有的layoutParams

        3
  •  1
  •   MN. Vala    6 年前

    设置小部件布局重力属性的“中心水平”和“中心垂直”或“中心”。

        <?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>
    
        4
  •  0
  •   Abdul Rehman    6 年前

    要在框架布局中使视图居中,有一些可用的技巧。最简单的一个我用于我的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>
    

    这是我的输出

    screenshot

        5
  •  0
  •   Rohit Singh Varun    6 年前

    按这个顺序就行了

    您可以将任意数量的孩子放在 FrameLayout

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

    所以关键是增加 android:layout_gravity="center" 在子视图中。

    例如:
    我把自定义视图和 TextView 在一 框架布局 这样地

    代码:

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

    结果:

    enter image description here

    推荐文章