這篇文章主要講解了“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么實(shí)現(xiàn)直播間多個(gè)ImageView拖拽互換圖片”吧!
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、網(wǎng)站制作、潼南網(wǎng)絡(luò)推廣、重慶小程序開發(fā)、潼南網(wǎng)絡(luò)營銷、潼南企業(yè)策劃、潼南品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供潼南建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com重點(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)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!