成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

android - scrollView和listview滑動沖突

瀏覽:185日期: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的寬高的方法,你這個網上搜一下很多的

相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
99精品热视频| 91麻豆精品久久久久蜜臀| 香蕉久久夜色精品| 国产精品久久三| 国产精品一区二区三区网站| 色吊一区二区三区| 一区二区三区免费网站| 欧美日本一区二区视频在线观看| 日韩网站在线看片你懂的| 狠狠色综合播放一区二区| 久久国产日本精品| 夜夜操天天操亚洲| 国产亚洲欧美另类一区二区三区| 国产精品美日韩| 国内精品久久久久久久影视麻豆 | 国产精品麻豆一区二区| 色综合天天做天天爱| 精品国产91乱码一区二区三区| 国产高清一区日本| 91精品综合久久久久久| 国产在线精品视频| 欧美一区二区三级| 国产精品77777竹菊影视小说| 欧美中文字幕一区二区三区亚洲 | 美女网站一区二区| 色噜噜狠狠色综合欧洲selulu| 亚洲综合色视频| 一区二区毛片| 亚洲免费观看高清完整版在线观看熊 | 午夜视频一区在线观看| 国产精品毛片一区二区三区| 夜夜夜精品看看| 亚洲综合视频一区| 亚洲一区二区视频| 久久精品动漫| 美国十次了思思久久精品导航| 欧美视频中文一区二区三区在线观看| 久久99热狠狠色一区二区| 久久久久九九九| 日本v片在线高清不卡在线观看| 91福利视频网站| 免费高清成人在线| 欧美日韩一区久久| 粉嫩一区二区三区在线看| 久久这里只有精品6| 国产主播一区| 亚洲综合999| 久久综合伊人| 精品无人码麻豆乱码1区2区| 欧美人伦禁忌dvd放荡欲情| 国产老肥熟一区二区三区| 欧美成人一区二区三区片免费| 99久久亚洲一区二区三区青草| 久久免费电影网| 亚洲午夜视频| 久久蜜桃av一区精品变态类天堂 | 亚洲自拍高清| 麻豆精品在线播放| 日韩欧美亚洲国产另类| 欧美日韩精选| 亚洲国产毛片aaaaa无费看| 欧美影院午夜播放| 成人视屏免费看| 国产精品久久久99| 久久青青草原一区二区| 国产91清纯白嫩初高中在线观看| 久久久久88色偷偷免费| 亚洲黄色av| 免费观看在线综合| 日韩视频123| 91蝌蚪porny| 亚洲激情综合网| 欧美午夜精品久久久久久超碰| 成人av在线播放网站| 国产精品灌醉下药二区| 久久av二区| 国产91丝袜在线播放0| 国产精品午夜在线观看| 久久久久久穴| kk眼镜猥琐国模调教系列一区二区| 中文字幕中文乱码欧美一区二区| 狂野欧美一区| 欧美chengren| 日本欧美韩国一区三区| 国产欧美精品国产国产专区| 在线日韩电影| 国产精品自在欧美一区| 日韩理论片中文av| 欧美二区三区的天堂| 亚洲成人中文| 国产高清成人在线| 亚洲美女在线国产| 日韩一级黄色大片| 国产精品推荐精品| 成人午夜激情片| 天堂精品中文字幕在线| 久久久亚洲国产美女国产盗摄| 一本一道久久a久久精品| 91网上在线视频| 美女mm1313爽爽久久久蜜臀| 欧美激情一区二区三区全黄| 欧美图区在线视频| 亚洲免费大片| 成人av高清在线| 亚洲18女电影在线观看| 91精品国产欧美一区二区成人| 国语精品一区| 激情五月婷婷综合网| 国产精品v欧美精品v日韩| 精品一区二区三区日韩| 成人欧美一区二区三区黑人麻豆| 日本高清不卡视频| 国内自拍亚洲| 国产99久久久国产精品潘金| 成人免费一区二区三区在线观看| 欧美体内she精高潮| aaa亚洲精品一二三区| 免费在线观看精品| 精品久久久网站| 中日韩男男gay无套| 国产毛片一区二区| 国产精品大尺度| 在线亚洲免费视频| 伊人色综合久久天天五月婷| 日本va欧美va欧美va精品| 国产亚洲欧美色| 色偷偷一区二区三区| 欧美日韩国产综合视频在线| 亚洲大片在线观看| 国产精品麻豆视频| 色诱亚洲精品久久久久久| 97久久人人超碰| 丝袜国产日韩另类美女| 2020国产精品自拍| 久久精品中文字幕一区二区三区| 亚洲精品一卡二卡| 欧美疯狂性受xxxxx喷水图片| 亚洲午夜伦理| 福利一区二区在线| 亚洲电影在线播放| 国产午夜精品理论片a级大结局| 久久都是精品| 亚洲国产一区二区在线| 成人影视亚洲图片在线| 丝瓜av网站精品一区二区| 久久精子c满五个校花| 色88888久久久久久影院野外| 女生裸体视频一区二区三区| 午夜视频在线观看一区二区| 亚洲人成网站精品片在线观看| 欧美一级理论片| 色婷婷av一区二区三区软件| 欧美日韩在线精品| 国产ts人妖一区二区| 一区二区三区不卡在线观看| 国产精品欧美久久久久一区二区| 欧美精品一卡二卡| 久久综合久久久| 亚洲黄色在线| 9人人澡人人爽人人精品| 亚洲成人精品一区二区| 亚洲国产精品国自产拍av| 日韩亚洲欧美一区二区三区| 欧洲日韩一区二区三区| 国产九区一区在线| 欧美午夜视频| av高清不卡在线| 国产中文字幕一区| 亚洲国产另类精品专区| 亚洲同性同志一二三专区| 久久综合九色综合97婷婷| 欧美亚洲综合色| 欧美性猛片xxxx免费看久爱| 一区二区三区精品国产| 午夜天堂精品久久久久| 国产不卡视频一区| 激情小说欧美图片| 五月天激情综合| 亚洲一区在线电影| 欧美成人精品3d动漫h| 日本精品一区二区三区四区的功能| 国产日韩欧美综合精品| 亚洲国产日韩美| 国内精品久久久久久久影视蜜臀| 伊人色综合久久天天五月婷| 欧美日韩 国产精品| 99久久久精品| 成人h精品动漫一区二区三区| 久久精品噜噜噜成人av农村| 亚洲自拍与偷拍| 午夜一区二区三区视频| 一区二区国产视频| 亚洲免费电影在线| 综合激情成人伊人| 国产精品色眯眯| 久久精品夜色噜噜亚洲a∨| 日韩欧美一区中文| 欧美日韩高清一区二区三区| 久久三级福利| 蜜桃精品久久久久久久免费影院|