色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

android - scrollView和listview滑動沖突

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

問題描述

在scrollview內(nèi)嵌套了一個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)){ //點擊事件發(fā)生在viewpager范圍內(nèi) 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; } //判斷點擊事件是否在當(dāng)前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()方法中已經(jīng)判斷了,但是最終卻沒有效果。

感謝采納的那位,根據(jù)他的提示, 我順便解決了listview的滑動沖突。 現(xiàn)在使用外部攔截法: 重寫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)){ //點擊事件發(fā)生在viewpager范圍內(nèi) 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滑到頂端時當(dāng)前事件向上滑動,需要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; } //判斷點擊事件是否在當(dāng)前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; }}

采用內(nèi)部攔截法: 重寫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參數(shù)為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滑到頂端時當(dāng)前事件向上滑動,需要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事件已經(jīng)“吃掉”了手勢,你可以重寫ViewPager的onTouch事件,假如手勢是豎直方向的移動,return false

回答2:

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

相關(guān)文章:
主站蜘蛛池模板: 国产乱码精品一区二区三上 | 久久dj视频| 成人亚洲欧美综合 | yy6080福利午夜免费观看 | 成人毛片18女人毛片免费 | 全部免费国产潢色一级 | 美女视频网站永久免费观看软件 | 国产99精品一区二区三区免费 | 久久精品亚洲精品国产欧美 | 成年大片免费视频播放二级 | 国产一级精品高清一级毛片 | 国产永久在线观看 | 国产精品18久久久久久vr | 亚洲视频一区二区在线观看 | 国产美女精品视频 | 在线视频第一页 | 91精品在线免费 | 国产亚洲精品久久 | 国产一区日韩二区欧美三 | 国产日韩精品视频 | 国产在线精品一区免费香蕉 | 欧美日韩一区二区三在线 | 国产三级国产精品国产国在线观看 | 久青草国产在线 | 国产成人精品午夜二三区 | 欧美一级va在线视频免费播放 | 日本性色 | 18在线观看国内精品视频 | 日本欧美一区二区三区在线 | 亚洲逼 | 亚洲成a人片在线看 | 亚洲欧美久久一区二区 | 欧美高清一区 | 女人张开腿让男人捅的视频 | 免费网站18 | 日本精品一区二区三区在线视频一 | 久久久网站亚洲第一 | 欧美成人一区二区三区在线视频 | 日韩一级a毛片欧美一级 | 亚洲综合色一区二区三区小说 | 国产成人亚洲综合91精品555 |