banner疑问
整体讲解很细,但存在几个致命问题: 1、UI过度不友好,同事,在第一个或最后一个item上,滑动不能连贯 2、当有轮播item过多是会出现内存溢出 希望针对这个2个问题,进一步进行代码处理和讲解
整体讲解很细,但存在几个致命问题: 1、UI过度不友好,同事,在第一个或最后一个item上,滑动不能连贯 2、当有轮播item过多是会出现内存溢出 希望针对这个2个问题,进一步进行代码处理和讲解
2017-03-16
1、针对内存溢出问题,不应该传递Bitmap,直接传递R.drawable.xxx到里面即可;
2、拦截问题,修改如下:
定义一个TouchSlop
mTouchSlop = ViewConfiguration.get(context).getScaledPagingTouchSlop();
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: stopAuto(); isClick = true; mStartX = (int) ev.getX(); mPreviousX = mStartX; break; case MotionEvent.ACTION_MOVE: int diff = (int) Math.abs(ev.getX() - mStartX); mPreviousX = (int) ev.getX(); //横向滑动距离超过slop值才拦截; if (diff > mTouchSlop) { isClick = false; return true; } break; case MotionEvent.ACTION_UP: if (isClick) { listener.onClick(mIndex); } startAuto(); break; } return super.onInterceptTouchEvent(ev); }
//拦截后处理该事件; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); int distance = moveX - mPreviousX; scrollBy(-distance, 0); mPreviousX = moveX; break; case MotionEvent.ACTION_UP: int scrollX = getScrollX(); mIndex = (scrollX + mChildWidth / 2) / mChildWidth; if (mIndex < 0) { mIndex = 0; } else if (mIndex > mChildCount - 1) { mIndex = mChildCount - 1; } int dx=mIndex * mChildWidth - scrollX; mScroller.startScroll(scrollX, 0,dx , 0); invalidate(); startAuto(); changedListener.onImageChanged(mIndex); break; } return super.onTouchEvent(event); }
使用这个方法有一个注意点,就是每一个ImageView一定要加一个Clickable.
protected void onLayout(boolean changed, int l, int t, int r, int b) { if (changed) { int leftMargin = 0; for (int i = 0; i < mChildCount; i++) { View child = getChildAt(i); child.layout(leftMargin, 0, leftMargin + mChildWidth, mChildHeight); leftMargin += mChildWidth; //加一个Clickable. child.setClickable(true); } } }
举报