這篇文章主要講解了“怎么實(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ā)。
重點(diǎn)注意,兩個(gè)ImageView要分別用Layout單獨(dú)裝起來(lái),后面會(huì)說(shuō)原因
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);
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)擊,
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.
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)注!