中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

Android應(yīng)用的中滑動事件出現(xiàn)沖突如何解決

Android應(yīng)用的中滑動事件出現(xiàn)沖突如何解決?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),賀蘭企業(yè)網(wǎng)站建設(shè),賀蘭品牌網(wǎng)站建設(shè),網(wǎng)站定制,賀蘭網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,賀蘭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

外部攔截法

外部攔截法是指在有點擊事件時都要經(jīng)過父容器,那么在父容器時如果需要攔截就攔截自己處理,不需要則傳遞給下一層進(jìn)行處理,下面看個例子:

首先定義一個水平滑動的HorizontalScrollViewEx,看主要代碼

主要的攔截是需要重寫onInterceptTouchEvent

@Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 boolean intercepted = false; 
 int x = (int) ev.getX(); 
 int y = (int) ev.getY(); 
 switch (ev.getAction()) { 
 case MotionEvent.ACTION_DOWN: 
 //down事件不攔截,否則無法傳給子元素 
 intercepted = false; 
 if (!mScroller.isFinished()) { 
  mScroller.abortAnimation(); 
  intercepted = true; 
 } 
 break; 
 case MotionEvent.ACTION_MOVE: 
 int deltaX = x - mLastXIntercept; 
 int deltaY = y - mLastYIntercept; 
 //水平滑動則攔截 
 if (Math.abs(deltaX) > Math.abs(deltaY) + 5) { 
  intercepted = true; 
 } else { 
  intercepted = false; 
 } 
 break; 
 case MotionEvent.ACTION_UP: 
 //不攔截,否則子元素?zé)o法收到 
 intercepted = false; 
 break; 
 } 
 //因為當(dāng)ViewGroup中的子View可能消耗了down事件,在onTouchEvent無法獲取, 
 // 無法對mLastX賦初值,所以在這里賦值一次 
 mLastX = x; 
 mLastY = y; 
 mLastYIntercept = y; 
 mLastXIntercept = x; 
 return intercepted; 
 } 

在down事件不需要攔截,返回false,否則的話子view無法收到事件,將全部會由父容器處理,這不是希望的;up事件也要返回false,否則最后子view收不到。

看看move事件,當(dāng)水平滑動距離大于豎直距離時,代表水平滑動,返回true,由父類來進(jìn)行處理,否則交由子view處理。這里move事件就是主要的攔截條件判斷,如果你遇到的不是水平和豎直的條件這么簡單,就可以在這里進(jìn)行改變,比如,ScrollView嵌套了ListView,條件就變成,當(dāng)ListView滑動到底部或頂部時,返回true,交由父類滑動處理,否則自身ListView滑動。

在onTouchEvent中主要是做的滑動切換的處理

@Override 
 public boolean onTouchEvent(MotionEvent event) { 
 mVelocityTracker.addMovement(event); 
 int x = (int) event.getX(); 
 int y = (int) event.getY(); 
 switch (event.getAction()) { 
 case MotionEvent.ACTION_DOWN: 
 if (!mScroller.isFinished()) { 
  mScroller.abortAnimation(); 
 } 
 break; 
 case MotionEvent.ACTION_MOVE: 
 int deltaX = x - mLastX; 
 int deltaY = y - mLastY; 
 if (getScrollX() < 0) { 
  scrollTo(0, 0); 
 } 
 scrollBy(-deltaX, 0); 
 break; 
 case MotionEvent.ACTION_UP: 
 int scrollX = getScrollX(); 
 mVelocityTracker.computeCurrentVelocity(1000); 
 float xVelocityTracker = mVelocityTracker.getXVelocity(); 
 if (Math.abs(xVelocityTracker) > 50) {//速度大于50則滑動到下一個 
  mChildIndex = xVelocityTracker > 0 &#63; mChildIndex - 1 : mChildIndex + 1; 
 } else { 
  mChildIndex = (scrollX + mChildWith / 2) / mChildWith; 
 } 
 mChildIndex = Math.max(0, Math.min(mChildIndex, mChildrenSize - 1)); 
 int dx = mChildIndex * mChildWith - scrollX; 
 smoothScrollBy(dx, 0); 
 mVelocityTracker.clear(); 
 break; 
 } 
 mLastY = y; 
 mLastX = x; 
 return true; 
 } 

在這個嵌套一個普通的ListView,這樣就可以解決水平和豎直滑動沖突的問題了。

<com.example.lzy.customview.HorizontalScrollViewEx 
 android:layout_width="match_parent" 
 android:layout_height="200dp"> 
 
 <ListView 
 android:id="@+id/listView" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" /> 
 
 <Button 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:background="@android:color/holo_blue_bright" 
 android:text="2" /> 
 
 <Button 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:background="@android:color/holo_green_dark" 
 android:text="3" /> 
 </com.example.lzy.customview.HorizontalScrollViewEx> 

