基于Android图标拖动布局的实现
余问鼎 2014-01-10
界面需求:
界面整齐的排列各个图标,长按其中一个,可拖动选中的图标。拖动到想要的位置之后,界面可将图标再次排列整齐。类似一般android手机桌面布局。
控件介绍:
Android为我们提供了GridView 网格视图。GridView 可在控件内添加view子控件,实现view的整齐排列,但是GridView并没有给我们提供拖拽view的功能,因此需要重新编写GridView来实现需要的功能。
public class DragGrid extends GridView{}
如上述代码,重新定义一个DragGrid控件,继承于GridView。
Android事件处理:
事件是我们在与UI交互式发生的,我们点击一个按键时,可能就已经出发好几个事件,例如我们点击数字键“0”,他会涉及到按下事件,和一个弹起(松开)事件,在我们android中还可能涉及到触摸屏事件,所以在android系统中,事件是作为常用的功能之一。而这里我用到的主要有两个:
1 长按LongClick;
2 触碰事件TouchEvent;
适配器Adapter:
适配器(Adapter)是一种界面对象,他用于列表组件和数据来源之间的桥梁。在这里我们用于GridView的数据填充,以及拖动后的布局改变。Android本身提供给我们的配置器不满足我们的需求因此也需要重写一个新的Adapter;
public class DateAdapter extends BaseAdapter {}
主要思路:
触发GridView的子控件的长按监听,需要重写GridView的LongClick的监听。之后进入图标拖拽功能,此功能需要重写触碰事件TouchEvent。但是仅仅如此,会带来一个问题,在没有长按的时候也会触发触碰事件TouchEvent。因此我们需要一个机制来判断LongClick和TouchEvent的先后顺序,在LongClick触发之后才执行TouchEvent。好在android为我们提供了另一个事件——onInterceptTouchEvent。onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。重写GridView的onInterceptTouchEvent使得在手指触碰屏幕的时候调用LongClick而不是TouchEvent,就可以避免两者之间的矛盾。之后使用Adapter对GridView的内容进行填充,即可完成布局。
具体实现与代码:
具体实现还需要还需要具体的页面布局。布局文件分为两个,一个是主界面,之间调用重写的GridView即可。另一个是GridView的item,我们可以用一个ImageView来显示图标,下面用一个TextView来注释名称。
而将item填充到GridView