在保持纵横比的同时,缩放比例为高度的一半

时间:2016-03-30 11:29:30

标签: android android-layout android-drawable

我想垂直放置两个圆圈,我希望它们的大小是父高度的一半。简而言之,请参见下图。

我希望根据x来缩放圈子,这是TextView的高度,并且可以根据系统偏好而变化。我在下面创建了一个布局,但它没有用。这可以实现吗?

desired

更新

根据答案,我为圆圈指定了一些任意的宽度和高度,然后更改了#34; fitXY" to" centerInside" (因为我发现fitXY不保持纵横比)。为了模拟不同的系统设置,我将任意高度设置为TextView。我将ImageViews的背景颜色设置为red以查看它们的边界。

问题是,如果圆的宽度/高度小于TextView高度的1/2(例如,圆宽/高度= 10dp,TextView高度= 100dp),则圆圈不会向上扩展。 enter image description here

如果圆的宽度/高度大于TextView高度的1/2(例如,圆宽/高度= 200dp,TextView高度= 100dp),则圆圈会正确缩放,但不知何故有一些圆圈左/右侧的奇怪空边。 enter image description here

END OF UPDATE

我创建了一个如下所示的布局,但它没有用。

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent">
        <ImageView
            android:src="@drawable/circle"
            android:scaleType="fitXY"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="0dp"/>
        <ImageView
            android:src="@drawable/circle"
            android:scaleType="fitXY"
            android:layout_weight="1"
            android:layout_width="wrap_content"
            android:layout_height="0dp"/>
    </LinearLayout>
    <TextView
        android:textAppearance="@android:style/TextAppearance.Large"
        android:text= "If he's so smart, how come he's dead?"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:gravity="center_vertical"
        android:layout_height="wrap_content"/>
</LinearLayout>

circle.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">
    <solid
        android:color="#0000FF"/>
</shape>

4 个答案:

答案 0 :(得分:1)

我通过创建自定义ImageView解决了这个问题。基本上,如果宽度和高度不同,此ImageView将宽度设置为高度。

使用这种方式,圆形绘图不需要<Size>

public class SquareImageView extends ImageView
{
    public SquareImageView(Context context)
    {
        super(context);
    }

    public SquareImageView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom)
    {
        int width = right - left;
        int height = bottom - top;
        if(width!=height)
        {
            post(new Runnable()
            {
                @Override
                public void run()
                {
                    setMinimumWidth(height);
                }
            });
        }
    }
}

答案 1 :(得分:0)

尝试下面..

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<LinearLayout
    android:id="@+id/ll"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scaleType="fitXY"
        android:src="@drawable/circle" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:scaleType="fitXY"
        android:src="@drawable/circle" />
</LinearLayout>

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@+id/ll"
    android:layout_centerVertical="true"
    android:text="If he&apos;s so smart, how come he&apos;s dead?"
    android:textAppearance="@android:style/TextAppearance.Large" />

和circle.xml

<?xml version="1.0" encoding="utf-8"?>

<solid android:color="#0000FF" />

<stroke
    android:width="2dp"
    android:color="#fff" />

<size
    android:height="80dp"
    android:width="80dp" />

答案 2 :(得分:0)

以下布局部分解决了您的问题。要完成它,您希望在运行时(以编程方式)获取layout_height的确切值,并将LinearLayout的layout_width(将替换硬编码值100dp)设置为layout_height值的一半。

<?xml version="1.0" encoding="utf-8"?>

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:numColumns="2"
    android:columnCount="2"
    >

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="match_parent"
    android:weightSum="2"
    android:orientation="vertical"
    android:layout_column="0"
    android:layout_row="0"
    >

    <ImageView
        android:src="@drawable/circle"
        android:scaleType="fitXY"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

    <ImageView
        android:src="@drawable/circle"
        android:scaleType="fitXY"
        android:layout_weight="1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>

<TextView
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:text= "If he's so smart, how come he's dead?"
    android:layout_column="1"
    android:layout_row="0"
    android:gravity="center_vertical"
    />

答案 3 :(得分:0)

将圈子更改为此。它应该有效。

 <?xml version="1.0" encoding="utf-8"?>
 <shape
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:shape="oval">
      <solid
          android:color="#0000FF"/>
      <size
        android:height="someHeight in dp"
        android:width="sameWidth in dp" />
 </shape>