您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”吧!
<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);
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)擊,
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.
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)注!
免責(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)容。