Сначала создайте файл градиента xml в папке с возможностью рисования:
<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle"
xmlns:android="http://schemas.android.com/apk/res/android">
<gradient android:startColor="#000" android:angle="90"/>
</shape>
Для API 23 и выше:
В вашем макете, где ImageView определяется просто добавьте атрибут android:foreground = "@drawable/gradient"
. Это просто накладывает градиент поверх ImageView.
Просто, но не рекомендуется
Вы можете просто добавить еще один ImageView поверх того, который отображает изображение. Тогда ImageView, расположенный сверху, установил бы набор атрибутов android:src = "@drawable/gradient"
. Это действительно работает, но я бы не советовал. Да, это просто, но использование ViewOverlay (как мы увидим в следующем решении) более эффективно.
В противном случае
Здесь становится немного сложнее. Прежде всего, вы должны зарегистрировать ViewTreeObserver с помощью addOnGlobalLayoutListener и реализовать метод OnGlobalLayout. Затем вы просто получаете градиент, доступный для рисования, и применяете границы ImageView (который будет его родительским элементом). В конце просто установите drawable как ViewOverlay для ImageView.
Честно говоря, сначала я думал, что этого будет достаточно, чтобы написать это, но я понимаю, что это действительно сложно. Итак, вот его версия уродливая Kotlin:
ivImage.viewTreeObserver.addOnGlobalLayoutListener {
val drawable = resources.getDrawable(R.drawable.gradient).apply {
bounds = Rect(0, 0, ivImage.width, ivImage.height)
}
ivImage.overlay.add(drawable)
}
Это будет версия Java (тоже не красивый код):
imageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Drawable drawable = ContextCompat.getDrawable(context, R.drawable.gradient);
drawable.setBounds(0, 0, imageView.getWidth(), imageView.getHeight());
imageView.getOverlay().add(drawable);
}
});
ВАЖНО: не пытайтесь отменить регистрацию OnGlobalLayoutListener.
Это можно сделать в Java внутри метода onGlobalLayout следующим образом: imageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);