如何将TextView始终固定在CameraX预览区域底部左侧
问题根因
原有布局存在两处配置缺陷,导致TextView无法跟随预览区域变动:
- PreviewView 未配置底部对齐父容器的约束,切换宽高比时自身垂直位置会出现偏移
- TextView 缺少和PreviewView起始边的对齐约束,无法完整绑定到PreviewView的边界上
修复后完整布局代码
<?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.activities.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/root" android:background="@color/black" tools:context=".ui.activities.MainActivity"> <FrameLayout android:id="@+id/main_frame" android:layout_height="match_parent" android:layout_width="match_parent" android:paddingTop="8dp"> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/preview_container" android:layout_height="match_parent" android:layout_width="match_parent"> <androidx.camera.view.PreviewView android:id="@+id/preview" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintDimensionRatio="H,9:16" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" app:layout_constraintBottom_toBottomOf="@id/preview" app:layout_constraintStart_toStartOf="@id/preview" android:textColor="#ffffffff" android:text="Text Test" /> </androidx.constraintlayout.widget.ConstraintLayout> </FrameLayout> </RelativeLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
关键修改说明
- 为PreviewView补充
app:layout_constraintBottom_toBottomOf="parent"约束,确保切换宽高比时,PreviewView始终在容器内垂直居中,位置不会发生偏移 - 为TextView补充
app:layout_constraintStart_toStartOf="@id/preview"约束,固定对齐预览区域左侧,配合已有的底部对齐约束,宽高比切换时会自动跟随PreviewView的位置变动 - 可通过修改
android:layout_margin属性调整TextView和预览区域边缘的间距,支持单独设置layout_marginBottom、layout_marginStart自定义边距
补充说明:如果PreviewView使用默认的
fitCenter缩放模式,切换比例后实际相机画面和控件边缘会出现黑边,此时布局会对齐PreviewView控件底部而非实际画面底部。需要对齐实际画面底部的话,为PreviewView添加app:scaleType="fillCenter"属性,让相机画面充满整个PreviewView控件即可。代码中动态切换预览宽高比时,只需要更新PreviewView的
layout_constraintDimensionRatio参数值后请求重新布局,不需要额外修改TextView的约束规则。
内容的提问来源于stack exchange,提问作者user19294343
相关产品推荐
相关产品推荐

