【问题标题】:Swipe left or right on ScrollView in Kotlin在 Kotlin 的 ScrollView 上向左或向右滑动
【发布时间】:2021-01-27 17:43:14
【问题描述】:

我在 Kotlin 上使用通向活动的菜单编写应用程序,然后在活动内,您可以向右或向左滑动以“导航”到下一个活动(基于菜单)大多数活动是 LinearLayout 以显示 Imageview 但我有两个 Activity 在 ScrollView 中包含两个或三个 Imageview,我的问题是由于 ScrollView 我无法检测到滑动并且无法摆脱它。

我尝试了“requestDisallowInterceptTouchEvent(true)”方法,但没有任何反应。这是我的 LinearLayout 活动代码:

class Felicitaciones : AppCompatActivity(), GestureDetector.OnGestureListener {

    lateinit var gestureDetector: GestureDetector
    var x2:Float = 0.0f
    var x1:Float = 0.0f

    companion object{
        const val MIN_DISTANCE = 150
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_felicitaciones)

        gestureDetector = GestureDetector(this,this)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {

        gestureDetector.onTouchEvent(event)

        when (event?.action){
            //cuando empieza el swipe
            0 ->
            {
                x1 = event.x
            }
            //cuando termina el swipe
            1 ->
            {
                x2 = event.x

                val valueX:Float = x2-x1

                if(abs(valueX) > MIN_DISTANCE){
                    //detectar swipe hacia la derecha <=
                    if(x2 > x1){
                        val intent = Intent(this,  Codigo::class.java)
                        startActivity(intent)
                    }
                    //detectar swipe hacia la izquierda =>
                    else{
                        val intent = Intent(this,  Esterilizacion::class.java)
                        startActivity(intent)
                    }
                }
            }
        }
        return super.onTouchEvent(event)

    }
    override fun onDown(e: MotionEvent?): Boolean {
        //TODO("Not yet implemented")
        return false;
    }
    override fun onShowPress(e: MotionEvent?) {
        //TODO("Not yet implemented")
    }
    override fun onSingleTapUp(e: MotionEvent?): Boolean {
        //TODO("Not yet implemented")
        return false
    }
    override fun onScroll(
        e1: MotionEvent?,
        e2: MotionEvent?,
        distanceX: Float,
        distanceY: Float
    ): Boolean {
        //TODO("Not yet implemented")
        return false
    }
    override fun onLongPress(e: MotionEvent?) {
        //TODO("Not yet implemented")
    }
    override fun onFling(
        e1: MotionEvent?,
        e2: MotionEvent?,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        //TODO("Not yet implemented")
        return false
    }
}

这是布局(上面的xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#3AA9B0">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/vista_felicitaciones_img"
        android:scaleType="fitXY">

    </ImageView>

</androidx.constraintlayout.widget.ConstraintLayout>

这是有问题的班级:

    class Codigo : AppCompatActivity(), GestureDetector.OnGestureListener {

    lateinit var gestureDetector: GestureDetector
    var x2:Float = 0.0f
    var x1:Float = 0.0f

    companion object{
        const val MIN_DISTANCE = 150
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_codigo)

        gestureDetector = GestureDetector(this, this)

        val codigoScroll = findViewById<ScrollView>(R.id.codigo_scrollview)
        codigoScroll.requestDisallowInterceptTouchEvent(true)
    }



    override fun onTouchEvent(event: MotionEvent?): Boolean {

        when (event?.action){
            //cuando empieza el swipe
            0 -> {
                x1 = event.x
            }
            //cuando termina el swipe
            1 -> {
                x2 = event.x

                val valueX: Float = x2 - x1

                if (abs(valueX) > MIN_DISTANCE) {
                    //detectar swipe hacia la derecha <=
                    if (x2 > x1) {
                        val intent = Intent(this, Comite::class.java)
                        startActivity(intent)
                    }
                    //detectar swipe hacia la izquierda =>
                    else {
                        val intent = Intent(this, Felicitaciones::class.java)
                        startActivity(intent)
                    }
                }
            }
        }
        return super.onTouchEvent(event)

    }

    override fun onDown(e: MotionEvent?): Boolean {
        //TODO("Not yet implemented")
        return false;
    }
    override fun onShowPress(e: MotionEvent?) {
        //TODO("Not yet implemented")
    }
    override fun onSingleTapUp(e: MotionEvent?): Boolean {
        //TODO("Not yet implemented")
        return false
    }
    override fun onScroll(
        e1: MotionEvent?,
        e2: MotionEvent?,
        distanceX: Float,
        distanceY: Float
    ): Boolean {
        //TODO("Not yet implemented")
        return false
    }
    override fun onLongPress(e: MotionEvent?) {
        //TODO("Not yet implemented")
    }
    override fun onFling(
        e1: MotionEvent?,
        e2: MotionEvent?,
        velocityX: Float,
        velocityY: Float
    ): Boolean {
        //TODO("Not yet implemented")
        return false
    }
}

和布局:

<?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"
    android:background="#3AA9B0">

    <ScrollView
        android:id="@+id/codigo_scrollview"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitStart"
                android:cropToPadding="false"
                android:adjustViewBounds="true"
                android:src="@drawable/vista_codigo_img">
            </ImageView>
            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitStart"
                android:cropToPadding="false"
                android:adjustViewBounds="true"
                android:src="@drawable/vista_codigo_2_img">
            </ImageView>
        </LinearLayout>
    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

提前谢谢你

【问题讨论】:

    标签: android kotlin scrollview touch swipe


    【解决方案1】:

    我终于通过覆盖它使用“dispatchTouchEvent(ev: MotionEvent?)”方法解决了它,由于某种原因,该方法在 API 19 中不可用,当我将项目更改为 API 21 时,该方法能够使用没有任何问题,最后我不得不修改方法并实现如下:

        override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
            super.dispatchTouchEvent(ev)
            //return gestureScanner.onTouchEvent(ev);
            when (ev?.action){
                0 -> { x1 = ev.x }
                1 -> { x2 = ev.x
                    val valueX:Float = x2-x1
                    if(abs(valueX) > MIN_DISTANCE){
                        //detectar swipe hacia la derecha =>
                        if(x2 > x1){
                            val intent = Intent(this,  Comite::class.java)
                            startActivity(intent)
                            overridePendingTransition(R.anim.slide_from_left, R.anim.slide_to_right)
                        }
                        //detectar swipe hacia la izquierda <=
                        else{
                            val intent = Intent(this,  Felicitaciones::class.java)
                            startActivity(intent)
                            overridePendingTransition(R.anim.slide_from_right, R.anim.slide_to_left)
                        }
                    }
                }
            }
            return gestureDetector.onTouchEvent(ev)
        }
    

    谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多