我横向定位LinearLayout
,其中ImageView
和TextView
(左边的图片,右边的文字)。我想将TextView
的第一行(即使它有多行)与ImageView
的中心对齐。我怎样才能做到这一点?
我当前的代码,它以整个TextView
为中心,而不仅仅是第一行:
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_distance" />
<TextView
android:duplicateParentState="true"
android:gravity="center_vertical"
style="@style/taskAddressText"
android:id="@+id/task_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
答案 0 :(得分:1)
您可以通过在运行时获取ImageView的高度将TextView的第一行设置为ImageView的中心,并将该高度除以2以获取ImageView的中心,然后将上边距或填充设置为TextView,如下所示:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/icon_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:background="@color/colorPrimary"
android:src="@mipmap/ic_launcher" />
<TextView
android:id="@+id/task_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="sample address "/>
</LinearLayout>
初始化视图并在运行时从ImageView高度设置TextView Top padding
iconDistance = (ImageView) findViewById(R.id.icon_distance);
taskAddress = (TextView) findViewById(R.id.task_address);
ViewTreeObserver vto = iconDistance.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
iconDistance.getViewTreeObserver().removeOnPreDrawListener(this);
int finalHeight = iconDistance.getMeasuredHeight();
taskAddress.setPadding(0,(convertPixelsToDp(finalHeight)/2),0,0);
return true;
}
});
将像素转换为dp
public int convertPixelsToDp(int px){
DisplayMetrics metrics = getResources().getDisplayMetrics();
return (int) (px / ((float)metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT));
}
答案 1 :(得分:0)
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical">
<ImageView
android:id="@+id/icon_distance"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon_distance" />
<TextView
android:duplicateParentState="true"
android:gravity="center_vertical"
style="@style/taskAddressText"
android:id="@+id/task_address"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
答案 2 :(得分:0)
您可以设置文本视图的上边距=图像视图大小的一半,然后它将始终从图像视图的中心开始。
Text View Top Margin = Image view Height /2
答案 3 :(得分:0)
代替使用constraintLayout,创建一个不包含文本的不可见TextView,以确保它始终是一行。然后将不可见的文本视图对齐到实际文本视图的顶部和开始。
然后将imageview限制为不可见的textview。