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();
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
只要按照这个顺序,
您就可以将任意数量的子元素放在
FrameLayout
中。例如:
我将 CustomView 和 TextView 放在
FrameLayout
上,如下所示Just follow this order
You can center any number of child in a
FrameLayout
.For example:
I centered a CustomView and a TextView on a
FrameLayout
like this设置小部件的layout_gravity属性的“center_horizontal”和“center_vertical”或仅“center”
Set 'center_horizontal' and 'center_vertical' or just 'center' of the layout_gravity attribute of the widget
要使视图在 Framelayout 中居中,可以使用一些技巧。我用于 Webview 和 Progressbar 的最简单的一个(与您的两个对象布局非常相似),我刚刚添加了
android:layout_gravity="center"
这是完整的 XML,以防其他人需要相同的东西 这是
我的输出
To center a view in Framelayout, there are some available tricks. The simplest one I used for my Webview and Progressbar(very similar to your two object layout), I just added
android:layout_gravity="center"
Here is complete XML in case if someone else needs the same thing to do
Here is my output
在https://stackoverflow.com/a/13025031/962916之后,这对我来说可以将TabLayout置于FrameLayout中的中心。
Following https://stackoverflow.com/a/13025031/962916, this works for me to center a TabLayout inside FrameLayout.
我们可以通过设置子视图的layout_gravity来将视图对齐到FrameLayout的中心。
在 XML 中:
在 Java 代码中:
注意:使用
FrameLayout.LayoutParams
而不是其他现有的 LayoutParamsWe can align a view in center of the
FrameLayout
by setting thelayout_gravity
of the child view.In XML:
In Java code:
Note: use
FrameLayout.LayoutParams
not the others existing LayoutParams我建议使用relativelayout而不是framelayout。
假设您希望 TextView 始终位于 ImageView 下方,我将使用以下布局。
请注意,如果您将元素的
visibility
设置为gone
,则该元素占用的空间就会消失,而当您使用invisible
代替时,该元素占用的空间就会消失。它消耗的将被保留。如果您想让 TextView 位于 ImageView 之上,则只需省略
android:layout_alignParentTop
或将其设置为false
并在 TextView 上省略android :layout_below="@id/imageview"
属性。像这样。我希望这就是您正在寻找的。
I'd suggest a RelativeLayout instead of a FrameLayout.
Assuming that you want to have the TextView always below the ImageView I'd use following layout.
Note that if you set the
visibility
of an element togone
then the space that element would consume is gone whereas when you useinvisible
instead the space it'd consume will be preserved.If you want to have the TextView on top of the ImageView then simply leave out the
android:layout_alignParentTop
or set it tofalse
and on the TextView leave out theandroid:layout_below="@id/imageview"
attribute. Like this.I hope this is what you were looking for.