为了账号安全,请及时绑定邮箱和手机立即绑定

banner疑问

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

正在回答

2 回答

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

}


0 回复 有任何疑惑可以回复我~
#1

TequilaDrc

请问TouchSlop要加在哪里?
2017-05-05 回复 有任何疑惑可以回复我~
#2

攻城狮ZSP 回复 TequilaDrc

加在自定义ViewGroup的构造函数或者构造函数调用的初始化函数中。
2017-05-16 回复 有任何疑惑可以回复我~

追加一个问题

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
不一样的自定义实现轮播图效果
  • 参与学习       16241    人
  • 解答问题       44    个

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

进入课程

banner疑问

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信