android 关于获取特定触点坐标

herenke123 2013-10-29 12:16:29
是这样的 我在一个view 里面放一条线例如(y=100) 当我手指从屏幕上划过这条线时(在线上那一瞬间) 我希望触发一个事件 。 就好比一个古筝 上面有很多铉 手指划过会响,而且只响一声。 当手指速度快时 我在view 的 ontouchEvent 里面收到的坐标都是一些不连续的坐标 例如 98.88 、 104.100、105.22.........一些散点..(当然 ontouch 事件也一样) 这样子,划过就不一定能触发y=100 了(当然设置了一个范围 也在不同的速度里可能得不到y=100 而且有时候会有重复的值落到这个范围里面)。真不知道该咋滴,希望大家指点一下.....thx
...全文
252 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
scott7667 2013-11-03
  • 打赏
  • 举报
回复
onFling不行的话用onScroll试过不?
herenke123 2013-10-29
  • 打赏
  • 举报
回复
引用 9 楼 ncepu307 的回复:
你实际写代码测试过吗?
有测试过的哦,....在我的真机上测试的结果,每次比较短的down----up 就会有一行记录输出,分别是down 的y坐标 和up的y坐标 10-29 22:55:30.322: I/------------------------(20050): 267.13834----543.20355 10-29 22:55:35.682: I/------------------------(20050): 226.06522----311.57813 10-29 22:55:36.192: I/------------------------(20050): 241.55182----304.84482 10-29 22:55:36.652: I/------------------------(20050): 224.04523----304.84482 10-29 22:55:37.077: I/------------------------(20050): 236.8385----301.47818 10-29 22:55:37.497: I/------------------------(20050): 238.85849----300.1315 10-29 22:55:37.917: I/------------------------(20050): 242.22516----306.8648 10-29 22:55:38.397: I/------------------------(20050): 236.16519----313.5981 10-29 22:55:38.872: I/------------------------(20050): 215.29196----315.6181 10-29 22:55:39.362: I/------------------------(20050): 184.31879----279.9118
依然绿茶 2013-10-29
  • 打赏
  • 举报
回复
你实际写代码测试过吗?
依然绿茶 2013-10-29
  • 打赏
  • 举报
回复
引用 7 楼 herenke123 的回复:
[quote=引用 6 楼 ncepu307 的回复:] 楼主,建议你换一种方法,采用GestureDetector类监听手指的滑动。
mGestureDetector = new GestureDetector(mContext.getApplicationContext(),
                new DialpadGestureDetector(), null, false);
private class DialpadGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if ((e1.getY()<100 && e2.getY()>100) || (e1.getY()>100 && e2.getY<100)) {
            //ok,手指划过,当然这个if也可能不是这么写,楼主稍微调试一下,应该没问题
            }
            return true
        }
    }
    
    //重写ViewGroup这个方法
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev);
        return false;
    }
嗯,首先谢谢你的推荐,学习了一下,你介绍的这个方法 onFling() 是要在限定的时间内划过一小段距离down-------up 才触发 onfling() 实时性不够,还有当用户手指迟迟未离开触摸屏的话,过了那段限定时间,就不会再触发onfling()了。[/quote] 不是吧?这个没有限定时间,只是有个速度值velocityY,这个值你可以不用管,那么无论怎么划,划多久都没关系。
herenke123 2013-10-29
  • 打赏
  • 举报
回复
引用 6 楼 ncepu307 的回复:
楼主,建议你换一种方法,采用GestureDetector类监听手指的滑动。
mGestureDetector = new GestureDetector(mContext.getApplicationContext(),
                new DialpadGestureDetector(), null, false);
private class DialpadGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if ((e1.getY()<100 && e2.getY()>100) || (e1.getY()>100 && e2.getY<100)) {
            //ok,手指划过,当然这个if也可能不是这么写,楼主稍微调试一下,应该没问题
            }
            return true
        }
    }
    
    //重写ViewGroup这个方法
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev);
        return false;
    }
嗯,首先谢谢你的推荐,学习了一下,你介绍的这个方法 onFling() 是要在限定的时间内划过一小段距离down-------up 才触发 onfling() 实时性不够,还有当用户手指迟迟未离开触摸屏的话,过了那段限定时间,就不会再触发onfling()了。
tantahe 2013-10-29
  • 打赏
  • 举报
回复
单独用View画一条线,width=match_parent,height=2dp,对这个View设置onTouch呢?应该比判断View里的一条线是否onTouch要简单多了。
CuGBabyBeaR 2013-10-29
  • 打赏
  • 举报
回复
在ACTION_MOVE里比较本次事件和上次事件的坐标 如果跨过了弦就响 y0<100<y1 || y0>100>y1 || y1 == 100
依然绿茶 2013-10-29
  • 打赏
  • 举报
回复
楼主,建议你换一种方法,采用GestureDetector类监听手指的滑动。
mGestureDetector = new GestureDetector(mContext.getApplicationContext(),
                new DialpadGestureDetector(), null, false);
private class DialpadGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            if ((e1.getY()<100 && e2.getY()>100) || (e1.getY()>100 && e2.getY<100)) {
            //ok,手指划过,当然这个if也可能不是这么写,楼主稍微调试一下,应该没问题
            }
            return true
        }
    }
    
    //重写ViewGroup这个方法
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        mGestureDetector.onTouchEvent(ev);
        return false;
    }
herenke123 2013-10-29
  • 打赏
  • 举报
回复
其他小伙伴有没有意见啊,希望能解决这个问题,人家那些吉他应用是可以的,自顶....
herenke123 2013-10-29
  • 打赏
  • 举报
回复
引用 2 楼 tantahe 的回复:
单独用View画一条线,width=match_parent,height=2dp,对这个View设置onTouch呢?应该比判断View里的一条线是否onTouch要简单多了。
这个也尝试过,但是如果从其他控件点下去 再移动到该view 上 好像触发不了 ontouch 事件,不知道为啥(我已经返回true ),也就是手指从别处划过那条线不会响,单独去点那条线就会响....
herenke123 2013-10-29
  • 打赏
  • 举报
回复
引用 1 楼 CuGBabyBeaR 的回复:
在ACTION_MOVE里比较本次事件和上次事件的坐标 如果跨过了弦就响 y0<100<y1 || y0>100>y1 || y1 == 100
亲,这个已经想过...如果速度过快 坐标一下子从 95.000 跳到103.12112 这样子 手虽然划过 但是不会响的。嗯我想要的效果 就像有些吉他弹奏 应用一样...无论速度多快 他都会响

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