Android4.4-Launcher源码分析系列之关键的类和接口之DropTarget、DragSource
2016-06-01 09:13
513 查看
一、DropTarget
DropTarget是一个接口,它定义了一个可以接收被拖动对象的对象,意思是说实现了这个接口的对象是一个可以放置被拖动对象的容器.
实现了这个接口的有ButtonDropTarget、Folder、Workspace三个.
它内部定义了一个DragObject类,声明了一些与拖动有关的属性
onDragOver————— 是图标在上一次位置和这一次位置所处的DropTarget相同的时候的回调方法。
onDragExit —————是图标被拖出DropTarget时的回调方法。
onDrop —————是图标最终被放到一个DropTarget时的回调方法
我在WorkSpace类里加了实现这些方法的打印,当长按一个图标然后放下时会依次执行下列方法
![](http://img.blog.csdn.net/20160522152607688)
前面已经说了,实现了DropTarget接口的有ButtonDropTarget、Folder、Workspace三个.Folder是文件夹类,Workspace是工作区类,那么ButtonDropTarget是什么呢?
我们看下它的源码
它是继承自TextView并实现了DropTarget接口,我们这里只关注它的子类InfoDropTarget和DeleteDropTarget.这两个子类分别是App info和删除类.如下图示
![](http://img.blog.csdn.net/20160522160106310)
![](http://img.blog.csdn.net/20160522160453563)
对应的显示是X Remove和App info.
它们都实现了onDragEnter、onDragOver、onDragExit、onDrop等四个方法.
大家应该发现了,在拖动图标到InfoDropTarget和DeleteDropTarget时,文本变了颜色.根据前面的定义,这些操作应该是在onDragEnter方法里进行的.我们进去看一下.
DeleteDropTarget的
DeleteDropTarget
![](http://img.blog.csdn.net/20160522163417574)
![](http://img.blog.csdn.net/20160522163354640)
至于图标也可以改,我这里就不说了.
接下来介绍下DragSource.
二、DragSource
DragSource是一个接口,意思是拖拽源,实现这个接口只有两个类:AppsCustomizePagedView和Workspace.
确实,只有这两个地方能拖动图标.DragSource只定义了三个方法.
supportsFlingToDelete—————— 是否这个源支持猛的拖动items到删除框
void onFlingToDeleteCompleted——猛的拖一下items到删除框
onDropCompleted———————— 在拖动一个items完成时执行
DragSource就这些,没什么好讲的.
欢迎各位留言
DropTarget是一个接口,它定义了一个可以接收被拖动对象的对象,意思是说实现了这个接口的对象是一个可以放置被拖动对象的容器.
实现了这个接口的有ButtonDropTarget、Folder、Workspace三个.
它内部定义了一个DragObject类,声明了一些与拖动有关的属性
class DragObject { public int x = -1; public int y = -1; /** 触摸点到cell右上角的x位置 */ public int xOffset = -1; /** 触摸点到cell右上角的y位置 */ public int yOffset = -1; /** * 表示一个拖动操作是否在最后的状态,放下或者取消。和onDragExit不同, * 这个只有在当前拖动对象上拖动终结时或者拖动出了当前对象时才会产生 */ public boolean dragComplete = false; /** 拖动的对象 */ public DragView dragView = null; /** 与被拖动对象相关联的数据信息 */ public Object dragInfo = null; /** 发起拖动的对象 */ public DragSource dragSource = null; /** 顾名思义,调用拖动动画的Runnable */ public Runnable postAnimationRunnable = null; /** 表示是否拖动操作已经被取消 */ public boolean cancelled = false; /** * 拖动动画不停止,就不删除DragView */ public boolean deferDragViewCleanupPostAnimation = true; public DragObject() { } }主要关注下它提供的以下四个方法
void onDragEnter(DragObject dragObject); void onDragOver(DragObject dragObject); void onDragExit(DragObject dragObject); void onDrop(DragObject dragObject);onDragEnter—————是图标拖动到一个DropTarget时的回调方法
onDragOver————— 是图标在上一次位置和这一次位置所处的DropTarget相同的时候的回调方法。
onDragExit —————是图标被拖出DropTarget时的回调方法。
onDrop —————是图标最终被放到一个DropTarget时的回调方法
我在WorkSpace类里加了实现这些方法的打印,当长按一个图标然后放下时会依次执行下列方法
前面已经说了,实现了DropTarget接口的有ButtonDropTarget、Folder、Workspace三个.Folder是文件夹类,Workspace是工作区类,那么ButtonDropTarget是什么呢?
我们看下它的源码
public class ButtonDropTarget extends TextView implements DropTarget, DragController.DragListener {
它是继承自TextView并实现了DropTarget接口,我们这里只关注它的子类InfoDropTarget和DeleteDropTarget.这两个子类分别是App info和删除类.如下图示
对应的显示是X Remove和App info.
它们都实现了onDragEnter、onDragOver、onDragExit、onDrop等四个方法.
大家应该发现了,在拖动图标到InfoDropTarget和DeleteDropTarget时,文本变了颜色.根据前面的定义,这些操作应该是在onDragEnter方法里进行的.我们进去看一下.
DeleteDropTarget的
public void onDragEnter(DragObject d) { super.onDragEnter(d); setHoverColor(); }InfoDropTarget的
public void onDragEnter(DragObject d) { super.onDragEnter(d); mDrawable.startTransition(mTransitionDuration); setTextColor(mHoverColor); }是在setHoverColor和setTextColor(mHoverColor)里改变的.其实setHoverColor点进去也是
private void setHoverColor() { mCurrentDrawable.startTransition(mTransitionDuration); setTextColor(mHoverColor); }很明显,我们只要改变这个mHoverColor值就可以,代码中是这样定义的
DeleteDropTarget
mHoverColor = r.getColor(R.color.delete_target_hover_tint);InfoDropTarget
mHoverColor = r.getColor(R.color.info_target_hover_tint);这两个颜色对应的正是原生的红色和蓝色.我们把它改为绿色和黄色验证一下.
至于图标也可以改,我这里就不说了.
接下来介绍下DragSource.
二、DragSource
DragSource是一个接口,意思是拖拽源,实现这个接口只有两个类:AppsCustomizePagedView和Workspace.
确实,只有这两个地方能拖动图标.DragSource只定义了三个方法.
public interface DragSource { boolean supportsFlingToDelete(); void onFlingToDeleteCompleted(); void onDropCompleted(View target, DragObject d, boolean isFlingToDelete, boolean success); }从这些方法的名字就很容易理解.
supportsFlingToDelete—————— 是否这个源支持猛的拖动items到删除框
void onFlingToDeleteCompleted——猛的拖一下items到删除框
onDropCompleted———————— 在拖动一个items完成时执行
DragSource就这些,没什么好讲的.
欢迎各位留言
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories