Проверьте, анимируется ли вид - PullRequest
0 голосов
/ 07 июня 2019

У меня есть функция расширения, чтобы заставить любой вид делать «масштабную анимацию» при нажатии, но эта функция не проверяет, является ли вид анимационным.Из-за этого, когда пользователь нажимает много раз (и представление не завершило анимацию), представление масштабируется и увеличивает исходный размер представления ...

Мне нужно предотвратить это.Может быть, проверка того, является ли изображение анимируемым и анимируемым, только когда оно не анимируется

fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
    this.setOnClickListener { v ->
        v.animate()
            .scaleXBy(0.1f)
            .scaleYBy(0.1f)
            .setDuration(80)
            .withEndAction {
                v.animate()
                    .scaleXBy(-0.1f)
                    .scaleYBy(-0.1f)
                    .duration = 80
            }

        block(this)
    }
}

Ответы [ 3 ]

1 голос
/ 11 июня 2019

Когда представление щелкают, отключите его «возможность щелчка» перед началом анимации.В конце всех анимаций восстановите возможность щелкнуть мышью по представлению.Это, по сути, отключает слушателя во время анимации без необходимости его удаления.

fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
    this.setOnClickListener { v ->
        v.animate()
            .scaleXBy(0.1f)
            .scaleYBy(0.1f)
            .setDuration(80)
            .withStartAction { v.isClickable = false }
            .withEndAction {
                v.animate()
                    .scaleXBy(-0.1f)
                    .scaleYBy(-0.1f)
                    .setDuration(80)
                    .withEndAction { v.isClickable = true }
            }
        block(this)
    }
}   
1 голос
/ 07 июня 2019

Вы можете просто отменить текущую анимацию.Это не работает, если анимация не выполняется:

fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
    this.setOnClickListener { v ->
        v.animate().cancel()
        v.animate()
            .scaleXBy(0.1f)
            .scaleYBy(0.1f)
            .setDuration(80)
            .withEndAction {
                v.animate()
                    .scaleXBy(-0.1f)
                    .scaleYBy(-0.1f)
                    .duration = 80
            }

        block(this)
    }
}

Редактировать: вы можете отключить вид во время анимации, это решит вашу проблему?

this.setOnClickListener { v ->
    v.isEnabled = false
    v.animate()
            .scaleXBy(0.1f)
            .scaleYBy(0.1f)
            .setDuration(80)
            .withEndAction {
                v.animate()
                        .scaleXBy(-0.1f)
                        .scaleYBy(-0.1f)
                        .setDuration(80)
                        .withEndAction { v.isEnabled = true }
            }

    block(this)
}
0 голосов
/ 11 июня 2019

Спасибо @Ceticamp за подсказку.Просто установить isClickable недостаточно, потому что если пользователь нажимает много раз быстро, представление продолжает увеличиваться.Я решил просто заменить scaleXBy на scaleX/scaleY, scaleX/scaleY установить X/Y на X/Y значение и scaleXBy/scaleYBy увеличить X/Y на определенное значение.

fun View.setOnClickWithScaleAnimListener(block: View.() -> Unit) {
    this.setOnClickListener { v ->
        v.animate()
            .scaleX(1.1f)
            .scaleY(1.1f)
            .setDuration(80)
            .withEndAction {
                v.animate()
                    .scaleX(1f)
                    .scaleY(1f)
                    .duration = 80
                isClickable = true

            }
            .withStartAction {
                isClickable = false
            }

        block(this)
    }
}

setisClickable не требуется, но если вам нужно запретить пользователю «отменять» масштабную анимацию, тогда необходимо установить isClickable

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...