1、自定义GridLayout实现增加条目过度动画操作

public class MyGridLayout extends GridLayout {
public MyGridLayout(Context context) {
//super(context);
this(context,null);
}
public MyGridLayout(Context context, AttributeSet attrs) {
//super(context, attrs);
this(context,attrs,-1);
}
public MyGridLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 设置 GridLayout 中的条目增加过渡动画***********************
this.setLayoutTransition(new LayoutTransition());
}
}

2、创建条目

private void addTextView(String string) {
TextView textView = new TextView(getContext());
textView.setText(string);
textView.setTextColor(Color.BLACK);
textView.setBackgroundResource(R.drawable.shape_selecitem_black_bg);
textView.setGravity(Gravity.CENTER);
textView.setPadding(15, 5, 15, 5);
GridLayout.LayoutParams params = new LayoutParams();
params.setMargins(5, 5, 5, 5);
// 设置 params 给 TextView, 使用 margins 效果生效
textView.setLayoutParams(params);
// 将 textview 添加 Gridlayout 中展示
this.addView(textView);
}

3、拖拽效果的实现

3.1 设置条目的长按事件

  

public void addTextView(String string) {
....
// 设置 textview 的长按事件,实现拖拽效果
textView.setOnLongClickListener(longClickListener);
// 将 textview 添加 Gridlayout 中展示
this.addView(textView);
}

  3.2 长按事件中实现拖拽效果 

  

private OnLongClickListener longClickListener = new OnLongClickListener() {
// 长按控件调用的方法
// 参数:被长按的控件
@Override
public boolean onLongClick(View v) {
// 设置控件开始拖拽
// 参数 1 :拖拽要显示的数据,一般 null
// 参数 2 :拖拽显示的阴影样式 ,DragShadowBuilder(v): 根据拖拽的控件,设置拖拽阴影的样式效果
// 参数 3 :拖拽的控件的状态,一般 null
// 参数 4 :拖拽的其他设置的标示,一般 0
v.startDrag(null, new DragShadowBuilder(v), null, 0);
// 返回 true 表示处理长按事件, false 就是不处理
return true;
}
};

4、拖拽移动操作的实现

核心理念:根据 textview 创建矩形,矩形中包含有原先 textview 的左上角和右下角的坐标,移动的时候,判断按下的坐标是否在矩形的坐标内,如果在就说明移动到了相应的矩形的位置,也就是相应的 textview 的位置

/** 拖拽监听操作 **/
private OnDragListener dragListener = new OnDragListener() {
// 当拖拽操作执行的时候调用的方法
// 参数 1 :拖拽的控件
// 参数 2 :拖拽的事件
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:// 开始拖拽
System.out.println(" 开始拖拽 ");
// 根据 textview 创建矩形
createRect();
break;
case DragEvent.ACTION_DRAG_ENTERED:// 开始拖拽控件后,进入拖拽控件范围事件
System.out.println(" 进入拖拽控件范围 ");
break;
case DragEvent.ACTION_DRAG_EXITED:// 开始拖拽控件后,离开拖拽控件范围事件
System.out.println(" 离开拖拽控件范围 ");
break;
case DragEvent.ACTION_DRAG_LOCATION:// 开始拖拽控件后,移动控件或者是拖拽控件执行的操作
System.out.println(" 拖拽控件移动 ");
// 根据拖拽的按下的坐标,获取拖拽控件移动的位置
int index = getIndex(event);
//MyGridLayout.this.getChildAt(index) != currentView : 判断移动到位置的 textview 和拖拽的 textview 是否一致,一致不进行移动,不一致进行移动操作
if (index != -1 && currentView != null && MyGridLayout.this.getChildAt(index) != currentView) {
// 实现 Gridlayout 的移动操作
// 将原来位置的拖拽的特性 tview 删除
MyGridLayout.this.removeView(currentView);
// 将拖拽的 textview 添加到移动的位置
MyGridLayout.this.addView(currentView, index);// 将 view 对象,添加到那个位置
}
break;
case DragEvent.ACTION_DRAG_ENDED:// 结束拖拽
System.out.println(" 结束拖拽 ");
// 设置拖拽的 textview 背景改为黑色边框的背景
if (currentView != null) {
currentView.setEnabled(true);
}
break;
case DragEvent.ACTION_DROP:// 结束拖拽,在控件范围内,松开手指,在控件范围外不执行操作
System.out.println(" 松开手指 ");
break;
}
return true;
}
};
/**
* 根据 textview 创建矩形
*
* 2016 年 12 月 30 日 上午 11:44:08
*/
protected void createRect() {
//getChildCount() : 获取 Gridlayout 的子控件的个数
rects = new Rect[this.getChildCount()];
// 根据孩子的个数,创建相应个数的矩形
for (int i = 0; i < this.getChildCount(); i++) {
// 根据子控件的索引,获取子控件的 view 对象
View view = this.getChildAt(i);
// 创建一个矩形
// 参数 1,2 :左上角的 x 和 y 的坐标
// 参数 3,4 :右下角的 x 和 y 的坐标
Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
// 保存到就行到数组中
rects[i] = rect;
}
}
/**
* 根据拖拽按下的坐标,获取拖拽控件移动的位置
*
* 2016 年 12 月 30 日 上午 11:50:20
*/
protected int getIndex(DragEvent event) {
for (int i = 0; i < rects.length; i++) {
// 判断按下的坐标是否包含在矩形的坐标范围内容
if (rects[i].contains((int)event.getX(), (int)event.getY())) {
return i;
}
}
return -1;
}

