我的布局如下:
<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" />
这是片段:
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_view
和right_view
的TextView最初设置为可见性GONE
。向左按钮在展开左侧时必须显示left_view
,但右侧应保持在同一位置。右侧类似,但方向相反。
我该如何实现?我尝试玩LayoutParams
,但没有成功。我想用动画来做到这一点,但这将是下一步。
更新:
例如,如果要单击左按钮,这应该是最终结果:
如您所见,红色矩形的右侧在相同的X坐标中,但是矩形的宽度向左增加。
答案 0 :(得分:1)
如果您需要将目标视图与文本视图锚定,则它们不应位于文本视图的内部(假设您要使用ConstraintLayout
)。文本视图本身也应在布局上具有一定的锚点,以便可以根据其位置进行扩展。
为此,您可以使用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
总是从向导所在视图的左侧进行计算
如上所述,文本视图应与目标视图处于同一级别,因此请从目标视图内部抓取它们并将其放置在根约束布局中的某个位置,以使正确的视图位于正确的准则的右边左视图在左视图的左侧:
<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_width
或layout_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" />
现在,只需将目标视图的左侧和右侧分别与左侧和右侧文本视图的左侧和右侧对齐(以便与两个文本视图的外部边界对齐),并将layout_width
属性设置为{{ 1}},这将使其遵循约束而不是普通值。
0dp
为了获得动画的根布局,请为根布局添加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">
所有步骤之后,布局蓝图应如下所示:
如果您步履维艰,请随时使用here中的完整布局要点。
最终,您的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">
这是一个简短的演示: