欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android学习笔记-手势识别

程序员文章站 2024-03-24 15:00:52
...

手势识别(Kotlin)

  参考fwens并作出调整
本案例对id为img的ImageView使用手势识别

01 简单使用(使用OnTouchListener)

img.setOnTouchListener(View.OnTouchListener{view,motionEvent ->
    when(motionEvent.action){
        MotionEvent.ACTION_DOWN -> {
            Toast.makeText(this,"按下",Toast.LENGTH_SHORT).show()
        }
        MotionEvent.ACTION_UP -> {
            Toast.makeText(this,"抬起",Toast.LENGTH_SHORT).show()
        }
    }
    return@OnTouchListener true
})

  motionEvent类中的常量:

  • public static final int ACTION_DOWN = 0;按下

  • public static final int ACTION_UP = 1;抬起

  • public static final int ACTION_MOVE = 2;移动

  • public static final int ACTION_CANCEL = 3;取消

判断是向左还是向右

var x1 :Float = 0F
var x2 :Float = 0F
img.setOnTouchListener(View.OnTouchListener{view,motionEvent ->
    when(motionEvent.action){
        MotionEvent.ACTION_DOWN -> {
            x1 = motionEvent.x
        }
        MotionEvent.ACTION_UP -> {
            x2 = motionEvent.x
            if (x1 - x2 > 0)
            {
                Toast.makeText(getApplicationContext(), "正在向左滑动", Toast.LENGTH_SHORT).show();
            }
            else if (x1 - x2 < 0)
            {
                Toast.makeText(getApplicationContext(), "正在向右滑动", Toast.LENGTH_SHORT).show();
            }
        }
    }
    return@OnTouchListener true
})

02 使用手势探测器

自定义监听器

class MyOnTouch(context: Context) : GestureDetector.OnGestureListener {
    var context: Context = context
    //按下时调用
    override fun onDown(motionEvent: MotionEvent): Boolean {
        Toast.makeText(context, "onDown", Toast.LENGTH_SHORT).show()
        return true      
    }
	//按下后未移动未松开时调用
    override fun onShowPress(motionEvent: MotionEvent) {
        Toast.makeText(context, "onShowPress", Toast.LENGTH_SHORT).show()
    }
	//按下后立即抬起时调用
    override fun onSingleTapUp(motionEvent: MotionEvent): Boolean {
        Toast.makeText(context, "onSingleTapUp", Toast.LENGTH_SHORT).show()
        return true
        
    }
    
	//滚动时调用,鼠标滚轮滚动也能触发
    override fun onScroll(
        motionEvent: MotionEvent,
        motionEvent1: MotionEvent,
        v: Float,
        v1: Float
    ): Boolean {
        Toast.makeText(context, "onScroll", Toast.LENGTH_SHORT).show()
        return true   
    }
	//长按时调用
    override fun onLongPress(motionEvent: MotionEvent) {
        Toast.makeText(context, "onLongPress", Toast.LENGTH_SHORT).show()
    }
	//滑动时调用
    override fun onFling(
        motionEvent: MotionEvent,
        motionEvent1: MotionEvent,
        v: Float,
        v1: Float
    ): Boolean {
        Toast.makeText(context, "onFling", Toast.LENGTH_SHORT).show()
        return true
    }
}

对img使用手势探测器

//手势检测器
var gestureDetectorCompat: GestureDetectorCompat = GestureDetectorCompat(this,MyOnTouch(this))

img.setOnTouchListener(View.OnTouchListener{ view, motionEvent->

    return@OnTouchListener gestureDetectorCompat.onTouchEvent(motionEvent);
})

部分参数解释:

motionEvent :第一个按下的触摸,即滑动时手指第一次按下时触发

motionEvent1:第二个MotionEvent参数,为手指滑动后抬起时触发,即滑动完成抬起手指时

v:X轴上的移动速度,像素/秒

v1:Y轴上的移动速度,像素/秒