仿网易新闻客户端栏目的拖拽,删除,添加效果。在此要感谢vipra,此效果是在这个项目的基础上修改的

先上效果图:

简单说一下实现原理:

首先看一下效果图,分为上下两个GridView,上边的为可以拖拽的GridView,为DragGrid。下边是不可拖拽的普通的GridView。

主要说一下DragGrid(可以拖拽的GridView):重写onInterceptTouchEvent方法,然后设置Item的长按事件,拿到当前的item信息(postion,item的view),并在window层创建item的view的布局,在onTouchEvent方法,处理move事件获取到移动,计算item之间的移动和创建动画。

处理长按事件:

setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view,int position, long id) {int x = (int) ev.getX();// 长按事件的X位置int y = (int) ev.getY();// 长按事件的y位置startPosition = position;// 第一次点击的postiondragPosition = position;if (startPosition <= 0) {//TODO 原来是1return false;}View dragViewGroup = getChildAt(dragPosition - getFirstVisiblePosition());TextView dragTextView = (TextView) dragViewGroup.findViewById(R.id.text_item);RelativeLayout ri_delete = (RelativeLayout) dragViewGroup.findViewById(R.id.ri_delete);dragTextView.setSelected(true);dragTextView.setEnabled(false);ri_delete.setVisibility(View.INVISIBLE);itemHeight = dragViewGroup.getHeight();itemWidth = dragViewGroup.getWidth();itemTotalCount = DragGrid.this.getCount();int row = itemTotalCount / nColumns;// 算出行数Remainder = (itemTotalCount % nColumns);// 算出最后一行多余的数量if (Remainder != 0) {nRows = row + 1;} else {nRows = row;}// 如果特殊的这个不等于拖动的那个,并且不等于-1if (dragPosition != AdapterView.INVALID_POSITION) {// 释放的资源使用的绘图缓存。如果你调用buildDrawingCache()手动没有调用setDrawingCacheEnabled(真正的),你应该清理缓存使用这种方法。win_view_x = windowX - dragViewGroup.getLeft();//VIEW相对自己的X,半斤win_view_y = windowY - dragViewGroup.getTop();//VIEW相对自己的y,半斤dragOffsetX = (int) (ev.getRawX() - x);//手指在屏幕的上X位置-手指在控件中的位置就是距离最左边的距离dragOffsetY = (int) (ev.getRawY() - y);//手指在屏幕的上y位置-手指在控件中的位置就是距离最上边的距离
//                  dragItemView = dragViewGroup;dragViewGroup.destroyDrawingCache();if (ri_delete.getVisibility() == View.GONE) {ri_delete.setVisibility(View.VISIBLE);}dragViewGroup.setDrawingCacheEnabled(true);//TODO 展示删除按钮showInnerDeleteIcon();showDeleteIcon(true);Bitmap dragBitmap = Bitmap.createBitmap(dragViewGroup.getDrawingCache());//mVibrator.vibrate(50);//设置震动时间startDrag(dragBitmap, (int) ev.getRawX(), (int) ev.getRawY());//隐藏需要移动的itemhideDropItem();dragViewGroup.setVisibility(View.INVISIBLE);isMoving = false;requestDisallowInterceptTouchEvent(true);return true;}return false;}});

处理移动:

        // 拖动的VIEW下方的POSTIONint dPosition = pointToPosition(x, y);// 判断下方的POSTION是否是最开始2个不能拖动的if (dPosition > 0) {//TODO 原来值是1if ((dPosition == -1) || (dPosition == dragPosition)) {return;}dropPosition = dPosition;if (dragPosition != startPosition) {dragPosition = startPosition;}int movecount;//拖动的=开始拖的,并且 拖动的 不等于放下的if ((dragPosition == startPosition) || (dragPosition != dropPosition)) {//移需要移动的动ITEM数量movecount = dropPosition - dragPosition;} else {//移需要移动的动ITEM数量为0movecount = 0;}if (movecount == 0) {return;}int movecount_abs = Math.abs(movecount);if (dPosition != dragPosition) {//dragGroup设置为不可见ViewGroup dragGroup = (ViewGroup) getChildAt(dragPosition);dragGroup.setVisibility(View.INVISIBLE);float to_x = 1;// 当前下方positonfloat to_y;// 当前下方右边positon//x_vlaue移动的距离百分比(相对于自己长度的百分比)float x_vlaue = ((float) mHorizontalSpacing / (float) itemWidth) + 1.0f;//y_vlaue移动的距离百分比(相对于自己宽度的百分比)float y_vlaue = ((float) mVerticalSpacing / (float) itemHeight) + 1.0f;Log.d("x_vlaue", "x_vlaue = " + x_vlaue);for (int i = 0; i < movecount_abs; i++) {to_x = x_vlaue;to_y = y_vlaue;//像左if (movecount > 0) {// 判断是不是同一行的holdPosition = dragPosition + i + 1;if (dragPosition / nColumns == holdPosition / nColumns) {to_x = -x_vlaue;to_y = 0;} else if (holdPosition % 4 == 0) {to_x = 3 * x_vlaue;to_y = -y_vlaue;System.out.println("=============to_y ="+to_y);} else {to_x = -x_vlaue;to_y = 0;}} else {//向右,下移到上,右移到左holdPosition = dragPosition - i - 1;if (dragPosition / nColumns == holdPosition / nColumns) {to_x = x_vlaue;to_y = 0;} else if ((holdPosition + 1) % 4 == 0) {to_x = -3 * x_vlaue;to_y = y_vlaue;} else {to_x = x_vlaue;to_y = 0;}}ViewGroup moveViewGroup = (ViewGroup) getChildAt(holdPosition);Animation moveAnimation = getMoveAnimation(to_x, to_y);moveViewGroup.startAnimation(moveAnimation);//如果是最后一个移动的,那么设置他的最后个动画ID为LastAnimationIDif (holdPosition == dropPosition) {LastAnimationID = moveAnimation.toString();}moveAnimation.setAnimationListener(new AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {isMoving = true;}@Overridepublic void onAnimationRepeat(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {// 如果为最后个动画结束,那执行下面的方法if (animation.toString().equalsIgnoreCase(LastAnimationID)) {DragAdapter mDragAdapter = (DragAdapter) getAdapter();mDragAdapter.exchange(startPosition, dropPosition);startPosition = dropPosition;dragPosition = dropPosition;isMoving = false;}}});}}}

如此,当点击下边的GridView,获取到当前item的位置,然后获取到上传size+1的位置,创建window层view,设置动画。

具体代码可以去我的github自己去看。

项目下载地址:https://github.com/whatshappen/TopGrid

仿网易新闻栏目管理(频道管理)功能相关推荐

  1. 高仿网易新闻栏目动画效果

    tyktfj0910 的博客地址:http://blog.csdn.net/tyk0910 效果预览 今天准备用RecyclerView来实现网易新闻Tabs的动态效果.先看效果图: 点击下面的Rec ...

  2. android分类功能,Android 仿网易新闻客户端分类排序功能

    先来看看网易新闻客户端以及自己实现的效果图,效果当然还是网易的好 gridviewsort.gif 如何实现拖拽一个Item 用WindowManager添加一个ImageView,并且将这个Imag ...

  3. 仿网易新闻客户端的上面的tab和下面的功能条

    2019独角兽企业重金招聘Python工程师标准>>> 仿网易新闻客户端的上面的tab和下面的功能条 package com.and.netease; import com.and. ...

  4. Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

     转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherl ...

  5. Android高仿网易新闻客户端之动态添加标签

    承接上一篇文章:Android高仿网易新闻客户端之首页,今天来实现动态添加标签效果. 动态标签页是一个流式布局,实现了宽度自动换行高度自动分配的功能,代码如下: FlowLayout.java pac ...

  6. 仿网易新闻的页面(ViewPager作为RecyclerView的Header)

    需求 > 想实现一个仿网易新闻的页面,上面是轮播的图片,下面是 RecyclerView 显示新闻列表. 本文链接 http://blog.csdn.net/never_cxb/article/ ...

  7. android 仿网易新闻客户端源码都有

    原文:android 仿网易新闻客户端源码都有 android 仿网易新闻服务端源码 源代码下载地址: http://www.zuidaima.com/share/1550463560944640.h ...

  8. css+js校验 实现仿网易邮箱注册界面 和 校验 功能

    css+js校验 实现仿网易邮箱注册界面 和 校验 功能 先来看看最终的效果图吧ヾ(≧▽≦*)o 代码如下: <!DOCTYPE html> <html lang="en& ...

  9. 网易新闻 html5,HTML5+SWIPER仿网易新闻横滑翻页及联动

    [实例简介] 一套仿网易新闻的闻横滑翻页,联动导航,用到了swiper.js zepto.js scroll.js效果不错 [实例截图] [核心代码] swiper └── swiper ├── cs ...

最新文章

  1. 【SAP技术】SAP不能修改一个已经分配给交货单的HU
  2. boost::bron_kerbosch_all_cliques用法的测试程序
  3. 几篇关于Hadoop+Hive数据仓库的入门文章
  4. 窄带语谱图c语言算法,MELP语音编码算法实现及算法改进
  5. HDU 3530Subsequence(单调队列)
  6. Day4_代码重用与函数
  7. html css浮动标签,12种超酷HTML5 SVG和CSS3浮动标签效果
  8. 数论基本定理及应用(三)
  9. PopupWindow 常用方法学习笔记
  10. 儿童素描手绘创意设计字体 for mac
  11. linux centos下安装R语言,Centos6下安装R语言教程
  12. 如何在网上买到下铺票2020_网上订票怎么选下铺
  13. 扬州大学c语言作业,扬州大学c语言0600706期末试题
  14. 单片机定时器一1ms12MHz_【51单片机】基于STC89C52RC的多路电压采集系统
  15. 嵌入式监控【v4l2采集->vpu编码->live555推流】
  16. i.MX6ULL驱动开发 | 04-Linux设备树基本语法与实例解析
  17. Maven环境搭建及配置
  18. 小程序云开发中的一些注意点与Error: errCode: -404011 cloud function execution error | errMsg: clou----错误
  19. 100题前端面试[题目+答案] -- 自用
  20. 第4版-信息系统项目管理师十大知识域及ITTO

热门文章

  1. win10笔记本拨号上网却不能开启热点解决方法 (附2020-7-10更新)
  2. 微信小程序腾讯地图bindregionchange事件导致图标闪烁的解决方法
  3. 小程序通过广告组件进行赚钱(流量主)--小程序走过的坑(16)(最新版)
  4. Unity android 接有米广告和分享功能
  5. oracle 视图 其他用户,oracle创建视图中涉及到另外一个用户的表权限不足问题
  6. 测试也需要懂尼尔森的十大可用性原则
  7. 如何提高自己的深度思考能力
  8. Python之functools模块使用方法
  9. Nginx利用lua剪辑FastDFS图片
  10. 综合练习题(java)