banner疑问

来源:3-1 自定义View实现轮播图总结

偶不是斯巴达

2017-03-16 13:20

整体讲解很细,但存在几个致命问题: 1、UI过度不友好,同事,在第一个或最后一个item上,滑动不能连贯 2、当有轮播item过多是会出现内存溢出 希望针对这个2个问题,进一步进行代码处理和讲解

写回答 关注

2回答

  • 攻城狮ZSP
    2017-03-20 08:39:32

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


    攻城狮ZSP 回复Tequil...

    加在自定义ViewGroup的构造函数或者构造函数调用的初始化函数中。

    2017-05-16 13:59:02

    共 2 条回复 >

  • 偶不是斯巴达
    2017-03-16 13:58:28

    追加一个问题

    bannerViewGroup拦截事件,是拦截了所有手势操作,这样当banner和一个垂直的scrollview结合时,会导致在banner上进行下滑操作无效

不一样的自定义实现轮播图效果

Android开发自定义实现轮播图效果案例实现,从无到有让你会懂会用

16243 学习 · 44 问题

查看课程

相似问题