日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

android - scrollView和listview滑動沖突

瀏覽:218日期:2024-08-27 08:24:59

問題描述

在scrollview內嵌套了一個viewpager,重寫了scrollview的onInterceptTouchEvent()方法,但是我寫的沒有什么效果,最近剛剛接觸這個滑動沖突不能很好理解。

public class ScrollViewX extends ScrollView { private static final String TAG = 'ScrollViewX'; private ViewPager mViewPager; private int mLastXIntercepted = 0; private int mLastYIntercepted = 0; public ScrollViewX(Context context) {super(context); } public ScrollViewX(Context context, AttributeSet attrs) {super(context, attrs); } public ScrollViewX(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) {boolean intercepted = false;int x = (int) ev.getX();int y = (int) ev.getY();int deltaX = x - mLastXIntercepted;int deltaY = y - mLastYIntercepted;mLastXIntercepted = x;mLastYIntercepted = y;switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: {//action_down不攔截intercepted = false;break; } case MotionEvent.ACTION_MOVE: {if(mViewPager != null && isTouchInView(mViewPager, ev)){ //點擊事件發生在viewpager范圍內 if(Math.abs(deltaY) > Math.abs(deltaX)) {//如果豎直方向的滑動距離大于橫向, 那么scrollview攔截intercepted = true; } else {intercepted = false; }} else { intercepted = false;}break; } case MotionEvent.ACTION_UP: {intercepted = false;break; } default: break;}return intercepted; } //判斷點擊事件是否在當前view中 private boolean isTouchInView(View view, MotionEvent event) {int x = (int) event.getRawX();int y = (int) event.getRawY();int[] local = new int[2];view.getLocationOnScreen(local);int subVX = local[0];int subVY = local[1];int subWidth = view.getWidth();int subHeight = view.getHeight();if(x > subVX && x < subVX + subWidth && y > subVY && y < subVY + subHeight) { return true;}return false; } public void setViewPager(ViewPager viewPager) {mViewPager = viewPager; }}

android - scrollView和listview滑動沖突

我在紅色部分左右滑動viewpager能夠正常,但是在viewpager中豎直滑動就不能滾動scrollview,但是我覺得我在scrollview的onInterceptTouchEvent()方法中已經判斷了,但是最終卻沒有效果。

感謝采納的那位,根據他的提示, 我順便解決了listview的滑動沖突。 現在使用外部攔截法: 重寫ScrollView 的 onInterceptedTouchEvent() 方法,

public class ScrollViewX extends ScrollView { private static final String TAG = 'ScrollViewX'; private ListViewX mListViewX; private ViewPager mViewPager; private int mLastX = 0; private int mLastY = 0; public ScrollViewX(Context context) {super(context); } public ScrollViewX(Context context, AttributeSet attrs) {super(context, attrs); } public ScrollViewX(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) {boolean intercepted = false;int x = (int) ev.getX();int y = (int) ev.getY();int deltaX = x - mLastX;int deltaY = y - mLastY;Log.i(TAG, 'deltaY = ' + deltaY);mLastX = x;mLastY = y;switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: {return super.onInterceptTouchEvent(ev); } case MotionEvent.ACTION_MOVE: {if(mViewPager != null && isTouchInView(mViewPager, ev)){ //點擊事件發生在viewpager范圍內 if(Math.abs(deltaY) > Math.abs(deltaX)) {//如果豎直方向的滑動距離大于橫向, 那么scrollview攔截return true; } else {return super.onInterceptTouchEvent(ev); }} else if(mListViewX != null && isTouchInView(mListViewX, ev)) { if(atTopOrEnd(deltaY)) {return true; } else {return false; }} else { return super.onInterceptTouchEvent(ev);} } case MotionEvent.ACTION_UP: {return super.onInterceptTouchEvent(ev); } default:break;}return super.onInterceptTouchEvent(ev); } //如果listView滑到頂端時當前事件向上滑動,需要scrollview接管, 在底端時類似。 private boolean atTopOrEnd(int len) {int count = mListViewX.getCount();int topId = mListViewX.getFirstVisiblePosition();int endId = mListViewX.getLastVisiblePosition();if((endId == count - 1 && len < 0)) { View lastView = mListViewX.getChildAt(mListViewX.getChildCount() - 1); if(lastView.getBottom() == mListViewX.getHeight()) {return true; }}if(topId == 0 && len > 0) { View firstView = mListViewX.getChildAt(topId); if(firstView.getTop() == 0) {return true; }}return false; } //判斷點擊事件是否在當前view中 private boolean isTouchInView(View view, MotionEvent event) {int x = (int) event.getRawX();int y = (int) event.getRawY();int[] local = new int[2];view.getLocationOnScreen(local);int subVX = local[0];int subVY = local[1];int subWidth = view.getWidth();int subHeight = view.getHeight();if(x > subVX && x < subVX + subWidth && y > subVY && y < subVY + subHeight) { return true;}return false; } public void setListViewX(ListViewX listViewX) {mListViewX = listViewX; } public void setViewPager(ViewPager viewPager) {mViewPager = viewPager; }}

采用內部攔截法: 重寫listview 的 dispatchTouchEvent() 方法

public class ListViewX extends ListView { private static final String TAG = 'ListViewX'; private int mLastX = 0; private int mLastY = 0; public ListViewX(Context context) {super(context); } public ListViewX(Context context, AttributeSet attrs) {super(context, attrs); } public ListViewX(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr); } //ListView 在 ScrollView中顯示需要處理 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int width;int height;if(widthMode == MeasureSpec.AT_MOST && heightMode == MeasureSpec.AT_MOST) { width = MeasureSpec.makeMeasureSpec(500, MeasureSpec.AT_MOST); height = MeasureSpec.makeMeasureSpec(500, MeasureSpec.AT_MOST);} else if(widthMode == MeasureSpec.AT_MOST) { width = MeasureSpec.makeMeasureSpec(500, MeasureSpec.AT_MOST); height = heightMeasureSpec;} else if(heightMode == MeasureSpec.AT_MOST) { width = widthMeasureSpec; height = MeasureSpec.makeMeasureSpec(500, MeasureSpec.AT_MOST);} else { width = widthMeasureSpec; height = heightMeasureSpec;}super.onMeasure(width, height); } //requestDisallowInterceptTouchEvent參數為false表示父容器攔截 @Override public boolean dispatchTouchEvent(MotionEvent ev) {int x = (int) ev.getX();int y = (int) ev.getY();switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: {//父容器不攔截getParent().requestDisallowInterceptTouchEvent(true);break; } case MotionEvent.ACTION_MOVE: {int deltaX = x - mLastX;int deltaY = y - mLastY;if(atTopOrEnd(deltaY)) { getParent().requestDisallowInterceptTouchEvent(false);}break; } case MotionEvent.ACTION_UP: {break; } default:break;}mLastX = x;mLastY = y;return super.dispatchTouchEvent(ev); } //如果listView滑到頂端時當前事件向上滑動,需要scrollview接管, 在底端時類似。 private boolean atTopOrEnd(int len) {int count = getCount();int topId = getFirstVisiblePosition();int endId = getLastVisiblePosition();if((endId == count - 1 && len < 0)) { View lastView = getChildAt(getChildCount() - 1); if(lastView.getBottom() == getHeight()) {return true; }}if(topId == 0 && len > 0) { View firstView = getChildAt(topId); if(firstView.getTop() == 0) {return true; }}return false; }}

問題解答

回答1:

因為ViewPager的onTouch事件已經“吃掉”了手勢,你可以重寫ViewPager的onTouch事件,假如手勢是豎直方向的移動,return false

回答2:

要重寫listview的測量子Item的寬高的方法,你這個網上搜一下很多的

相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
蜜臀91精品国产高清在线观看| 99国产精品久久久久久久 | 国产成人a视频高清在线观看| 日韩精品福利一区二区三区| 亚洲丝袜美腿一区| 亚洲aⅴ网站| 欧美日韩1区| 国产精品大片免费观看| 久久久精品区| 日韩和的一区二在线| 伊人久久av| 激情欧美一区| 天堂成人免费av电影一区 | 欧美精品日日操| 欧美一区二区三区激情视频| 极品裸体白嫩激情啪啪国产精品| 欧美日韩视频一区二区三区| 国产国产精品| 婷婷亚洲成人| 无码日韩精品一区二区免费| 91精品视频一区二区| 日韩av三区| 国产探花一区在线观看| 精品国产麻豆| 欧美69视频| 亚洲午夜国产成人| 国产精品中文| 激情综合激情| 日韩在线麻豆| 国产精品国产三级在线观看| 久久精品一本| 久久久精品网| 综合亚洲视频| 国产精品久久久久久久久久齐齐 | 亚洲一区中文| 国产日韩一区| 91精品韩国| 综合激情网站| 开心激情综合| 欧美午夜不卡影院在线观看完整版免费| 亚洲精品观看| 激情不卡一区二区三区视频在线| 欧美1级日本1级| 国产亚洲精品美女久久| 欧美黄色网页| 日韩毛片一区| 91视频一区| 免费在线视频一区| 免费在线观看一区| 欧美日韩视频一区二区三区| 国产精品v日韩精品v欧美精品网站| 日本欧美不卡| 日韩国产在线观看一区| 色婷婷精品视频| 国产日韩一区二区三区在线播放| 久久免费黄色| 国产乱码精品| 国产一级久久| 国产一区二区三区久久久久久久久| 亚洲二区精品| 欧美经典一区| 1024精品久久久久久久久| 91精品视频一区二区| 欧美日一区二区| 国产精品欧美在线观看| 在线一区电影| 高清久久精品| 欧美一区精品| 制服诱惑一区二区| 国产精品久久久久久久免费观看 | 成人看片网站| 国产乱人伦精品一区| 国产精品日韩欧美一区| 丁香婷婷久久| 久久精品97| 亚洲欧美网站| 日韩精品影视| 精品国产91| 国产日韩欧美三级| 亚洲人成高清| 国产美女一区| 日韩精品dvd| 国产乱码精品| 亚洲精品系列| 日韩精品免费一区二区三区| 日韩精品视频网站| 美女被久久久| 婷婷成人基地| 精品欧美一区二区三区在线观看| 国产精品久久国产愉拍| 日韩欧美三区| 丝袜亚洲另类欧美| 五月精品视频| 国产专区一区| 91精品一区二区三区综合| 国产精品蜜芽在线观看| 久久丁香四色| 国产探花一区二区| 日本成人中文字幕在线视频| 久久xxxx| 午夜欧美视频| 亚洲黄色影院| jiujiure精品视频播放| 群体交乱之放荡娇妻一区二区| 久久只有精品| 精品国产精品久久一区免费式| 久久国产三级| 国产精品一区三区在线观看| 日韩av一二三| 国产图片一区| 国产精品极品| 国产精品高潮呻吟久久久久| 国产剧情在线观看一区| 国产精品一区毛片| 国产精品视频首页| 日韩av不卡一区二区| 日本欧美一区二区| 日本精品久久| 91精品国产一区二区在线观看| 日本va欧美va精品| 国产麻豆精品| 精品视频一区二区三区四区五区 | 国产综合亚洲精品一区二| 亚洲成a人片| 天堂日韩电影| 日韩视频在线一区二区三区 | 国产精品久久久久久模特| 国产精品亚洲片在线播放| 国产私拍福利精品视频二区| 国产精品一二| 精品精品99| 成人精品亚洲| 激情久久五月| 亚洲色图网站| 国产精品分类| 日韩欧美精品| 欧美日韩一二| 水蜜桃久久夜色精品一区的特点| 视频一区二区欧美| 亚洲精品系列| 日本一不卡视频| 国产欧美日韩一区二区三区在线| 国产日韩亚洲欧美精品| 久久伊人久久| 高清av不卡| 好吊一区二区三区| 亚洲97av| 国产精品激情电影| 日韩欧美1区| 亚洲男女自偷自拍| 日本在线不卡视频一二三区| 麻豆精品在线视频| 人人香蕉久久| 热久久免费视频| 欧美激情日韩| 国产精选在线| 欧美网站在线| 综合亚洲自拍| 国产精品videosex极品| 波多视频一区| 午夜欧美精品| 天堂久久一区| 国产精品啊v在线| 美女av在线免费看| 美日韩精品视频| 欧美日韩一区二区三区四区在线观看 | 日本三级亚洲精品| 国产精品日韩精品在线播放| 高清不卡一区| 亚洲激情国产| 国产欧美日韩影院| 香蕉成人av| 狠狠干成人综合网| 日韩三级精品| www在线观看黄色| 欧美精品九九| 国产色噜噜噜91在线精品| 91视频一区| 香蕉久久国产| 麻豆精品视频在线观看| 久久久久久久久丰满| 综合亚洲色图| 日本黄色精品| 国产色综合网| 久久99视频| 久久婷婷激情| 欧美日韩一视频区二区| 成人污污视频| 亚洲一区区二区| 久久伊人国产| 麻豆亚洲精品| 天堂8中文在线最新版在线| 亚洲欧洲日韩| 日韩欧美1区| 日韩高清在线不卡| 久久精品亚洲人成影院| 欧美在线看片| 欧美日韩国产免费观看| 国产高清日韩| 亚洲欧美激情诱惑|