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);
}
}
}举报