Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

ImageFilterView

Компонент ImageFilterView является расширенным аналогом ImageView, к которому применимы эффекты ColorMatrix. Находится в разделе Helpers и входит в состав ConstraintLayout v.2.0.


implementation 'androidx.constraintlayout:constraintlayout:2.0.2'

Можно установить эффекты через XML-атрибуты contrast, saturation, warmth.


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.constraintlayout.utils.widget.ImageFilterView
        android:id="@+id/imageFiterView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:srcCompat="@drawable/sleepbedcat"
        app:contrast="1.0"
        app:saturation="2.0"
        app:warmth="1.2" />

</androidx.constraintlayout.widget.ConstraintLayout>

Мы можем менять эффекты динамически через код. Для примера будем менять насыщенность (saturation). Добавим на экран SeekBar и напишем следующее.


// Если этот код работает, его написал Александр Климов,
// а если нет, то не знаю, кто его писал.
package ru.alexanderklimov.samples

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.SeekBar
import androidx.constraintlayout.utils.widget.ImageFilterView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val imageFilterView: ImageFilterView = findViewById(R.id.imageFiterView)
        val seekBar: SeekBar = findViewById(R.id.seekBar)
        seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                val percentage = (progress / 100.0f)
                imageFilterView.saturation = (percentage) + 1
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {    }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {     }
        })
    }
}

На скриншоте представлен результат действия фильтра. Слева без фильтра, справа - с наибольшим значением.

ImageFilterView
Реклама