在FrameLayout中的Android中心视图不起作用
我有一个FrameLayout,我有2个控件: – 一个自定义视图,其中绘制一个图像和一些文本 – 一个文本视图与文本
我想要在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>
对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(); } }
我会build议一个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>
请注意,如果将元素的visibility
设置为gone
那么元素消耗的空间将消失,而当您使用invisible
时,元素消耗的空间将被保留。
如果你想在ImageView的顶部有TextView,那么就省略掉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>
我希望这是你正在寻找的。
通过设置子视图的layout_gravity,我们可以在Framelayout的中心alignment视图
在XML中:
layout_gravity = "center"
(要么)
在JAVA中:
LayoutParams lp = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT ); lp.gravity = Gravity.CENTER;
在你的代码中。