坑爹的Android4.4,难道我发现了系统BUG?高手来看一下

Eastman_99 2014-10-10 05:42:53
先说我遇到的问题,在GridLayout里面,我添加了多个派生自RelativeLayout的子控件。。。总的来说,监听TouchListener,可以拖动这些子控件中的某一个,(我手指拖到哪儿,被选中的子控件跟着动)

在之前,真机测试好好的,现在手机换成Android4.4版本了,发现拖不动了(两个4.4的手机都不行), 我怀疑是有一句代码出了问题,但是网上度了,谷了都找不到答案。。求高手

case MotionEvent.ACTION_MOVE:
int dx =(int)event.getRawX() - lastX; // lastX 和 lastY是成员变量,用来记录上次执行Move的位置
int dy =(int)event.getRawY() - lastY;
int left = 0;
int top = 0;
int right = 0;
int bottom = 0;
//如果按下时的坐标和当前移动到的位置的坐标差的绝对值大于子视图可移动的距离则修改为正在拖动
left = vP.getLeft() + dx;
top = vP.getTop() + dy;
right = vP.getRight() + dx;
bottom = vP.getBottom() + dy;

vP.layout(left, top, right, bottom); // 感觉就是这句话执行了不生效,导致拖不动
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;


上面这一段是TouchListener里面响应Move事件的代码,我认为就是上面注释的那句话有问题,各位看看,有没有解决办法
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eastman_99 2014-10-11
  • 打赏
  • 举报
回复
引用 10 楼 kaisuihu 的回复:
当然,也有可能是我派生的ViewGroup的OnLayout 里面处理得不对
事实证明,确实是onLayout里面处理得有问题,现在我把onLayout函数在拖动的时候直接返回掉,不做子控件的Layout处理,就行了。。。。 以前的android版本居然可以用,让我一直误以为是GridLayout的版本兼容性问题。。。可能是Android4.4及以后对onLayout的处理方式有改变 谢谢各位了~共勉
Eastman_99 2014-10-11
  • 打赏
  • 举报
回复
当然,也有可能是我派生的ViewGroup的OnLayout 里面处理得不对
Eastman_99 2014-10-11
  • 打赏
  • 举报
回复
引用 7 楼 heaimnmn 的回复:
我觉得应该是view的触控分发出现了问题,有木有4.4有木有执行 MotionEvent.ACTION_MOVE:
看了你这句话,我再去看代码的时候,发现我这个问题提得就不对,没错综问题的本质,也是由于时间久了,有些代码淡忘了,所以。。。 原来,我两行两列的时候是把4个子控件放在GridLayout里面,然后在将GraiLayout放入派生的ViewGroup里面,所以他的触控事件应该是受GridLayout来控制~~~ 然后当我切换成单视图的时候(只有一个派生控件),我不再使用GridLayout,直接把派生控件放到了派生的ViewGroup里面,所以这个时候子控件的触控事件应该是由派生的ViewGroup来控制的,问题就在这儿,派生的ViewGroup里面重写了onInterceptTouchEvent 和 onTouchEvent,所以应该是这个地方有问题,我再理一理
svenwang 2014-10-11
  • 打赏
  • 举报
回复
你用的是原生android?会不会是定制系统的bug?
哎,真难 2014-10-11
  • 打赏
  • 举报
回复
我觉得应该是view的触控分发出现了问题,有木有4.4有木有执行 MotionEvent.ACTION_MOVE:
Eastman_99 2014-10-11
  • 打赏
  • 举报
回复
我发现,如果我是两行两列的4个子控件,拖动某一个是没有问题的,但是当我改变布局之后——一个GridLayout里面只放一个子控件,这时候子控件就拖不动了
DrSmart 2014-10-11
  • 打赏
  • 举报
回复
楼主你这样调试,正常情况下,各个变量值是多少,4.4中哪个变量的值十分异常,比如0或变为相反数了
Eastman_99 2014-10-11
  • 打赏
  • 举报
回复
引用 3 楼 kifile 的回复:
你可以使用 view.scrollBy(int x,int y)试试呢?,一般而言,不推荐使用 layout 的
单纯的scrollBy应该还不能满足我的需求,在GridLayout里面我是两行x两列(四个)派生控件,某一时刻,只能拖动其中一个,总共有好几个GridLayout并列布局的 而按照我的理解,scroll类似的函数应该都是要视图实际大小超出显示区域才能滚动?而我的派生控件在GridLayout里面是完全显示了的
CyberLogix 2014-10-11
  • 打赏
  • 举报
回复
帮顶,事实证明程序总是怀疑是系统或者库的问题,结果后来还是程序员自己的问题,呵呵
Kifile 2014-10-10
  • 打赏
  • 举报
回复
你可以使用 view.scrollBy(int x,int y)试试呢?,一般而言,不推荐使用 layout 的
Eastman_99 2014-10-10
  • 打赏
  • 举报
回复
我更加怀疑就是4.4的一个bug,因为我派生的那个子控件里面还有view,当我把上面的vP(这就是派生的那个类)换成vP的子view的时候,子View是可以拖动的,所以。。。4.4下面,难道Relative不能通过layout来改变位置了?那应该用什么方法来替代呢
Eastman_99 2014-10-10
  • 打赏
  • 举报
回复
经常看到码友自己顶楼唤高人,今天终于让我来体验一次了

80,351

社区成员

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

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