У меня есть родитель LinearLayout
с и ребенок LinearLayout
внутри. У ребенка LinearLayout
есть текст внутри него, который может иметь разную длину. Я хотел бы, чтобы ImageView
всегда имел одинаковый размер (200dpx200dp) и уменьшался пропорционально, если текст дочернего LinearLayout переполнен.Использовать maxHeight и массу в то же время
Для этого я использовал layout_weight
и maxHeight
у ребенка ImageView, но из-за макета макс maxHeight не работает. ImageView
не имеет квадратов, когда текст ребенка LinearLayout
не переполняется, а отображается прямоугольником.
Как я мог это сделать?
Это код
<ImageView
android:id="@+id/charImage"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_width="wrap_content"
android:maxWidth="200dp"
android:maxHeight="200dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:scaleType="centerCrop"
android:src="@drawable/jon_snow" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="vertical">
----some childs----
</LinearLayout>
Вот как это должно нравиться, а квадратный ImageView с текстом под, независимо от длины текста.
Я попытался изменить onMeasure() заказного ImageView, но это не изменение размера должным образом, и это занимает часть пространства ребенка LinearLayout и текст перетекает
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int height = Math.min(widthMeasureSpec, Math.min(heightMeasureSpec, dpToPx(200)));
setMeasuredDimension(height, height);
}
private int dpToPx(int dp){
float density = getResources().getDisplayMetrics().density;
return Math.round((float)dp * density);
}
Я попытался переопределить метод onMeasure, и ImageView отображается в квадрате, но если я это сделаю, изменить размер, если текст LinearLayout переполнен. Я использовал этот ответ http://stackoverflow.com/questions/16506275/imageview-be-a-square-with-dynamic-width – Spirrow
Вам понадобится работа onMeasure для обеспечения квадрата. Но вы хотите сделать это немного иначе. Установите ширину и высоту в Math.min (widthMeasureSpec, Math.min (heightMeasureSpec, 200dp)). В основном до допустимой ширины, высоты или 200dp в зависимости от того, что меньше всего. –
Я расскажу вам, если работает, как только я попробую. – Spirrow