其他的部分代碼如果需要可以下載源碼來看

內(nèi)部攔截法

內(nèi)部攔截法是父容器不攔截任何事件,所有事件都傳遞給子view,如果需要就直接消耗掉,不需要再傳給父容器處理

下面重寫一個ListView,只需要重寫一個dispatchTouchEvent方法就OK

public class ListViewEx extends ListView { 
 
 private static final String TAG = "lzy"; 
 private int mLastX; 
 private int mLastY; 
 
 public ListViewEx(Context context) { 
 super(context); 
 } 
 
 public ListViewEx(Context context, AttributeSet attrs) { 
 super(context, attrs); 
 } 
 
 public ListViewEx(Context context, AttributeSet attrs, int defStyleAttr) { 
 super(context, attrs, defStyleAttr); 
 } 
 
 
 @Override 
 public boolean dispatchTouchEvent(MotionEvent ev) { 
 int x = (int) ev.getX(); 
 int y = (int) ev.getY(); 
 
 switch (ev.getAction()) { 
 case MotionEvent.ACTION_DOWN: 
 //子View的所有父ViewGroup都會跳過onInterceptTouchEvent的回調(diào) 
 getParent().requestDisallowInterceptTouchEvent(true); 
 break; 
 case MotionEvent.ACTION_MOVE: 
 int deltaX = x - mLastX; 
 int deltaY = y - mLastY; 
 if (Math.abs(deltaX) > Math.abs(deltaY) + 5) {//水平滑動,使得父類可以執(zhí)行onInterceptTouchEvent 
  getParent().requestDisallowInterceptTouchEvent(false); 
 } 
 break; 
 } 
 mLastX = x; 
 mLastY = y; 
 return super.dispatchTouchEvent(ev); 
 } 
} 

在down事件調(diào)用getParent().requestDisallowInterceptTouchEvent(true),這句代碼的意思是使這個view的父容器都會跳過onInterceptTouchEvent,在move中判斷如果是水平滑動就由父容器去處理,父容器只需要把之前的onInterceptTouchEvent改為下面那樣,其他不變。

@Override 
 public boolean onInterceptTouchEvent(MotionEvent ev) { 
 int x = (int) ev.getX(); 
 int y = (int) ev.getY(); 
 if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
 mLastX = x; 
 mLastY = y; 
 if (!mScroller.isFinished()) { 
 mScroller.abortAnimation(); 
 return true; 
 } 
 return false; 
 } else { 
 //如果是非down事件,說明子View并沒有攔截父類的onInterceptTouchEvent 
 //說明該事件交由父類處理,所以不需要再傳遞給子類,返回true 
 return true; 
 } 
 } 

關(guān)于Android應(yīng)用的中滑動事件出現(xiàn)沖突如何解決問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

新聞名稱:Android應(yīng)用的中滑動事件出現(xiàn)沖突如何解決
網(wǎng)頁鏈接:http://m.2m8n56k.cn/article30/ijjcpo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機動態(tài)網(wǎng)站網(wǎng)站設(shè)計公司ChatGPT品牌網(wǎng)站設(shè)計手機網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計
主站蜘蛛池模板: 一区二区三区网站在线免费线观看 | 国产素人在线观看 | 一级一片 | 欧美在线观看一区 | 成人精品第一区二区三区 | 亚洲欧美中文在线观看4 | 免费看欧美毛片大片免费看 | 在线免费观看国产视频 | 国产乱码精品一区二区三区卡 | 欧美日韩一区二区在线观看 | 99精品久久99久久久久久 | 三级毛片免费 | 免费岛国小视频在线观看 | 国产精品国产三级国产普通 | 视频精品一区二区 | 黄色三级理沦片 | 免费一级特黄欧美大片勹久久网 | 一级毛片一级毛片a毛片欧美 | 99久久精品视香蕉蕉er热资源 | 欧美人成在线 | 久草热在线观看 | 欧美一区二区三区免费高 | 美女网站在线观看视频18 | 久久精品国产亚洲a | 国产精品九九久久一区hh | 亚洲精品中文字幕久久久久久 | 91精品国产高清久久久久 | 99久久国产综合精品1尤物 | 国产黄色a三级三级三级 | 成人国产精品高清在线观看 | 国产v片在线播放免费观 | 操哭美女| 我看毛片 | 男人天堂视频网 | 欧美成人精品第一区 | 另类专区亚洲 | 午夜伦y4480影院中文字幕 | 亚洲欧美成人影院 | 亚洲一区二区三区久久久久 | 久草在线新视觉 | 中文字幕 亚洲精品 |