Android ConstraintLayout в коде java задать процент сторон ImageView объекта
Всем добрый день. Хочу задать изображению в ImageView размер относительно родительского контейнера в процентах. Но размер картинки не меняется.
ConstraintLayout constraintLayout = new ConstraintLayout(this);
constraintLayout.setId(View.generateViewId());
ConstraintSet set = new ConstraintSet();
ImageView contactUs = new ImageView(this);
contactUs.setImageResource(R.drawable.rezgoriz);
contactUs.setId(View.generateViewId());
constraintLayout.addView(contactUs, 0);
set.clone(constraintLayout);
set.constrainPercentHeight(constraintLayout.getId(), 20);
set.constrainPercentWidth(constraintLayout.getId(), 20);
set.applyTo(constraintLayout);
setContentView(constraintLayout);
Как должно получится в итоге
Если кто знает издание, в котором очень подробно разложено как программировать в ConstraintLayout с хорошими примерами, тоже буду благодарен.
Ответы (1 шт):
Я не совсем понимаю зачем вам это делать в коде если тоже самое можно сделать в XML.
Вы можете добавить
guidelinec параметромapp:layout_constraintGuide_percent. Пример:<androidx.constraintlayout.widget.Guideline android:id="@+id/guideline" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.5"/>
И после этого использовать этот guideline как привязку для других View.
Вы можете использовать параметр
app:layout_constraintHorizontal_biasи/илиapp:layout_constraintVertical_biasдля изменения размеров вашейView.<Button ... app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintHorizontal_bias="0.25" ... />Другой способ установить размер в процентах это использовать параметры
app:layout_constraintHeight_percentи/илиapp:layout_constraintWidth_percent<Button ... android:layout_width="0dp" app:layout_constraintWidth_percent="0.5" ... />
UPD
Исходя из вашего кода, я вижу что у вас получается изменить размер самой. View, но проблема состоит в том, что само изображение не меняется. Вам необходимо уведомить систему что ваша View изменилась.
Каждый класс, производный от класса View, имеет метод invalidate() и postInvalidate(). При вызове invalidate() он сообщает системе, что текущая View изменилась, и ее следует перерисовать как можно скорее. Поскольку этот метод может быть вызван только из вашего UI Thread, необходим другой метод, если вы не на UI Thread и все еще хотите уведомить систему, что ваша View была изменена. Метод postInvalidate() уведомляет систему из не-UI Thread, и View перерисуется при следующем цикле событий в UI Thread.
При вызове invalidate() ваша View перерисуется заново и тем самым перерисут вашу картинку в нужном размере.
UPD2
Это метод из документации.
@Override
public void invalidateDrawable(@NonNull Drawable dr) {
if (dr == mDrawable) {
if (dr != null) {
// update cached drawable dimensions if they've changed
final int w = dr.getIntrinsicWidth();
final int h = dr.getIntrinsicHeight();
if (w != mDrawableWidth || h != mDrawableHeight) {
mDrawableWidth = w;
mDrawableHeight = h;
// updates the matrix, which is dependent on the bounds
configureBounds();
}
}
/* we invalidate the whole view in this case because it's very
* hard to know where the drawable actually is. This is made
* complicated because of the offsets and transformations that
* can be applied. In theory we could get the drawable's bounds
* and run them through the transformation and offsets, but this
* is probably not worth the effort.
*/
invalidate();
} else {
super.invalidateDrawable(dr);
}
}
