自定义可拖拽GridView控件

1、概述

项目要求一个可拖拽的gridview功能,主要是可以长按图标,然后手指移动到对应位置,松开后图标移动到对应手指松开的位置,后面的图标依次挪移一个position。

2、效果图

3、重写dispatchTouchEvent方法

    /** 
     * 长按的Runnable 
     */  
    private Runnable mLongClickRunable = new Runnable() {  
        @Override  
        public void run() {  
            isDrag = true;  
            //mVibrator.vibrate(200);  
            //隐藏该item  
            mDragView.setVisibility(INVISIBLE);  
            //在点击的地方创建并显示item镜像  
            createDragView(mDragBitmap, mDownX, mDownY);  
        }  
    };  
    /** 
     * 当moveY的值大于向上滚动的边界值,触发GridView自动向上滚动 
     * 当moveY的值小于向下滚动的边界值,触犯GridView自动向下滚动 
     * 否则不进行滚动 
     */  
    private Runnable mScrollRunbale = new Runnable() {  
        @Override  
        public void run() {  
            int scrollY = 0;  
            if (mMoveY > mUpScrollBorder){  
                scrollY = mSpeed;  
                mHandler.postDelayed(mScrollRunbale,25);  
            }else if (mMoveY < mDownScrollBorder){  
                scrollY = -mSpeed;  
                mHandler.postDelayed(mScrollRunbale,25);  
            }else {  
                scrollY = 0;  
                mHandler.removeCallbacks(mScrollRunbale);  
            }  
            smoothScrollBy(scrollY,10);  
        }  
    };  
复制代码

5、对外暴露的方法

    /************************对外提供的接口***************************************/  
    public boolean isDrag() {  
        return isDrag;  
    }  
    //设置是否可拖拽  
    public void setDrag(boolean drag) {  
        isDrag = drag;  
    }  
    public long getDragResponseMs() {  
        return mDragResponseMs;  
    }  
    //设置长按响应时长  
    public void setDragResponseMs(long mDragResponseMs) {  
        this.mDragResponseMs = mDragResponseMs;  
    }  
    public void setOnItemChangeListener(OnItemChangeListener changeListener) {  
        this.changeListener = changeListener;  
    }  
    /******************************************************************************/  
复制代码

6、如何在页面中调用

    DragGridView dragGridView = findViewById(R.id.dgv);  
    dragGridView.setNumColumns(NUM_COLUMNS);  
    initData();  
    mMoreColorTypeAdapter = new MoreColorTypeAdapter(this, true, data, NUM_COLUMNS);  
    dragGridView.setAdapter(mMoreColorTypeAdapter);  
    dragGridView.setOnItemClickListener(this);  
    dragGridView.setOnItemChangeListener(new DragGridView.OnItemChangeListener() {  
        @Override  
        public void onChange(int from, int to) {  
            Data dataBean = data.get(from);  
            //直接交互  
            //Collections.swap(dataSourceList,from,to);  
            //非直接交互 这里的处理需要注意下 排序交换  
            if(from < to){  
                for(int i = from; i < to; i++){  
                    Collections.swap(data, i, i + 1);  
                }  
            }else if(from > to){  
                for(int i = from; i > to; i--){  
                    Collections.swap(data, i, i - 1);  
                }  
            }  
            data.set(to, dataBean);  
            mMoreColorTypeAdapter.notifyDataSetChanged();  
        }  
        @Override  
        public void onStop() {  
            //拖动停止  
        }  
    });  
复制代码

源码下载地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值