自定义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;
    }
时间: 2024-12-16 07:02:08

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

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

1.jQuery横向手风琴图片切换动画 之前我们为大家分享过很多款基于jQuery和CSS3的手风琴菜单和手风琴焦点图插件,比如CSS3响应式垂直手风琴菜单和jQuery横向手风琴图片展示插件.今天要介绍的也是一款基于jQuery的横向手风琴图片切换动画,鼠标滑过图片时即可展开,并且图片上方有文字标题,非常实用. 在线演示 源码下载 2.jQuery/CSS3渐变颜色拾取器 之前我们向大家分享过一款功能十分强大的jQuery颜色拾取器,支持透明度的选取.今天要为大家介绍的同样是一款基于jQuer

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

paip.关于动画特效原理 html js 框架总结 1. 动画框架的来源:flex,jqueryui 3 2. 特效的分类 3 2.1. Property effects 动态改变一个或多个目标对象的属性 (Animate.Fade, Resize, and AnimateColor) 4 2.2. Transform effects 缩入.旋转和位置的改变 .(Move, Rotate, and Scale) 4 2.3. Pixel-shader effects 主要是针对图片象素着色的动

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

hi 早上知道新的乱斗模式后,没忍住开了几把,然后就无心论文了...用这个来破吧 1.jQuery -----动画特效----- ----调用show()和hide()方法显示和隐藏元素 show()和hide()方法用于显示或隐藏页面中的元素,它的调用格式分别为: $(selector).hide(speed,[callback])和$(selector).show(speed,[callback]) 参数speed设置隐藏或显示时的速度值,可为“slow”.“fast”或毫秒数值,可选项参数

分享web前端七款HTML5 Loading动画特效集锦

以前我们大部分的Loading动画都是利用gif图片实现的,这种图片实现Loading动画的方法虽然也很不错,但是作为HTML5开发者来说,如果能利用HTML5和CSS3实现这些超酷的Loading动画,那将是一件非常痛快的事情. 1.HTML5 Canvas发光Loading动画 之前我们分享过很多基于CSS3的Loading动画效果,相信大家都很喜欢.今天我们要来分享一款基于HTML5 Canvas的发光Loading加载动画特效.Loading旋转图标是在canvas画布上绘制的,整个lo

惊艳的HTML5动画特效及源码

今天我们要来分享一些很酷的HTML5动画演示,HTML5的强大之处在于它可以利用canvas的特性来绘制很多普通网页无法完成的图形和动画,canvas就像一块超级画板,在上面不仅可以实现平面图形,而且一些3D动画也非常简单.很多HTML5动画也都基于canvas,一起来看看吧. HTML5/CSS3实现大风车旋转动画 作为今天首款HTML5动画,这款大风车旋转效果的确非常棒,它是用纯CSS3实现. 核心CSS代码: .wmd1{ -webkit-transform: scale(.6); pos

Android ListView动画特效实现原理及源码

Android 动画分三种,其中属性动画为我们最常用动画,且能满足项目中开发几乎全部需求,google官方包支持3.0+,我们可以引用三方包nineoldandroids来失陪到低版本.本例子中就是用属性动画实现效果. 对普通的View做动画,我们只要定义好要的动画ObjectAnimator或AnimatorSet,然后设置属性启动及可.但是,对ListView做动画应该如何.什么时候.在什么地方.对哪个View做动画属性呢? github上有成熟的listview动画包 https://gi

jQuery动画特效实例教程

本文以实例形式详细讲述了jQuery动画特效的实现方法. 1.自制折叠内容块 内容块如下:   <div class="module">   <div class="caption">     <span>标题</span>     <img src="rollup.gif" alt="rollup" title="rolls up this module&quo

Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS

由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动画的Android视图切换动画特效库!SwitchLayout!可以说是目前Android上第一个,也是唯一的一个强大的视图切换动画库引擎! 作者:谭东 QQ:852041173 项目开源!推荐使用jar包形式! 没有经过作者允许,不可修改项目库源码自行发布. 如果你的项目中使用了SwtichLay

超酷创意分段式SVG文字动画特效

这是一款基于segment.js制作的非常有创意的分段式SVG文字动画特效.这个文字动画特效通过动画SVG的描边路径来制作各种文字的动画效果,效果非常的赞. 这个SVG文字动画特效的第一个DEMO中的最后几个例子使用了mo.js插件,一款由Oleg Solomka编写的用于制作网页图形动画的JavaScript库插件.通过mo.js,可以制作出效果更为震撼的文字动画效果. 在线预览   源码下载 特效中使用的字体是exquisite lowercase font,一套极富创意的WEB字体. 使用