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

原创 2016年06月01日 09:13:29

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

欢迎各位留言



版权声明:本文为博主原创文章,转载请注明出处:邓志勇博客 http://blog.csdn.net/qq_31530015/

《android framework常用api源码分析》之Launcher 程序

什么是Launcher app? 做应用开发的同学平时应该接触不多,android系统桌面就是Launcher app,但是他也是一个普通的app应用程序,是用户交互的第一个程序。很多手机厂商都会修改...
  • mhhyoucom
  • mhhyoucom
  • 2017年12月12日 21:19
  • 835

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

一、DragScroller DragScroller是一个接口,顾名思义是控制滑动的接口,它定义了4个方法 public interface DragScroller { /** * 左...
  • qq_31530015
  • qq_31530015
  • 2016年06月01日 10:37
  • 1210

android APP如何实现launcher

launcher
  • wumingzhou123
  • wumingzhou123
  • 2016年08月01日 16:10
  • 307

Android4.4-Launcher源码分析系列之Launcher介绍

一.Launcher是什么 Launcher是启动器的意思,最直观的就是手机上的桌面.其实它是个Activity. public class Launcher extends Activity...
  • qq_31530015
  • qq_31530015
  • 2016年05月19日 16:08
  • 3935

android7.x Launcher3源码解析(1)---启动流程

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launche...
  • Picasso_L
  • Picasso_L
  • 2017年04月07日 16:10
  • 2957

Android Launcher源码分析(一)

最近开始看Android Launcher源码,对一些关键类进行整理,想和大家分享一下。 关于Launcher布局、自定义布局属性等,以下博文已经进行详细的介绍,我就不再展开了,在此分享链接,感...
  • jhg19900321
  • jhg19900321
  • 2014年06月05日 00:11
  • 820

第五部分:IDropTarget实现

这一节我们讲如何来实现一个自己的Drop Target,我们需要实现IDropTarget接口。 1.如何成为一个"Drop Target" 为了使窗体能接收拖放的数据,窗口必须注册为drop目标...
  • leehong2005
  • leehong2005
  • 2013年02月26日 11:49
  • 4052

android launcher中主要类的功能说明

AddAdapter.java:为setWallPaper提供adapter; Alarm.java:提供定时操作,比如把快捷方式拖动到垃圾箱后让垃圾箱消失再回复到原有的桌面; AllAppsLi...
  • mydreamongo
  • mydreamongo
  • 2014年08月26日 17:03
  • 1256

Android启动器(Launcher)开发详解

第1章  Launcher的诞生 1.1 Framework启动Launcher流程        1.2 Launcher自身启动流程 App-Launcher-数据加...
  • qianguming
  • qianguming
  • 2015年01月15日 09:01
  • 3154

Android Launcher分析和修改1——Launcher默认界面配置(default_workspace)

最近工作都在修改Launcher,所以打算把分析源码和修改源码的过程记录下来,最近会写一些关于Launcher的分析和修改博文。因为我是修改4.0.3的Launcher,所以后面文章里面的Launch...
  • wh_19910525
  • wh_19910525
  • 2014年03月13日 14:22
  • 15050
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android4.4-Launcher源码分析系列之关键的类和接口之DropTarget、DragSource
举报原因:
原因补充:

(最多只允许输入30个字)