onFling for swipe отлично работает в эмуляторе, но не в устройстве - PullRequest
0 голосов
/ 28 февраля 2019

Я реализую события пролистывания влево / вправо на нескольких элементах управления в деятельности (MPAndroidChart и WebView).Я использую решение в Kotlin, изложенное здесь:

https://stackoverflow.com/a/53791260/2201814

Решение отлично работает в эмуляторе, но когда я запускаю его на устройстве, обратный вызов onFling не вызывается последовательно.Размах должен быть супер ярко выраженным, и это в принципе не работает.В эмуляторе он работает легко и последовательно.

Есть идеи о том, что происходит?

Класс слушателя:

open class OnSwipeTouchListener(ctx: Context) : OnTouchListener {

private val gestureDetector: GestureDetector

companion object {

    private val SWIPE_THRESHOLD = 20
    private val SWIPE_VELOCITY_THRESHOLD = 20
}

init {
    gestureDetector = GestureDetector(ctx, GestureListener())
}

override fun onTouch(v: View, event: MotionEvent): Boolean {
    return gestureDetector.onTouchEvent(event)
}

private inner class GestureListener : SimpleOnGestureListener() {

    override fun onDown(e: MotionEvent): Boolean {
        return true
    }

    override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
        var result = false
        try {
            val diffY = e2.y - e1.y
            val diffX = e2.x - e1.x
            if (Math.abs(diffX) > Math.abs(diffY)) {
                if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffX > 0) {
                        onSwipeRight()
                    } else {
                        onSwipeLeft()
                    }
                    result = true
                }
            } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffY > 0) {
                    onSwipeBottom()
                } else {
                    onSwipeTop()
                }
                result = true
            }
        } catch (exception: Exception) {
            exception.printStackTrace()
        }

        return result
    }


}

open fun onSwipeRight() {}

open fun onSwipeLeft() {}

open fun onSwipeTop() {}

open fun onSwipeBottom() {}

}

Пример деятельности:

    private fun insightSwiping() {
    webview?.let {
        it.setOnTouchListener(object : OnSwipeTouchListener(applicationContext) {
            override fun onSwipeLeft() {
                insights?.let {
                    val count = it.size
                    if (insightPageControl.selection == count-1 ) {
                        insightPageControl.selection = 0
                    } else {
                        insightPageControl.selection += 1
                    }
                    loadInsights(insightPageControl.selection)
                }
                super.onSwipeLeft()
            }

            override fun onSwipeRight() {
                insights?.let {
                    val count = it.size
                    if (insightPageControl.selection == 0 ) {
                        insightPageControl.selection = count-1
                    } else {
                        insightPageControl.selection -= 1
                    }
                    loadInsights(insightPageControl.selection)
                }
                super.onSwipeRight()
            }
        })
    }
}

Одна вещь, которую я заметил, это то, что onDown вызывается с самого начала, но в конце концов отладчик перестает работать, и приложение просто не отвечает, когда находится в режиме отладки.Он продолжает работать при запуске без отладки, но просто не выполняет намеченное поведение ... Любое руководство приветствуется.

С уважением, Майк

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