【问题标题】:Automatic adjustment of framelayout自动调整框架布局
【发布时间】:2015-03-24 00:46:09
【问题描述】:

我需要这样做:

此应用程序的用户界面有一个区域包含多个彩色矩形,另一个区域包含一个 SeekBar。当用户拖动 SeekBar 时,矩形逐渐改变颜色。

我正在使用框架布局(我不知道是否有更好的东西),但我硬编码了每个框架布局的大小,当然,这是一个坏主意。 如何调整框架布局并保持关系?

这是我的activity_main.xml:

<RelativeLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:background="@color/black">

    <SeekBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/seekBar"
        android:indeterminate="false"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

    <FrameLayout
        android:id="@+id/first_block"
        android:layout_width="150dp"
        android:layout_height="240dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="false"></FrameLayout>

    <FrameLayout
        android:id="@+id/first_block_b"
        android:layout_width="150dp"
        android:layout_height="240dp"
        android:layout_above="@+id/seekBar"
        android:layout_below="@id/first_block"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="5dp"></FrameLayout>

    <FrameLayout
        android:id="@+id/second_block"
        android:layout_width="190dp"
        android:layout_height="165dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"></FrameLayout>

    <FrameLayout
        android:id="@+id/med_block"
        android:layout_width="190dp"
        android:layout_height="165dp"
        android:layout_alignParentTop="false"
        android:layout_alignParentRight="true"
        android:layout_below="@id/second_block"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="5dp"></FrameLayout>

    <FrameLayout
        android:id="@+id/last_block"
        android:layout_width="190dp"
        android:layout_height="165dp"
        android:layout_alignParentTop="false"
        android:layout_alignParentRight="true"
        android:layout_below="@id/med_block"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="5dp"></FrameLayout>

</RelativeLayout>

感谢您的帮助!

【问题讨论】:

    标签: android android-layout android-activity android-studio


    【解决方案1】:

    试试

    <?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="match_parent"
    android:orientation="vertical">
    
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent">
    
            <FrameLayout
                android:id="@+id/first_block"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    
            <FrameLayout
                android:id="@+id/first_block_b"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    
        </LinearLayout>
    
        <LinearLayout
            android:orientation="vertical"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent">
    
            <FrameLayout
                android:id="@+id/second_block"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    
            <FrameLayout
                android:id="@+id/med_block"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    
            <FrameLayout
                android:id="@+id/last_block"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"/>
    
        </LinearLayout>
    
    </LinearLayout>
    
    <SeekBar
        android:id="@+id/seekBar"
        android:indeterminate="false"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    上面使用嵌套权重,这有时对性能不利,但考虑到您正在尝试做的事情,这是最好的选择,而不是在代码中计算它们。

    【讨论】:

    • 工作正常!谢谢你。就性能而言,最佳选择是什么?
    • 您所拥有的可能是最容易管理的。您还可以通过覆盖 onDraw()(不简单)或覆盖自定义容器的 onSizeChanged() 在代码中进行计算并绘制到画布,然后自己重​​新布局视图进行基本数学运算。在您对框架有更好的了解之前,我会坚持使用上述内容。