Android下拉刷新與輪播圖滑動(dòng)沖突解決方案
最近在開(kāi)發(fā)中遇到了這樣一個(gè)問(wèn)題,在下拉刷新組件中包含了一個(gè)輪播圖組件,當(dāng)左右滑動(dòng)的圖片時(shí)很容易觸發(fā)下拉刷新,如下圖所示:

如圖中紅色箭頭所示方向切換輪播圖,很容易觸發(fā)下拉刷新。網(wǎng)上查了很多方法,發(fā)現(xiàn)都不能很好的解決,于是自己研究了下。
我選用的第三方控件
1.下拉刷新我選用的是chanven的CommonPullToRefresh(系統(tǒng)自帶的SwipeRefreshLayout也應(yīng)該是一樣的道理);
2.輪播圖選用的是daimajia的AndroidImageSlider(用ViewPager也是一樣的道理)。具體界面自行腦補(bǔ)哈。
解決方案
我們仔細(xì)分析一下,我們要解決的實(shí)際上就是控件的事件攔截問(wèn)題。現(xiàn)在的情況是外層的控件已經(jīng)攔截了斜著滑動(dòng)的事件,那么我們只要讓外層的控件把這個(gè)事件分發(fā)下去就可以了【在dispatchTouchEvent(MotionEvent ev)方法中處理】,那么問(wèn)題來(lái)了,怎么判斷斜著的事件。網(wǎng)上有很多方案,但都不是很完美。我想到了一種,跟大家分享一下,先看圖:

方案分析
1.圖一中x=y,作為臨界條件,這時(shí)α剛好等于45°;
2.圖二中x<y,α>45°,這時(shí)我們判斷為上下移動(dòng);
3.圖三中x>y,α<45°,這時(shí)我們判斷為左右移動(dòng)。
那么我們只要判斷tan(α)與tan(45)的關(guān)系就能判斷是左右還是上下移動(dòng)。我們寫(xiě)一個(gè)類繼承PtrClassicFrameLayout,下面是關(guān)鍵代碼:
public class SubPtrClassicFrameLayout extends PtrClassicFrameLayout {
private float mDownX;
private float mDownY;
public SubPtrClassicFrameLayout(Context context) {
super(context);
}
public SubPtrClassicFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SubPtrClassicFrameLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getRawY();
break;
case MotionEvent.ACTION_MOVE:
float moveX = ev.getX();
float moveY = ev.getRawY();
float diffX = Math.abs(moveX - mDownX);
float diffY = Math.abs(moveY - mDownY);
boolean isHorizon = Math.tan(diffY / diffX) < Math.tan(45.0);
if (isHorizon) {
return dispatchTouchEventSupper(ev);
}
break;
}
return super.dispatchTouchEvent(ev);
}
}
我們可以看到,其實(shí)很簡(jiǎn)單,關(guān)鍵就是判斷當(dāng)前位置相對(duì)于初始位置的滑動(dòng)方向。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android自定義控件實(shí)現(xiàn)簡(jiǎn)單的輪播圖控件
- Android ViewPager實(shí)現(xiàn)輪播圖效果
- Android自定義控件實(shí)現(xiàn)優(yōu)雅的廣告輪播圖
- Android實(shí)現(xiàn)基于ViewPager的無(wú)限循環(huán)自動(dòng)播放帶指示器的輪播圖CarouselFigureView控件
- Android如何使用RecyclerView打造首頁(yè)輪播圖
- 簡(jiǎn)單實(shí)現(xiàn)android輪播圖
- Android開(kāi)發(fā)在輪播圖片上加入點(diǎn)擊事件的方法
- Android實(shí)現(xiàn)輪播圖無(wú)限循環(huán)效果
- Android實(shí)現(xiàn)ViewPage輪播圖效果
- android常見(jiàn)手動(dòng)和自動(dòng)輪播圖效果
相關(guān)文章
Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例
這篇文章主要介紹了Android Studio Kotlin代碼和java代碼相互轉(zhuǎn)化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Android N獲取外置SD卡或掛載U盤(pán)路徑的方法
今天小編就為大家分享一篇Android N獲取外置SD卡或掛載U盤(pán)路徑的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android學(xué)習(xí)之Intent中顯示意圖和隱式意圖的用法實(shí)例分析
這篇文章主要介紹了Android學(xué)習(xí)之Intent中顯示意圖和隱式意圖的用法,以實(shí)例形式分析了Intent通訊的相關(guān)技巧與注意事項(xiàng),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android App在ViewPager中使用Fragment的實(shí)例講解
這篇文章主要介紹了Android App在ViewPager中使用Fragment的實(shí)例講解,ViewPager組件主要被用來(lái)制作滑動(dòng)切換效果,需要的朋友可以參考下2016-03-03
Android ListView與ScrollView沖突的解決方法總結(jié)
這篇文章主要介紹了Android ListView與ScrollView沖突的解決方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android實(shí)現(xiàn)Camera2預(yù)覽和拍照效果
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)之一個(gè)類實(shí)現(xiàn)Camera2預(yù)覽和拍照效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
Android開(kāi)發(fā)中RecyclerView組件使用的一些進(jìn)階技講解
RecyclerView是Android 5.0以來(lái)新加入的一個(gè)組件,基本上全面優(yōu)于ListView,這里我們將來(lái)關(guān)注Android開(kāi)發(fā)中RecyclerView組件使用的一些進(jìn)階技講解:2016-06-06