自定义GridLayout实现条目的拖动动画特效的更多相关文章

  1. [置顶] android 自定义ListView实现动画特效

    通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...

  2. paip.关于动画特效原理 html js 框架总结

    paip.关于动画特效原理 html js 框架总结 1. 动画框架的来源:flex,jqueryui 3 2. 特效的分类 3 2.1. Property effects 动态改变一个或多个目标对象 ...

  3. 10款基于jquery的web前端动画特效

    1.jQuery横向手风琴图片切换动画 之前我们为大家分享过很多款基于jQuery和CSS3的手风琴菜单和手风琴焦点图插件,比如CSS3响应式垂直手风琴菜单和jQuery横向手风琴图片展示插件.今天要 ...

  4. 分享8款令人惊叹的HTML5 Canvas动画特效

    HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...

  5. jQuery动画特效实例教程

    本文以实例形式详细讲述了jQuery动画特效的实现方法. 1.自制折叠内容块 内容块如下:     <div class="module">   <div cla ...

  6. 有时候就是看不进论文-jQuery动画特效篇&MySQL

    hi 早上知道新的乱斗模式后,没忍住开了几把,然后就无心论文了...用这个来破吧 1.jQuery -----动画特效----- ----调用show()和hide()方法显示和隐藏元素 show() ...

  7. 三、jQuery--jQuery基础--jQuery基础课程--第7章 jQuery 动画特效

    1.调用show()和hide()方法显示和隐藏元素 show()和hide()方法用于显示或隐藏页面中的元素,它的调用格式分别为:$(selector).hide(speed,[callback]) ...

  8. android游戏动画特效的一些处理

    游戏中避免不了需要一些动画特效的处理,有些是不方便用美术或者美工来处理的,那么就由我们程序猿来搞了.直接进入正题. 首先是Animation,Animation针对view,可以控制view的位移.缩 ...

  9. 9个超绚丽的HTML5 3D图片动画特效

    在Web 1.0时代,我们的网页中图片数量非常少,而且都是以静态图片为主.HTML5的出现,推动了Web 2.0的发展,同时也催生出了很多绚丽的HTML5图片动画特效,特别是有些还有3D的动画效果.本 ...

随机推荐

  1. x86中的页表结构和页表项格式

    一.页表结构 分页转换功能由驻留在内存中的表来描述,该表称为页表(page table),存放在物理地址空间中.页表可看做简单的220个物理地址数组.线性到物理地址的映射功能可以简单地看做进行数组查找 ...

  2. Fragment与Activity交互(使用接口)

    在Fragment中: 1. // 定义一个回调接口,该Fragment所在Activity需要实现该接口// 该Fragment将通过该接口与它所在的Activity交互 { public void ...

  3. php文件上传及头像预览

    php文件上传原理是通过form表单的enctype="multipart/form-data"属性将文件临时放到wamp文件夹中的tmp目录下,再通过后台php 程序将文件保存在 ...

  4. 关于C/C++中的“auto”

    C/C++ 98标准 C++03标准 意思完全一样:auto被解释为一个自动存储变量的关键字,也就是申明一块临时的变量内存.auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当 ...

  5. Excel单元格所在的行和列变色

    网友问到如何通过移动光标选择单元格,所在的行和列变色.如每次输入价格的时候,想想在横竖方向上有颜色标识,这样方便对照输入价格 . 这里可以使用窗体的Worksheet_SelectionChange ...

  6. springmvc中返回页面,只在iframe中跳转,而不是整个页面,解决方法。

    问题描述:在我写的主页面中用到了iframe,其中在iframe中有一个button点击提交,然后在Controller中返回页面的时候,是在iframe中打开的,而不是整个页面. 最开始我想用aja ...

  7. asp.net小技巧:保留password模式文本框textbox内的数据不丢失。

    在asp.net 2.0环境下,使用textbox,提交到服务器再传回,如果textbox是password模式的,那么textbox内的密码(星号.圆点),就没有了! 一个可行的做法是 : prot ...

  8. Ueditor文件上传问题

    我们在做一些网站是会遇到,要有上传文件一类的事情. 我发现百度的富文本编辑器带上传功能,但是没有办法给后台传递我们要的参数. 先在ueditor.all.js中找到, me.execCommand(' ...

  9. [转]numpy中的matrix矩阵处理

    今天看文档发现numpy并不推荐使用matrix类型.主要是因为array才是numpy的标准类型,并且基本上各种函数都有队array类型的处理,而matrix只是一部分支持而已. 这个转载还是先放着 ...

  10. fpga之显示字符串

    //必须在有效区域下显示颜色才有颜色 显示字符可以在设定一个有效区域内显示 另加两个wire 求出新的x,ymodule vga_fpga( clk,rst_n, vga_b,vga_g,vga_r, ...