自定义GridLayout实现条目的拖动动画特效
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实现条目的拖动动画特效的更多相关文章
- [置顶] android 自定义ListView实现动画特效
通过自定义ListView实现动画特效,被点击元素A向前移,A之前元素往后移动. 重点在于动画的实现: 具体代码如下: package com.open.widget; import java.uti ...
- paip.关于动画特效原理 html js 框架总结
paip.关于动画特效原理 html js 框架总结 1. 动画框架的来源:flex,jqueryui 3 2. 特效的分类 3 2.1. Property effects 动态改变一个或多个目标对象 ...
- 10款基于jquery的web前端动画特效
1.jQuery横向手风琴图片切换动画 之前我们为大家分享过很多款基于jQuery和CSS3的手风琴菜单和手风琴焦点图插件,比如CSS3响应式垂直手风琴菜单和jQuery横向手风琴图片展示插件.今天要 ...
- 分享8款令人惊叹的HTML5 Canvas动画特效
HTML5的确可以制作出非常绚丽的网页动画效果,尤其是利用HTML5 Canvas特性和HTML5 3D特性,我们更加可以欣赏到超酷的动画特效.今天我从html5tricks网站上整理了8款令人惊叹的 ...
- jQuery动画特效实例教程
本文以实例形式详细讲述了jQuery动画特效的实现方法. 1.自制折叠内容块 内容块如下: <div class="module"> <div cla ...
- 有时候就是看不进论文-jQuery动画特效篇&MySQL
hi 早上知道新的乱斗模式后,没忍住开了几把,然后就无心论文了...用这个来破吧 1.jQuery -----动画特效----- ----调用show()和hide()方法显示和隐藏元素 show() ...
- 三、jQuery--jQuery基础--jQuery基础课程--第7章 jQuery 动画特效
1.调用show()和hide()方法显示和隐藏元素 show()和hide()方法用于显示或隐藏页面中的元素,它的调用格式分别为:$(selector).hide(speed,[callback]) ...
- android游戏动画特效的一些处理
游戏中避免不了需要一些动画特效的处理,有些是不方便用美术或者美工来处理的,那么就由我们程序猿来搞了.直接进入正题. 首先是Animation,Animation针对view,可以控制view的位移.缩 ...
- 9个超绚丽的HTML5 3D图片动画特效
在Web 1.0时代,我们的网页中图片数量非常少,而且都是以静态图片为主.HTML5的出现,推动了Web 2.0的发展,同时也催生出了很多绚丽的HTML5图片动画特效,特别是有些还有3D的动画效果.本 ...
随机推荐
- Struts入门(二) 配置文件的讲解
上一章我们演示了Struts项目的搭建 可以看到里面有几个重要的配置文件 下面我们来说明一下这3个配置文件 1.web.xml 2.strtus.xml 3.struts.properties 1 ...
- 软件各种版本的含义!例如RC,M,GA等等
RC版本 RC:(Release Candidate) Candidate是候选人的意思,用在软件上就是候选版本.Release是发行.发布的意思.Release.Candidate.就是发行 ...
- Leaving Auction
Leaving Auction 题目链接:http://codeforces.com/contest/749/problem/D 二分 本来以为是哪种神奇的数据结构,没想到sort+lower_bon ...
- GC(垃圾回收)
Java程序的内存分配和回收都是由JRE在后台自动进行的.JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收GC.通常JRE会提供一条超级线程来进行检测和控制,一般都是在CPU空闲或内存不足时 ...
- 最强DE 战斗力 (nyoj 541)
题解链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=541 几天前百度题解后用数学知识AC的,后来大牛说这是一道动态规划题. 网上的数学解题链接 ...
- Elasticsearch 5.0 安装 Search Guard 5 插件 (五)
一.Search Guard 简介 Search Guard 是 Elasticsearch 的安全插件.它为后端系统(如LDAP或Kerberos)提供身份验证和授权,并向Elasticsearc ...
- Discuz! X3.2重置管理员账号
主要是使用了Tools急诊箱.先看一下Tools急诊箱的主要功能: 多种模式在线安装Discuz!,或者重装 重置管理员账号:将把您指定的会员设置为管理员 关闭功能:一键关闭/打开 [站点|插件]的操 ...
- 移动web开发学习笔记一
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0&quo ...
- android studio 程序错误
一.错误类型: com.android.tools.fd.runtime.BootstrapApplication cannot be cast to 成功修改方式 File --> Setti ...
- Python学习笔记——基础篇【第七周】———进程、线程、协程篇(socket基础)
http://www.cnblogs.com/wupeiqi/articles/5040823.htmlhttp://i.cnblogs.com/EditPosts.aspx?postid=55437 ...