向左和向右增加视图宽度

时间:2018-11-22 17:45:39

标签: android view android-constraintlayout

我的布局如下:

<android.support.constraint.ConstraintLayout
    android:id="@+id/target"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:layout_marginEnd="8dp"
    android:layout_marginBottom="8dp"
    android:background="#FF0000"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:gravity="center"
        android:text="Hello"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/left_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="LEFT VIEW"
        android:visibility="gone"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/right_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="RIGHT VIEW"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

<Button
    android:id="@+id/left_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:text="LEFT"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toStartOf="@+id/right_btn"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/target" />

<Button
    android:id="@+id/right_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="8dp"
    android:layout_marginBottom="8dp"
    android:text="RIGHT"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toEndOf="@+id/left_btn"
    app:layout_constraintTop_toBottomOf="@+id/target" />

导致的结果: result_layout

这是片段:

public class IncreaseWidthLeftRightFragment extends Fragment {
    private IncreaseWidthLeftRightViewModel mViewModel;
    private TextView mRightView;
    private Button mLeftBtn;
    private Button mRightBtn;
    private TextView mLeftView;
    private ConstraintLayout mTarget;

    public static IncreaseWidthLeftRightFragment newInstance() {
        return new IncreaseWidthLeftRightFragment();
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.increase_width_left_right_fragment, container, false);
        mRightView = v.findViewById(R.id.right_view);
        mLeftBtn = v.findViewById(R.id.left_btn);
        mLeftBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showLeftText();
            }
        });
        mRightBtn = v.findViewById(R.id.right_btn);
        mRightBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showRightText();
            }
        });
        mLeftView = v.findViewById(R.id.left_view);
        mTarget = v.findViewById(R.id.target);
        return v;
    }

    private void showLeftText() {
        // increase the left side of the target container
        // ...
        mLeftView.setVisibility(View.VISIBLE);
    }

    private void showRightText() {
        // increase the right side of the target container
        // ...
        mRightView.setVisibility(View.VISIBLE);
    }
}

left_viewright_view的TextView最初设置为可见性GONE。向左按钮在展开左侧时必须显示left_view,但右侧应保持在同一位置。右侧类似,但方向相反。

我该如何实现?我尝试玩LayoutParams,但没有成功。我想用动画来做到这一点,但这将是下一步。

更新:

例如,如果要单击左按钮,这应该是最终结果:

end_result

如您所见,红色矩形的右侧在相同的X坐标中,但是矩形的宽度向左增加。

1 个答案:

答案 0 :(得分:1)

如果您需要将目标视图与文本视图锚定,则它们不应位于文本视图的内部(假设您要使用ConstraintLayout)。文本视图本身也应在布局上具有一定的锚点,以便可以根据其位置进行扩展。

1)添加准则

为此,您可以使用constraint guidelines。例如。如果您希望文本视图(因此是目标视图)从根屏幕的左边缘和右边缘扩大32%,则可以添加以下准则(它们应与按钮/目标视图处于相同的层次结构):

<android.support.constraint.Guideline
    android:id="@+id/left_guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.32" />

<android.support.constraint.Guideline
    android:id="@+id/right_guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.68" />

P.S。 layout_constraintGuide_percent总是从向导所在视图的左侧进行计算

2)对齐文本视图

如上所述,文本视图应与目标视图处于同一级别,因此请从目标视图内部抓取它们并将其放置在根约束布局中的某个位置,以使正确的视图位于正确的准则的右边左视图在左视图的左侧:

<TextView
    android:id="@+id/left_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:text="LEFT VIEW"
    app:layout_constraintEnd_toStartOf="@+id/left_guideline" />

<TextView
    android:id="@+id/right_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="RIGHT VIEW"
    app:layout_constraintStart_toStartOf="@+id/right_guideline" />

我们还需要为视图设置垂直约束,并感觉它们在目标视图内。为此,我们需要将两个文本视图的顶部与目标视图的顶部对齐。除此之外,文本视图的初始状态应为“折叠”状态(因此它们是隐藏的),很遗憾,我不知道如何使它们的宽度为0dp,因为layout_widthlayout_height使约束布局认为视图仅符合约束,而不使用其自身的大小。作为快速解决方法,我们将宽度设置为1px。为了防止文本视图垂直延伸,我还想将singleLine的属性设置为true

<TextView
    android:id="@+id/left_view"
    android:singleLine="true"
    android:layout_width="1px"
    android:layout_height="wrap_content"
    android:text="LEFT VIEW"
    app:layout_constraintEnd_toStartOf="@+id/left_guideline"
    app:layout_constraintTop_toTopOf="@+id/target" />

<TextView
    android:id="@+id/right_view"
    android:singleLine="true"
    android:layout_width="1px"
    android:layout_height="wrap_content"
    android:text="RIGHT VIEW"
    app:layout_constraintStart_toStartOf="@+id/right_guideline"
    app:layout_constraintTop_toTopOf="@+id/target" />

3)对齐目标视图

现在,只需将目标视图的左侧和右侧分别与左侧和右侧文本视图的左侧和右侧对齐(以便与两个文本视图的外部边界对齐),并将layout_width属性设置为{{ 1}},这将使其遵循约束而不是普通值。

0dp

4)添加根布局ID

为了获得动画的根布局,请为根布局添加ID:

<android.support.constraint.ConstraintLayout
    android:id="@+id/target"
    android:layout_width="0dp"
    android:layout_height="200dp"
    android:background="#FF0000"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="@+id/right_view"
    app:layout_constraintStart_toStartOf="@+id/left_view"
    app:layout_constraintTop_toTopOf="parent">

所有步骤之后,布局蓝图应如下所示:

Layout blueprint

如果您步履维艰,请随时使用here中的完整布局要点。

5)动画扩展

最终,您的show方法应如下所示:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

这是一个简短的演示:

Animation