您的位置:首页 > 移动开发 > Android开发

Android4.4-Launcher源码分析系列之关键的类和接口之DropTarget、DragSource

2016-06-01 09:13 513 查看
一、DropTarget

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就这些,没什么好讲的.

欢迎各位留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息