Launcher长按拖拽流程(二)
来源:互联网 发布:windows 搭建owncloud 编辑:程序博客网 时间:2024/06/06 04:32
图标拖动
上篇文章简单讲述了图标的拖动流程,关于回调里的并没有介绍。(因为我也蒙蔽,哈哈哈,看着各种坐标、各种变量、头很大)but,在小编的不断努力
(注释掉代码看效果)下,逐渐有了一点点眉目。在这里和各位盆友分享一下。
由于是调试总结出来的文章,小编只能从可见的功能上给大家做一介绍。在此,非常抱歉没有一个好的功底来完全熟悉后来写。只能慢慢补充
如果有更详细的介绍的blog,欢迎留言告诉我,大家共同进步。
1、关于dropTarget.onDragOver( mDragObject );
当长按起桌面图标,移动时,经过空位置、其他图标、文件夹,都是workspace的onDragOver
从功能上看,分为1、拖动到另一个图标上创建一个个文件夹虚影;2、拖动到另一个图标附近挤走原本的图标
//获得拖动图标的视觉中心位置mDragViewVisualCenter = getDragViewVisualCenter( d.x , d.y , d.xOffset , d.yOffset , d.dragView , mDragViewVisualCenter );
//拖动的时候也要判断当前位置Layout的是处于翻动的页面还是Hotseat中,确定mDragTargetLayout// Test to see if we are over the hotseat otherwise just use the current pageif( mLauncher.getHotseat() != null && !isDragWidget( d ) ){if( isPointInSelfOverHotseat( d.x , d.y , r ) ){layout = mLauncher.getHotseat().getLayout();}}if( layout == null ){layout = getCurrentDropLayout();}if( layout != mDragTargetLayout ){setCurrentDropLayout( layout );setCurrentDragOverlappingLayout( layout );}
//findNearestArea方法根据mDragViewVisualCenter先大致当前的落点mTargetCell = findNearestArea( (int)mDragViewVisualCenter[0] , (int)mDragViewVisualCenter[1] , minSpanX , minSpanY , mDragTargetLayout , mTargetCell );
//管理文件夹反馈(修改mDragMode)。是否生成文件夹虚影,是否添加到文件夹,都是这里判断的manageFolderFeedback( info , mDragTargetLayout , mTargetCell , targetCellDistance , dragOverView );//落点位置是否被占用boolean nearestDropOccupied = mDragTargetLayout.isNearestDropLocationOccupied((int)mDragViewVisualCenter[0] ,(int)mDragViewVisualCenter[1] ,item.getSpanX() ,item.getSpanY() ,child ,mTargetCell );if( !nearestDropOccupied ){mDragTargetLayout.visualizeDropLocation(child ,mDragOutline ,(int)mDragViewVisualCenter[0] ,(int)mDragViewVisualCenter[1] ,mTargetCell[0] ,mTargetCell[1] ,item.getSpanX() ,item.getSpanY() ,false ,d.dragView.getDragVisualizeOffset() ,d.dragView.getDragRegion() );}else if( ( mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER ) && !mReorderAlarm.alarmPending() && ( mLastReorderX != reorderX || mLastReorderY != reorderY ) ){//位置被占用,把图标挤走,并且挤走的图标来回晃动逻辑在这里// Otherwise, if we aren't adding to or creating a folder and there's no pending// reorder, then we schedule a reorderReorderAlarmListener listener = new ReorderAlarmListener( mDragViewVisualCenter , minSpanX , minSpanY , item.getSpanX() , item.getSpanY() , d.dragView , child );mReorderAlarm.setIOnAlarmListener( listener );mReorderAlarm.setAlarm( REORDER_TIMEOUT );}if( mDragMode == DRAG_MODE_CREATE_FOLDER || mDragMode == DRAG_MODE_ADD_TO_FOLDER || !nearestDropOccupied ){if( mDragTargetLayout != null ){mDragTargetLayout.revertTempState();}}FolderCreationAlarmListener:文件夹创建动画监听。监听的处理都在onAlarm方法里。文件夹的预览图在Folder的onDraw里:
int centerX = mTempLocation[0] + mCellWidth / 2;//文件夹预览图(一个图标覆盖到另一个图标或者文件夹上会生成文件夹预览图)的图标在绘制时的中心点的y坐标int centerY = mTempLocation[1] + previewOffset / 2 + child.getPaddingTop() + grid.folderBackgroundOffset;//xiatian add note//桌面图标显示的样式(详见BaseDefaultConfig.java中的“ITEM_STYLE_XXX”)。//BubbleTextView重载方法“getPaddingTop”// Draw outer ring, if it existsif( FolderIcon.HAS_OUTER_RING ){d = FolderRingAnimator.sSharedOuterRingDrawable;//文件夹预览图width = (int)( fra.getOuterRingWidthSize() * getChildrenScale() );height = (int)( fra.getOuterRingHeightSize() * getChildrenScale() );canvas.save();canvas.translate( centerX - width / 2 , centerY - height / 2 );d.setBounds( 0 , 0 , width , height );d.draw( canvas );canvas.restore();}
ReorderAlarmListener:重新排序动画监听。监听的处理都在onAlarm方法里。mDragTargetLayout.createArea(里,是把图标挤走和晃动的逻辑:
// If we're just testing for a possible location (MODE_ACCEPT_DROP), we don't bother// committing anything or animating anything as we just want to determine if a solution// existsif( mode == MODE_DRAG_OVER || mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL ){if( !DESTRUCTIVE_REORDER ){copySolutionToTempState( finalSolution , dragView );//记录被挤走的图标的位置}setItemPlacementDirty( true );animateItemsToSolution( finalSolution , dragView , mode == MODE_ON_DROP );//把图标挤走if( !DESTRUCTIVE_REORDER && ( mode == MODE_ON_DROP || mode == MODE_ON_DROP_EXTERNAL ) ){commitTempPlacement();completeAndClearReorderHintAnimations();setItemPlacementDirty( false );}else{beginOrAdjustHintAnimations( finalSolution , dragView , REORDER_ANIMATION_DURATION );//被挤走的图标晃啊晃的动画}}
2、关于dropTarget.onDragEnter( mDragObject );和mLastDropTarget.onDragExit( mDragObject );
当图标移动到(拖出)垃圾筐或者应用信息框上时,文字和图标变色功能介绍
回调在在DeleteDropTarget和InfoDropTarget里
卸载框:
public void onDragEnter(DragObject d ){super.onDragEnter( d );mCurrentDrawable.startTransition( mTransitionDuration );setTextColor( mHoverColor );//当图标进入卸载框时,改变文字颜色}
public void onDragExit(DragObject d ){super.onDragExit( d );if( !d.dragComplete ){mCurrentDrawable.resetTransition();setTextColor( mOriginalTextColor );//当图标拖出卸载框时,还原文字颜色}else{// Restore the hover color if we are deletingd.dragView.setColor( mHoverColor );}}
应用信息框:
public void onDragEnter(DragObject d ){super.onDragEnter( d );mDrawable.startTransition( mTransitionDuration );setTextColor( mHoverColor );//当图标进入应用信息框时,改变文字颜色}
public void onDragExit(DragObject d ){super.onDragExit( d );if( !d.dragComplete ){mDrawable.resetTransition();setTextColor( mOriginalTextColor );//当图标拖出应用信息框时,还原文字颜色}}他们都是调用了父类的方法并且改变的文字的颜色。
父类onDragEnter:
public void onDragEnter(DragObject d ){d.dragView.setColor( mHoverColor );//当图标拖入时,修改图标颜色}
public void onDragExit(DragObject d ){d.dragView.setColor( 0 );//当图标拖出时,修改图标颜色}以上就是长按 图标进入或者拖出时,颜色的变化功能。
尾注:
暂时就跟踪代码呆这里,如果有进展,会持续更新。
1 0
- Launcher长按拖拽流程(二)
- Activity启动流程源码分析之Launcher启动(二)
- Launcher长按拖拽流程
- Launcher长按拖拽流程(三)长按松手简述
- Launcher介绍总结(二)
- Android Launcher源码研究(二) 加载app流程1
- android Launcher那点事儿(二)
- Android Launcher源码分析(二)
- Android之launcher学习(二)
- android M Launcher之LauncherModel (二)
- android 启动launcher流程
- Android launcher加载流程
- Android launcher加载流程
- Launcher加载流程
- Android源码解析之(十)-->Launcher启动流程
- Android Launcher浅析(二)
- Android launcher 开发笔记(二) launcher中常用的类
- Launcher App拖拽流程
- 未来,有关程序员的十个预言
- 恢复参数文件spfile
- eval()函数
- MySql常用命令及导入.sql文件
- Android渐变色的圆弧虚线
- Launcher长按拖拽流程(二)
- 性能分析工具 Android TraceView
- intent.setAction的介绍
- 多进程使用pthread mutex
- 判断android SQLite中的表是否为空
- MySQL存储过程详解 mysql 存储过程
- GridControl根据条件设置每行中某单元格只读
- hihoCoder 1098 最小生成树二·Kruscal算法
- 在机器学习一书中SVM章节中遇到的问题