溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-10-29 13:49:18 來源:億速云 閱讀:136 作者:iii 欄目:編程語言

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

首先是XML文件代碼:

<LinearLayout                    
 android:layout_width="match_parent"                    
 android:layout_height="match_parent"
 android:orientation="horizontal"      >
                <LinearLayout
                    android:id="@+id/release_img0_layout"
                    android:layout_width="0px"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20px"
                    android:layout_weight="1">
 
                    <ImageView
                        android:id="@+id/release_img0"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:scaleType="centerCrop" />
 
                </LinearLayout>
 
                <LinearLayout
                    android:id="@+id/release_img1_layout"
                    android:layout_width="0px"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20px"
                    android:layout_weight="1">
 
                    <ImageView
                        android:id="@+id/release_img1"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:scaleType="centerCrop" />
 
                </LinearLayout>
 </LinearLayout>

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

接下來是初始化:

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

監(jiān)聽詳情:

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ài)方法,

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

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

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

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

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

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

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

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

1.在父布局的拖拽監(jiān)聽中, 判斷他的起點(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)過本文的學(xué)習(xí)后,相信大家對(duì)怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI