Android 自定义删除 View


目标:实现一个点击删除的Item


效果图如下:我知道作为研发肯定会吐槽这个删除的设计,但是我还是要上图,不然我们岂不是不明真相的吃瓜群众…


Android 自定义删除 View


  1. 两个删除的按钮

  2. 点击减号出现垃圾桶

  3. 点击垃圾桶删除当前的item

  4. 出现垃圾桶,点击空白处回到初始状态显示减号
    虽然这个交互个人不太赞同,但是并表示我们实现不了,PS产品还说了,不要支持滑动,都用点击来交互(我了啦个F*CK)


下面我们就一步步实现这view
实现方法有很多种,这个东西不是特别难,其中涉及到一些小的计算思路和实现思路给大家分享下;

  1. 你可以用布局上下层嵌套写到xml里面来实现,这是最简单的实现

  2. 你可以用LayoutInfater填充上下层view来组合出来这view,然后加动画

  3. 我们还可以自定义一个Layout提供设置姓名的方法,和删除的事件出去,剩下的动作在view内部完成


国家惯例,先看完成的效果图,
Android 自定义删除 View

Android 自定义删除 View

再来一个动态图吧,没GIF没真相;


  1. 从效果图分析,我们需要提供的属性有一下几种

    Android 自定义删除 View

  • 实现思路;分析完需要的属性后,不要着急写代码,我们从效果图分析,下怎么写可以最方便的实现这个View;
    很多人一看到上下两层的第一进入脑袋中的思路是不是

FrameLayout

但是如果要把上下层用代码实现,FrameLayout的params不如

RelativeLayout

好用,这里我选择了RL来实现这个小东西;

  1. 现在开始着手实现,自定义View继承RelativeLayout

  2. 在构造中获取我们分析的自定义属性

  3. 获取到属性后,用代码构造我们的上层View和下层View以及上层的文字控件

  4. 给构造出来的view暴漏事件给外部,方便界面中使用


Android 自定义删除 View


  • 确定View的比例以及尺寸然后构造上下层的View

    Android 自定义删除 View

  1. 添加底部icon的View
    我们在构造中绘制了底部的颜色,现在只需要构造一个Image然后add到view中即可

    Android 自定义删除 View

  2. 添加上层View
    我们观察下上层不是一个view,他是由一个上层布局,上层布局中有一个textview结合完成的;Android 自定义删除 View


到此为止我们已经实现了View的80%的工作了剩下的就是提供暴漏设置名字,和删除的事件,以及让我们的上层View动起来,
剩下的事情就比较简单了,我们提供一个属性动画让上层VIew沿着X轴运动,
这里需要注意的移动的距离以及textview的联动
为什么呢?是这样的,因为我们垃圾桶的显示比例和上层View的文字控件并不是一个宽度,我们的如果不处理TextView的联动,会出现什么问题????
没错,就是垃圾桶全部显示的时候,textview会被隐藏一部分,但是如果textview的坐标位置,和垃圾桶的宽度一致的话,在折叠状态textview太靠右边,巨丑无比……各位好好理解下,所以我们为什么一开始就提供了两个属性一个是上层icon的距离,文字的距离还有一个上层icon距离左边的距离,我们用着两个距离结合垃圾桶的距离计算出来,当垃圾桶全部展开的时候,上层icon正好完全隐藏,而且文字正好是全部展示的这个距离


说一千道一万,看代码直接,特别简单,我们拿到上层view的图片宽度,加上上层icon距离左边的距离就是这个间距

Android 自定义删除 View


下面就是我们暴露出来的公开事件,

Android 自定义删除 View

ok,剩下的就是点击的时候,我们需要让上层View和文字的View 联动就大功告成了

下面我们看下view的动画代码

Android 自定义删除 View



到此这个view就分析完毕了,这里还有一个知识点给大家分享下,外面提供的设置文字内容和暴漏的事件的方法,如果直接调用是不会生效的,假如我们不在view内部处理一些东西的话,
大家都知道,我们findViewByID后直接获取view的宽高,是不是获取不到,都是0,
那是因为,但是我们要是写一个延时,5秒再获取宽高就能获取到了,所以我们难道要这样处理吗,那肯定不行啊,他自己处理完毕后会在一个生命周期中通知我们的,就是他会告诉activity,我OK了你可以来获取我的宽高了,想必大家都知道这个方法吧,

onWindowFocusChanged

就是他,这就是为什么我们提供的设置内容的方法,只是记录了外界提供的值,并没直接调用 textview.settext(),如果直接后面加上这一句会发生事情,大家肯定都知道的,

直接就crash了,textview是null,这块要注意下,于是我们改成这样的写法

Android 自定义删除 View

好了最后一个坑也填平了,虽然这个view没有很炫酷的动画
,但是也没有很高深的源码分析,
不要感觉啥都没学到,这样的*网上多的去了,自己造的*,能填补一些知识忙点!


由于微信对于代码支持不是很友好,非常大段的完整代码我就不在这里粘贴了,想要源码的或者查看的去原作者博客浏览即可。


上一篇:切换卡草稿


下一篇:安卓xml引入字体图标