Android Kotlin开发:如何为TextView添加触摸事件获取触摸坐标
为TextView绑定触摸事件实现滑动调整数值实现方案
核心实现思路
- 无需依赖自定义控件,直接给原生TextView绑定
View.OnTouchListener即可监听所有触摸动作(按下、滑动、抬起等),替代仅能响应单次点击的OnClickListener - 触摸逻辑中通过记录按下时的坐标和初始数值,滑动时根据位移差计算数值调整量,最终将数值限制在1~270的范围内再更新到TextView展示
代码示例
Kotlin 实现
// 全局/类成员变量 private var currentValue = 1 // 初始数值,可自定义 private var downY = 0f private var downValue = 0 private val sensitivity = 20 // 滑动灵敏度,数值越小滑动同样距离调整的数值越大,可自定义 // 绑定触摸事件到你的TextView targetTextView.setOnTouchListener { v, event -> when (event.action) { MotionEvent.ACTION_DOWN -> { // 按下时记录初始坐标和当前数值 downY = event.rawY downValue = currentValue true // 消费按下事件,后续动作才会分发到当前Listener } MotionEvent.ACTION_MOVE -> { // 计算Y轴位移差,向上滑数值增加,向下滑数值减少,可自行调整加减逻辑 val offsetY = downY - event.rawY val deltaValue = (offsetY / sensitivity).toInt() // 计算新数值并限制在1~270区间内 val newValue = (downValue + deltaValue).coerceAtLeast(1).coerceAtMost(270) if (newValue != currentValue) { currentValue = newValue // 更新TextView展示 targetTextView.text = currentValue.toString() } true } // 若需要保留点击事件,可在此处添加ACTION_UP逻辑,判断滑动距离小于阈值则触发点击逻辑 else -> false } }
Java 实现
// 类成员变量 private int currentValue = 1; private float downY = 0f; private int downValue = 0; private final int sensitivity = 20; // 绑定触摸事件 targetTextView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: downY = event.getRawY(); downValue = currentValue; return true; case MotionEvent.ACTION_MOVE: float offsetY = downY - event.getRawY(); int deltaValue = (int) (offsetY / sensitivity); int newValue = Math.max(1, Math.min(270, downValue + deltaValue)); if (newValue != currentValue) { currentValue = newValue; targetTextView.setText(String.valueOf(currentValue)); } return true; } return false; } });
可选优化项
- 可根据需求调整为X轴滑动调整数值,只需将代码中的Y坐标替换为X坐标即可
- 如需修改数值调整方向,将位移差的计算逻辑颠倒即可
- 若需要支持快速滑动时数值变化更快,可给位移差添加非线性换算逻辑
内容的提问来源于stack exchange,提问作者Guilherme Nunes
相关产品推荐
相关产品推荐

