图标拖拽之松手逻辑
前两节简单概述了一下图标的拖动流程,本章来介绍一下松手之后的一些界面逻辑处理。
从功能上可以分为一下几种情况:
1、松手后,卸载应用,删除桌面图标
2、松手后,进入应用信息界面
3、松手后,形成文件夹
4、松手后,放入文件夹内
5、松手后,放在桌面空位置
第一章讲过,松手后的逻辑处理是在DragController类的onTouchEvent方法,
MotionEvent.ACTION_UP:中调用drop( dragLayerX , dragLayerY );
private void drop(
float x ,
float y )
{
final int[] coordinates = mCoordinatesTemp;
final DropTarget dropTarget = findDropTarget( (int)x , (int)y , coordinates );//根据坐标获取当前的dropTarget
mDragObject.x = coordinates[0];
mDragObject.y = coordinates[1];
boolean accepted = false;
if( dropTarget != null )
{
mDragObject.dragComplete = true;
dropTarget.onDragExit( mDragObject );//先退出dropTarget
if( dropTarget.acceptDrop( mDragObject ) )//判断是否可以放下
{
dropTarget.onDrop( mDragObject );//放下之后的逻辑
accepted = true;
}
}
mDragObject.dragSource.onDropCompleted( (View)dropTarget , mDragObject , false , accepted );//完全放下后的处理
}
1、松手后进入应用信息界面的逻辑
if( dropTarget.acceptDrop( mDragObject ) )//判断是否可以放下,回调到InfoDropTarget:
@Override
public boolean acceptDrop(
DragObject d )
{
// acceptDrop is called just before onDrop. We do the work here, rather than
// in onDrop, because it allows us to reject the drop (by returning false)
// so that the object being dragged isn't removed from the drag source.
ComponentName componentName = null;
if( d.dragInfo instanceof AppInfo )//主菜单里的图标
{
componentName = ( (AppInfo)d.dragInfo ).getComponentName();
}
else if( d.dragInfo instanceof ShortcutInfo )//桌面应用
{
componentName = ( (ShortcutInfo)d.dragInfo ).getIntent().getComponent();
}
else if( d.dragInfo instanceof PendingAddItemInfo )//小部件
{
componentName = ( (PendingAddItemInfo)d.dragInfo ).getComponentName();
}
if( componentName != null )
{
mLauncher.startApplicationDetailsActivity( componentName );//启动应用信息界面
}
// There is no post-drop animation, so clean up the DragView now
d.deferDragViewCleanupPostAnimation = false;
return false;
}
启动应用信息界面:
void startApplicationDetailsActivity(
ComponentName componentName )
{
String packageName = componentName.getPackageName();
Intent intent = new Intent( Settings.ACTION_APPLICATION_DETAILS_SETTINGS , Uri.fromParts( "package" , packageName , null ) );
intent.setFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS );
startActivitySafely( null , intent , "startApplicationDetailsActivity" );
}
2、松手后,卸载应用,删除桌面图标
if( dropTarget.acceptDrop( mDragObject ) )//判断是否可以放下,回调到DeleteDropTarget:
这个方法里判断各种item类型并返回是否可以卸载。具体的卸载代码当然就在if里面的代码块dropTarget.onDrop( mDragObject );回调中。
卸载完应用后,再调用mDragObject.dragSource.onDropCompleted( (View)dropTarget , mDragObject , false , accepted );处理图标的删除逻辑等等。
3、松手后,形成文件夹/放入文件夹里/放在桌面空白处
这三种情况下,都是长按桌面的图标后的操作,所以他们有共同的dropTarget和mDragObject.dragSource(都是workspace)。对应的逻辑处理就再workspace对应的回调中进行。
略略略,写不下去了,以后有问题时再跟踪代码。,。,。
要去做别的项目咯,launcher笔记暂时写到这里