Как частично тонировать изображение android просмотр изображения - PullRequest
0 голосов
/ 28 мая 2020

i wanna tint my image same like that only a little bit from bottom

Я не предоставил никакого кода, потому что не знаю, как это реализовать. Я хочу частично подкрасить свое изображение в android java другим цветом внизу, как на картинке. Пожалуйста помоги.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вы делаете это с помощью FrameLayout (Frame Layout помогает размещать макеты один над другим). Сначала поместите внутри фрейма Layout, поместите ImageView, а затем обычный View с фоном как gradient_transparent_black. xml (Итак, в основном вид находится над ImageView).

Ниже приведен пример: (Вы Вы можете сделать высоту просмотра любой, какой хотите. У меня здесь 80dp. Также в моем примере FrameLayout находится внутри ConstraintLayout)

<FrameLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toOf="@+id/imageView3"
    app:layout_constraintTop_toTopOf="parent">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@drawable/image_you_want" />

    <View
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:layout_gravity="bottom"
        android:background="@drawable/gradient_transparent_black"
        android:clickable="false" />

</FrameLayout>

gradient_transparent_black. xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
    android:startColor="#000000"
    android:endColor="#00FFFFFF"
    android:angle="90"
    android:dither="true"
    />
</shape>
1 голос
/ 28 мая 2020

Сначала создайте файл градиента 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);

...