真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片

這篇文章主要講解了“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”吧!

創(chuàng)新互聯(lián)公司長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為新絳企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站設(shè)計(jì),新絳網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

首先是XML文件代碼:


                
 
                    
 
                
 
                
 
                    
 
                
 

重點(diǎn)注意,兩個(gè)ImageView要分別用Layout單獨(dú)裝起來(lái),后面會(huì)說(shuō)原因

接下來(lái)是初始化:

 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的觸摸監(jiān)聽(tīng)和各自父布局的拖拽監(jiān)聽(tīng)
 mImg0.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg0_layout.setOnDragListener(ImgUtils.MyDragListener);
 mImg1.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg1_layout.setOnDragListener(ImgUtils.MyDragListener);

監(jiān)聽(tīng)詳情:

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毫秒,視為點(diǎn)擊事件
                    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(); // 如果歸復(fù)原位  響應(yīng)點(diǎn)擊事件
                    }
                    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;
        }
    };
 
 
}

在這里,我將監(jiān)聽(tīng)提出來(lái)寫(xiě)成了公共的靜態(tài)方法,

一方面是為了復(fù)用,

另一方面是為了多個(gè)ImageView互相拖拽時(shí)候的多指拖動(dòng)沖突.核心思想:判斷子控件觸摸監(jiān)聽(tīng)的調(diào)用間隔.

另外,我這邊處理了點(diǎn)擊事件和滑動(dòng)事件的沖突,核心思想:在父布局的拖拽監(jiān)聽(tīng)里判斷子控件拖出去是否放回了原處,如放回了原處,則調(diào)用子控件的模擬點(diǎn)擊,

點(diǎn)擊與滑動(dòng)沖突的原因:

1.當(dāng)滑動(dòng)監(jiān)聽(tīng)返回true的時(shí)候,消費(fèi)了點(diǎn)擊事件,導(dǎo)致點(diǎn)擊事件無(wú)法觸發(fā)(源碼角度)

2.當(dāng)OnTouchListener 中的按下事件開(kāi)始執(zhí)行拖動(dòng)時(shí),OnTouchListener 無(wú)法收到UP事件(受拖拽影響),

3.即使OnTouchListener 監(jiān)聽(tīng)中寫(xiě)了返回false,仍然會(huì)因?yàn)殚_(kāi)啟了拖拽而被提前返true.

點(diǎn)擊與滑動(dòng)沖突的解決思想:

1.在父布局的拖拽監(jiān)聽(tīng)中, 判斷他的起點(diǎn)和終點(diǎn)是否在同一個(gè)layout中

2.如滿足第一點(diǎn)條件,則獲取layout的第一個(gè)孩子,執(zhí)行孩子的點(diǎn)擊事件(模擬點(diǎn)擊performClick());

感謝各位的閱讀,以上就是“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!


文章名稱:怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片
文章源于:http://weahome.cn/article/ppepps.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部