自定义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的动画效果.本 ...
随机推荐
- codeforces 6A. Triangle
A. Triangle time limit per test 2 seconds memory limit per test 64 megabytes input standard input ou ...
- java nio io模型
I/O模型 在开始NIO的学习之前,先对I/O的模型有一个理解,这对NIO的学习是绝对有好处的.我画一张图,简单表示一下数据从外部磁盘向运行中进程的内存区域移动的过程: 这张图片明显忽略了很多细节,只 ...
- Java代码到字节码——第一部分
Java代码到字节码——第一部分 原文地址 作者:James Bloom 译者:张坤 理解在Java虚拟机中Java代码如何别被编译成字节码并执行是非常重要的,因为这可以帮助你理解你的程序在运行时发生 ...
- 程序员快围观!2016年最受欢迎中国开源软件TOP 20
[PConline 资讯]开源软件对程序员来说是一个经常接触的软件,作为一个经常接触的软件,当然想知道自己用的软件受欢迎程度,基于此,开源中国在近日公布"2016年度最受欢迎中国开源软件评选 ...
- HTTP could not register URL http://+:86/. 设置VS默认以管理员权限打开
在使用visual studio 2013启动self host webapi时候碰到下面的错误: 详细错误信息如下: HTTP could not register URL http://+:8 ...
- 初次配置eclipse, jdk, tomcat, maven, mysql, alt+/
eclipse 官网下载eclipse-inst-win64.exe, 选择安装java ee. jdk 官网下载jdk-8u102-windows-x64.exe, next到底. 接下来配置环境变 ...
- 【C#】Send data between applications
This sample shows how to send data between different applications, including object data——transform ...
- Gpt转mbr
1)Shift + F10 2)diskpart 3)list disk 4)select dist 0 5)clean 6)convert mbr [注]mbr常用于windows操作系统,而gpt ...
- Attribute value is quoted with " which must be escaped when used within the value 问题解决
访问JSP时,报错:Attribute value is quoted with " which must be escaped when used within the value .相信 ...
- 使用signalR创建聊天室。
浏览器支持Html5的情况下,SignalR使用WebSockets,当不支持时SignalR将使用其它技术来实现通讯. 界面如下:左侧包含三种聊天对象,不同的聊天对象会创建不同的对话框. 设计思路参 ...