具有视图中心的布局与中心项目的中心匹配,具有最小填充

时间:2011-11-17 11:26:00

标签: android image layout

我正在尝试使用图像和两个标签创建简单的布局(一个位于图像上方,另一个位于图像下方)。我使用膨胀的视图将其绘制到画布上。我的兴趣是用一个以图像中心为中心的矩形创建视图。不需要使用fill_parent或match_parent维度进行布局,因为最终视图将占用所有可用空间,而不是最小空间(导致位图太大)。

这是我到目前为止使用的代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView android:layout_centerInParent="true"
        android:layout_width="wrap_content" android:id="@+id/ivBeaconType"
        android:layout_height="wrap_content" android:src="@drawable/bt_beacon"></ImageView>
    <TextView android:layout_above="@id/ivBeaconType" android:layout_centerHorizontal="true"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall"
        android:textSize="12dp" android:text="AABBCCDDEEFF" android:id="@+id/tvId"
        android:textColor="#72C8E0"></TextView>
    <TextView android:layout_below="@id/ivBeaconType" android:layout_centerHorizontal="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="-99 dB" android:id="@+id/tvRssi" android:textColor="#FF0000"></TextView>
</RelativeLayout>

这有一个问题。相对布局不会增长到适合两个文本(上面的标签没有显示,底部的标签被绘得太靠近图像)。我可以通过将图像对齐图像下方的第一个文本和第三个文本来正确渲染视图,但这不会产生图像中心周围的完美中心(或使用线性布局)。

可以做什么?另一个有效的解决方案是使图像的中心相对于布局绘图区域。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我明白了。 getLeft()/ getRight()/ getTop()/ getBottom()视图方法返回父级内的相对位置。唯一的验证码是它们只在布局阶段后返回有效值,因此这解决了我的问题:

    if (beaconBitmap == null)
    {
        /* Calculamos las dimensiones si no está creado el bitmap */
        beaconView.invalidate();
        beaconView.refreshDrawableState();
        beaconView.measure(
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        beaconView.layout(0, 0, beaconView.getMeasuredWidth(),
                beaconView.getMeasuredHeight());
        ImageView ivBeaconType = (ImageView) beaconView
                .findViewById(R.id.ivBeaconType);
        Rect beaconIconArea = new Rect(ivBeaconType.getLeft(),
                ivBeaconType.getTop(), ivBeaconType.getRight(),
                ivBeaconType.getBottom());
        beaconBitmapCenterX = beaconIconArea.centerX();
        beaconBitmapCenterY = beaconIconArea.centerY();
    }