0dp的使用
app:layout_constrainedWidth="true"
android:layout_width="wrap_content"
android:layout_width="0dp"
效果是一样的,可以自动充满剩余空间
- 例子一
我们上图如上设置,左右margin是无效的,需要加上layout_constrainedWidth,如下图
我们也可以把layout_width设置成0dp,文字长的时候,正常,短的时候,我们希望是居中的,就不对了。
- 例子二
本来想的是,让tv_name在,parent和barrier之间展示,内容长的话,结果就变成上图那样了,完全没达到效果。应该改成layout_width=“0dp”
多控件居中显示
ConstraintLayout 实现多个控件居中显示
ConstraintLayout布局中使用include引用布局,约束属性不起作用
问题:使用约束布局时,再使用include引用布局,造成约束的一些属性没有起作用。
解决方案:重写 android:layout_width、android:layout_height 这两个属性。
margin使用的问题
大家在使用的时候,有没有遇到过margin有时有效有时无效的问题呢?这个其实是和相对谁有关系的。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/bg_color">
<View
android:id="@+id/view_outside_bg"
style="@style/msg_box_top_outside_bg"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<com.sohu.sohuvideo.ui.template.vlayout.view.CircleIconWithIdentityLayout
android:id="@+id/rc_user_container"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="@dimen/dp_18"
android:layout_marginLeft="@dimen/dp_15"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40" />
<LinearLayout
android:id="@+id/right_part"
android:layout_width="0dp"
android:layout_height="wrap_content"
style="@style/msg_box_content_container"
android:orientation="vertical"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rc_user_container"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/rl_content">
<!--顶部-->
<include layout="@layout/layout_feed_msg_user_info" />
<TextView
android:id="@+id/tv_comment_reply_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_8"
android:textColor="#FF1A1A1A"
android:lineSpacingExtra="4dp"
android:textSize="15sp"
tools:text="一个人至少拥我都挖掘的骄傲我的家哇哦就打我至少拥我都挖掘的骄傲我的家哇哦就打我打我的 有一个梦想,有一个理由去坚强。心若没有栖息的地方,到哪里都是在流浪。" />
<ViewStub
android:id="@+id/vs_feed_msg_comment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/layout_feed_msg_comment" />
</LinearLayout>
<RelativeLayout
android:id="@+id/rl_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@drawable/bg_f2f5f7_corner_3"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:paddingRight="8dp"
android:paddingLeft="10dp"
android:layout_marginRight="@dimen/dp_8"
app:layout_constraintBottom_toTopOf="@+id/tv_comment_user_action_time"
app:layout_constraintLeft_toLeftOf="@+id/right_part"
app:layout_constraintRight_toRightOf="parent">
<TextView
android:id="@+id/tv_last_forward_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/fl_icon"
android:includeFontPadding="false"
android:maxLines="2"
android:ellipsize="end"
android:gravity="left"
android:textColor="@color/c_999999"
android:textSize="@dimen/text_size_13" />
<RelativeLayout
android:id="@+id/fl_icon"
android:layout_width="72dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_icon"
android:layout_width="72dp"
android:layout_height="40dp"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@color/c_f2f5f7"
fresco:roundedCornerRadius="3dp" />
<TextView
android:id="@+id/tv_origin_title"
style="@style/msg_box_content"
tools:text="内容已删除" />
<ImageView
android:id="@+id/iv_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:visibility="gone"
android:scaleType="centerCrop"
android:src="@drawable/message_icon_play" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/tv_comment_user_action_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/c_999999"
android:textSize="12sp"
tools:text="1分钟前"
android:layout_marginBottom="@dimen/dp_18"
android:layout_marginTop="@dimen/dp_8"
app:layout_constraintLeft_toLeftOf="@+id/right_part"
app:layout_constraintBottom_toTopOf="@+id/line_bottom"/>
<View
android:id="@+id/line_bottom"
style="@style/common_location_item_divider"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
tv_comment_user_action_time控件设置了marginTop 8dp,当时实际没有效果,但是mrginBottom是有效的。这是因为,tv_comment_user_action_time的约束是在line_bottom的上面,所以,marginBottom有效。tv_comment_user_action_time本身和rl_content没有约束,所以marginTop无效.
ConstraintSet
private void changeLineView(boolean isFold) {
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(viewSubscribeBinding.constraintContainer);
if (isFold) {
constraintSet.connect(R.id.view_line, ConstraintSet.START, R.id.iv_fold, ConstraintSet.START);
} else {
constraintSet.connect(R.id.view_line, ConstraintSet.START, R.id.iv_fold, ConstraintSet.END);
}
constraintSet.applyTo(viewSubscribeBinding.constraintContainer);
}
constraintSet.connect(R.id.view_line, ConstraintSet.START, R.id.iv_fold, ConstraintSet.START)
相当于view_line layout_constraintStart_toStartOf iv_fold
Barrier使用遇到的问题
<?xml version="1.0" encoding="utf-8"?>
<com.sohu.sohuvideo.ui.view.CustomLongClickConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
xmlns:rc="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/bg_color"
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/dp_15">
<RelativeLayout
android:id="@+id/rl_user_container"
android:layout_width="@dimen/dp_45"
android:layout_height="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_18"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
<com.sohu.sohuvideo.ui.template.vlayout.view.RCFramLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="1dp"
rc:top="45dp"
rc:bottom="45dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_user_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/msg_list_item_user"
fresco:placeholderImageScaleType="centerInside"
fresco:roundAsCircle="true" />
</com.sohu.sohuvideo.ui.template.vlayout.view.RCFramLayout>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_user_icon_id"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
fresco:actualImageScaleType="centerCrop" />
</RelativeLayout>
<RelativeLayout
android:id="@+id/rl_user_action_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
android:layout_gravity="center_vertical"
android:layout_marginTop="@dimen/dp_18"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rl_user_container"
app:layout_constraintRight_toLeftOf="@+id/iv_god">
<TextView
android:id="@+id/tv_comment_god_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:textColor="@color/c_999999"
android:textSize="13sp"
tools:text="恭喜!你的评论已被小编评选为‘神评’,继续加油发布更优质的评论吧恭喜!你的评论已被小编评选为‘神评’,继续加油发布更优质的评论吧" />
</RelativeLayout>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_god"
android:layout_width="70dp"
android:layout_height="45dp"
android:layout_centerInParent="true"
android:contentDescription="@null"
fresco:actualImageScaleType="centerCrop"
android:layout_marginLeft="3dp"
fresco:actualImageResource="@drawable/tag_comments_shenping"
fresco:placeholderImageScaleType="centerCrop"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginRight="@dimen/dp_15"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rl_user_action_container" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:barrierDirection="bottom"
app:constraint_referenced_ids="rl_user_action_container, iv_god"/>
<RelativeLayout
android:id="@+id/rl_comment_origin_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="18dp"
android:background="@drawable/shape_msg_box_my_feed_comment_bg"
android:padding="10dp"
android:layout_marginTop="@dimen/dp_6"
android:layout_marginRight="@dimen/dp_8"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/barrier"
app:layout_constraintLeft_toLeftOf="@+id/rl_user_action_container">
<TextView
android:id="@+id/tv_comment_origin_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/c_999999"
android:layout_toLeftOf="@+id/fl_icon"
android:layout_centerVertical="true"
android:maxLines="2"
android:lineSpacingExtra="3dp"
android:ellipsize="end"
android:textSize="13sp"
tools:text="花落知多少:我来不及认真地年轻,待明白过来时,只能选择认真地老去。或许,我们终究会有那么一天:牵着别人的手,遗忘曾经的他。" />
<RelativeLayout
android:id="@+id/fl_icon"
android:layout_width="72dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_icon"
android:layout_width="72dp"
android:layout_height="40dp"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@color/c_e4e7ea"
fresco:roundedCornerRadius="3dp" />
<TextView
android:id="@+id/tv_origin_title"
style="@style/msg_box_content"
tools:text="萌宠~萌宠宠萌的一天" />
<ImageView
android:id="@+id/iv_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="centerCrop"
android:src="@drawable/message_icon_play" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/tv_comment_user_action_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/c_999999"
android:textSize="12sp"
tools:text="1分钟前"
android:layout_marginTop="@dimen/dp_6"
android:layout_marginBottom="@dimen/dp_18"
app:layout_constraintTop_toBottomOf="@+id/rl_comment_origin_content"
app:layout_constraintLeft_toLeftOf="@+id/rl_user_action_container"
app:layout_constraintBottom_toTopOf="@+id/line_bottom"/>
<View
android:id="@+id/line_bottom"
style="@style/common_location_item_divider"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
</com.sohu.sohuvideo.ui.view.CustomLongClickConstraintLayout>
遇到一个奇怪的问题,是Barrier时,文字变成时,Barrier定位的位置总是不对,会导致UI重叠,图片变高就没事。我感觉,是Barrier对文字计算高度支持有问题。
只能换一种解决方案
<?xml version="1.0" encoding="utf-8"?>
<com.sohu.sohuvideo.ui.view.CustomLongClickConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
xmlns:rc="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:background="@color/bg_color"
android:id="@+id/ll_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/dp_15">
<RelativeLayout
android:id="@+id/rl_user_container"
android:layout_width="@dimen/dp_45"
android:layout_height="@dimen/dp_45"
android:layout_marginTop="@dimen/dp_18"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent">
<com.sohu.sohuvideo.ui.template.vlayout.view.RCFramLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="1dp"
rc:top="45dp"
rc:bottom="45dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_user_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/msg_list_item_user"
fresco:placeholderImageScaleType="centerInside"
fresco:roundAsCircle="true" />
</com.sohu.sohuvideo.ui.template.vlayout.view.RCFramLayout>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_user_icon_id"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
fresco:actualImageScaleType="centerCrop" />
</RelativeLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/upLayout"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="@dimen/dp_10"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rl_user_container">
<RelativeLayout
android:id="@+id/rl_user_action_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="@dimen/dp_18"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/iv_god">
<TextView
android:id="@+id/tv_comment_god_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:textColor="@color/c_999999"
android:textSize="13sp"
tools:text="恭喜!你的评论已被小编评选为‘神评’,继续加油发布更优质的评论吧恭喜!你的评论已被小编评选为‘神评’,继续加油发布更优质的评论吧" />
</RelativeLayout>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_god"
android:layout_width="70dp"
android:layout_height="45dp"
android:layout_centerInParent="true"
android:contentDescription="@null"
fresco:actualImageScaleType="centerCrop"
android:layout_marginLeft="3dp"
fresco:actualImageResource="@drawable/tag_comments_shenping"
fresco:placeholderImageScaleType="centerCrop"
android:layout_marginTop="@dimen/dp_8"
android:layout_marginRight="@dimen/dp_15"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@+id/rl_user_action_container"/>
</androidx.constraintlayout.widget.ConstraintLayout>
<RelativeLayout
android:id="@+id/rl_comment_origin_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="18dp"
android:background="@drawable/shape_msg_box_my_feed_comment_bg"
android:padding="10dp"
android:layout_marginTop="@dimen/dp_6"
android:layout_marginRight="@dimen/dp_8"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/upLayout"
app:layout_constraintLeft_toLeftOf="@+id/upLayout">
<TextView
android:id="@+id/tv_comment_origin_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/c_999999"
android:layout_toLeftOf="@+id/fl_icon"
android:layout_centerVertical="true"
android:maxLines="2"
android:lineSpacingExtra="3dp"
android:ellipsize="end"
android:textSize="13sp"
tools:text="花落知多少:我来不及认真地年轻,待明白过来时,只能选择认真地老去。或许,我们终究会有那么一天:牵着别人的手,遗忘曾经的他。" />
<RelativeLayout
android:id="@+id/fl_icon"
android:layout_width="72dp"
android:layout_height="40dp"
android:layout_alignParentRight="true"
android:layout_gravity="center_vertical"
android:layout_marginLeft="8dp">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/iv_icon"
android:layout_width="72dp"
android:layout_height="40dp"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@color/c_e4e7ea"
fresco:roundedCornerRadius="3dp" />
<TextView
android:id="@+id/tv_origin_title"
style="@style/msg_box_content"
tools:text="萌宠~萌宠宠萌的一天" />
<ImageView
android:id="@+id/iv_play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:scaleType="centerCrop"
android:src="@drawable/message_icon_play" />
</RelativeLayout>
</RelativeLayout>
<TextView
android:id="@+id/tv_comment_user_action_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/c_999999"
android:textSize="12sp"
tools:text="1分钟前"
android:layout_marginTop="@dimen/dp_6"
android:layout_marginBottom="@dimen/dp_18"
app:layout_constraintTop_toBottomOf="@+id/rl_comment_origin_content"
app:layout_constraintLeft_toLeftOf="@+id/upLayout"
app:layout_constraintBottom_toTopOf="@+id/line_bottom"/>
<View
android:id="@+id/line_bottom"
style="@style/common_location_item_divider"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
</com.sohu.sohuvideo.ui.view.CustomLongClickConstraintLayout>
ConstrainLayout中使用ViewStub的问题
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ViewStub
android:id="@+id/vs_flat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout="@layout/chat_include_flat_emoji"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/srf"/>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/srf"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/vs_flat">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/conversation_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/dp_15"
android:clipToPadding="false" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<View
android:id="@+id/transparent_mask_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
上面这样写最终运行RecyclerView展示不出来
如图上面修改一下,rv_flat_emoji id是ViewStub实际引用布局的最外层的id。运行后效果对了,可是IDE标红这里也不对。
最后,改成直接不用ViewStub
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_flat_emoji"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout="@layout/chat_include_flat_emoji"
android:paddingBottom="@dimen/dp_7"
android:visibility="gone"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/srf"/>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/srf"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/rv_flat_emoji">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/conversation_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/dp_15"
android:clipToPadding="false" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
<View
android:id="@+id/transparent_mask_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:visibility="gone" />
</androidx.constraintlayout.widget.ConstraintLayout>
参考
约束布局ConstraintLayout看这一篇就够了
哲♂学三幻神带你学习ConstraintLayout(约束布局)
解决ConstraintLayout 与ScrollView 嵌套时ScrollView 内容没有完全显示