锤子便签探究之拖拽效果的实现猜想
最近编辑器里涉及到item拖拽,遂各种尝试
首先尝试了系统startDrag,发现效果根本不理想,因为你无法控制左右上下拖动,而且他的阴影没法改。。。放弃
然后用viewdraghelper实现了下,当然viewdraghelper也很强大,但是一直没搞明白该如何长按触发拖拽,还有一点就是viewdraghelper切换位置会导致拖拽的item位置也发生变化。。。继续放弃
再然后用了recyclerview的拖拽,哇,很流畅啊有木有,但是recyclerview的拖拽有问题,那就是在item中间做item交换的话如果item在最下面,这时候你交换了位置,会导致你正拖拽的item消失。。。再次放弃
。。。好了事情到这就不知道怎么搞了,去研究了下其他编辑器,找了一圈,发现锤子的拖拽效果做的特别棒
于是乎想研究下他们是怎么实现的,毕竟参考吗,首先想到的那当然是反编译,哎,可是,你懂的,代码做了混淆了,啥都看不懂
那那那代码混淆了,看起来太费劲了,还有办法吗?
答案是有滴,那就是
神器都祭出来了,当然是看ui啊
首先截了两张图
第一张:正常状态下锤子ui布局
第二张:拖拽情况下锤子ui布局
你发现了什么?
拖拽情况下竟然有两个listview?什么鬼?正常情况下所有文字是在一个edittext里面的,拖拽情况下会把所有的edittext每一行拆成一个view,当然,这不在我要研究的范围内,不做讨论
我只是要研究他的拖拽怎么实现的,如果你也看了锤子ui布局,你会发现拖拽的那个view你是选不中的
????选不中?什么情况下会选不中?那就是他没有布局,canvas直接draw上去的(猜测)
然后有了猜测,就实验吧
当然实验详细过程就省略了,大体说一下我的流程
首先我没有用listview,直接拿linearlayout来做的实验,毕竟实验吗,怎么简单怎么来
我们要做的无非就是重写onTouch事件,在长按的时候,隐藏掉原来的view,然后在scrollview的父布局A中动态draw上我们选中的那个view,然后在你需要触发拖拽的子view中拦截一下touch事件
唯一的难点就在坐标的计算上,scrollview里那个布局B(linearlayout或者你其他的container)中子布局的相对B的位置和相对A的位置的转换,废了很大劲,其他都不难
最终实现效果如下,大体差不多,终于可以拿到项目里用了