锤子便签探究之拖拽效果的实现猜想

来源:互联网 发布:中国网络直播行业协会 编辑:程序博客网 时间:2024/05/19 14:36

图丢了,补个图。。。

------------------------

最近编辑器里涉及到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的位置的转换,废了很大劲,其他都不难


最终实现效果如下,大体差不多,终于可以拿到项目里用了


原创粉丝点击