怎么实现直播间多个ImageView拖拽互换图片

这篇文章主要讲解了“怎么实现直播间多个ImageView拖拽互换图片”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现直播间多个ImageView拖拽互换图片”吧!

创新互联公司长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为新绛企业提供专业的成都做网站、网站设计,新绛网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。

首先是XML文件代码:


                
 
                    
 
                
 
                
 
                    
 
                
 

重点注意,两个ImageView要分别用Layout单独装起来,后面会说原因

接下来是初始化:

 mImg0 = findViewById(R.id.release_img0);
 mImg1 = findViewById(R.id.release_img1);
mImg0_layout = findViewById(R.id.release_img0_layout);
mImg1_layout = findViewById(R.id.release_img1_layout);
//添加ImageView的触摸监听和各自父布局的拖拽监听
 mImg0.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg0_layout.setOnDragListener(ImgUtils.MyDragListener);
 mImg1.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg1_layout.setOnDragListener(ImgUtils.MyDragListener);

监听详情:

public class ImgUtils {
    private static long lastTime;
    public static View.OnTouchListener MyTouchEvent = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                LogUtils.loge("ACTION_DOWN");
                long lastTime1 = System.currentTimeMillis();
 
                lastTime=lastTime1;
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                v.startDrag(data, shadowBuilder, v, 0);
                if ((lastTime1-lastTime)<200){
                    v.setAlpha((float) 1.0);
                    return false;
                }
                v.setAlpha((float) 0.5);
            } else if (event.getAction() == MotionEvent.ACTION_UP){
                LogUtils.loge("ACTION_UP");
                long time = System.currentTimeMillis();
                if ((time - lastTime)<500){ // 间隔小于500毫秒,视为点击事件
                    return false;
                }
            }else if (event.getAction() == MotionEvent.ACTION_MOVE){
                LogUtils.loge("ACTION_MOVE");
            }
 
            return false;
 
        }
    };
 
    public static View.OnDragListener MyDragListener = new View.OnDragListener() {
 
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public boolean onDrag(View v, DragEvent event) {
            View visitorView = (View) event.getLocalState();
            if (visitorView == null) return true;
            ViewGroup visitorOwner = (ViewGroup) visitorView.getParent();
            ViewGroup visitedOwner = (ViewGroup) v;
            View visitedImage = visitedOwner.getChildAt(0);
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_ENTERED:
                    v.setAlpha((float)0.7);
                    break;
                case DragEvent.ACTION_DROP:
                    visitedImage.setAlpha((float)1.0);
                    if (visitorOwner != visitedOwner) {
                        visitedOwner.removeView(visitedImage);
                        visitorOwner.removeView(visitorView);
                        visitorOwner.addView(visitedImage);
                        LinearLayout container = (LinearLayout) v;
                        container.addView(visitorView);
                    }else {
                        visitedImage.performClick(); // 如果归复原位  响应点击事件
                    }
                    break;
                case DragEvent.ACTION_DRAG_ENDED:
                    v.setAlpha((float)1.0);
                    visitedImage.setAlpha((float)1.0);
                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    v.setAlpha((float)1.0);
                    break;
            }
            return true;
        }
    };
 
 
}

在这里,我将监听提出来写成了公共的静态方法,

一方面是为了复用,

另一方面是为了多个ImageView互相拖拽时候的多指拖动冲突.核心思想:判断子控件触摸监听的调用间隔.

另外,我这边处理了点击事件和滑动事件的冲突,核心思想:在父布局的拖拽监听里判断子控件拖出去是否放回了原处,如放回了原处,则调用子控件的模拟点击,

点击与滑动冲突的原因:

1.当滑动监听返回true的时候,消费了点击事件,导致点击事件无法触发(源码角度)

2.当OnTouchListener 中的按下事件开始执行拖动时,OnTouchListener 无法收到UP事件(受拖拽影响),

3.即使OnTouchListener 监听中写了返回false,仍然会因为开启了拖拽而被提前返true.

点击与滑动冲突的解决思想:

1.在父布局的拖拽监听中, 判断他的起点和终点是否在同一个layout中

2.如满足第一点条件,则获取layout的第一个孩子,执行孩子的点击事件(模拟点击performClick());

感谢各位的阅读,以上就是“怎么实现直播间多个ImageView拖拽互换图片”的内容了,经过本文的学习后,相信大家对怎么实现直播间多个ImageView拖拽互换图片这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


新闻标题:怎么实现直播间多个ImageView拖拽互换图片
网页链接:http://cdiso.cn/article/ppepps.html

其他资讯