自滑动的广告位

添加内容,作为自定义布局添加到主布局中

package com.rednovo.weibo.widget.main;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.rednovo.weibo.activity.BannerActivity;
import com.rednovo.weibo.activity.LiveActivity;
import com.rednovo.weibo.activity.NewOtherUserZoneActivity;
import com.rednovo.weibo.activity.StarZoneActivity;
import com.rednovo.weibo.widget.zoomview.HorizonScrollableViewGroup;
import com.xiuba.sdk.cache.ImageCache;
import com.xiuba.sdk.util.StringUtils;
import com.rednovo.weibo.R;
import com.xiuba.lib.cloudapi.BaseRequestCallback;
import com.xiuba.lib.cloudapi.PublicAPI;
import com.xiuba.lib.config.BannerIntentKey;
import com.xiuba.lib.model.ActivityResult;
import com.xiuba.lib.model.BannerResult;
import com.xiuba.lib.model.RoomListResult;
import com.xiuba.lib.utils.CacheUtils;
import com.xiuba.lib.utils.DisplayUtils;
import com.xiuba.lib.utils.LoginUtils;
import com.xiuba.lib.utils.PromptUtils;
import com.xiuba.lib.utils.UserInfoUtils;
import com.xiuba.lib.utils.Utils;

/**
 * Created by CG on 13-10-28.
 *
 * @author ll
 * @version 3.0.0
 */
public class BannerView extends RelativeLayout {

public static String TAG = "BannerView";

/**
 * 关闭悬浮广告接口
 */
public interface OnBannerClosedListener {
    /**
     * 关闭广告
     * @param bannerView bannerView
     */
    public void onBannerClosed(BannerView bannerView);
}

private static final int BANNER_HEIGHT = (DisplayUtils.px2dp(DisplayUtils.getHeightPixels())/10*2);

private static boolean sEnableShowBanner = true;

private HorizonScrollableViewGroup mBannerView;
private OnBannerClosedListener mOnBannerClosedListener;
private boolean mIsInit = false;
private RoomListResult.Data roomdata;

/**
 * 关闭广告
 * @param listener listener
 */
public void setOnBannerEventListener(OnBannerClosedListener listener) {
    mOnBannerClosedListener = listener;
}

/**
 * BannerView
 *
 * @param context context
 */
public BannerView(Context context) {
    super(context);
}

/**
 * BannerView
 *
 * @param context context
 * @param attrs   attrs
 */
public BannerView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

private void init() {
    mBannerView = new HorizonScrollableViewGroup(getContext());
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    final int margin = (int) getResources().getDimension(R.dimen.normal_margin);
    lp.leftMargin = margin;
    lp.rightMargin = margin;
    lp.topMargin = margin;
    //lp.bottomMargin = 20;
    addView(mBannerView, lp);

    final int largeMargin = (int) getResources().getDimension(R.dimen.large_margin);
    final int topMargin = 26;
    lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    lp.addRule(ALIGN_PARENT_RIGHT);
    //lp.addRule(CENTER_VERTICAL);
    lp.rightMargin = largeMargin;
    lp.topMargin = topMargin;
    mIsInit = true;
    //bannerview关闭按钮去掉
}

/**
 * refresh
 */
public void refresh() {
    if (sEnableShowBanner) {
        PublicAPI.getActivity().execute(new BaseRequestCallback<ActivityResult>() {
            @Override
            public void onRequestSucceed(ActivityResult activityResult) {
                if (activityResult.getDataList().size() > 0) {
                    if (mBannerView == null || mBannerView.getChildCount() == 0) {
                        for (final ActivityResult.Data data : activityResult.getDataList()) {
                            if (!StringUtils.isEmpty(data.getmTagsrc())) {
                                Bitmap picture = CacheUtils.getImageCache().getBitmapFromMemCache(data.getmTagsrc()
                                        , data.getmTagsrc(), DisplayUtils.getWidthPixels(), DisplayUtils.dp2px(BANNER_HEIGHT));
                                if (picture == null) {
                                    CacheUtils.getImageCache().loadImageAsync(data.getmTagsrc()
                                            , DisplayUtils.getWidthPixels(), DisplayUtils.dp2px(BANNER_HEIGHT)
                                            , new ImageCache.Callback() {
                                        @Override
                                        public void imageLoaded(String s, int i, int i2, Bitmap bitmap) {
                                            addBannerImageView(data, bitmap);
                                        }
                                    });
                                } else {
                                    addBannerImageView(data, picture);
                                }
                            }
                        }
                    }
                }
            }

            @Override
            public void onRequestFailed(ActivityResult activityResult) {
            }
        });
    }
}

private void addBannerImageView(final ActivityResult.Data data, Bitmap bitmap) {
    if (!mIsInit) {
        init();
    }
    ImageView imageView = new ImageView(getContext());
    imageView.setTag(data.getmTagsrc());
    imageView.setClickable(true);
    GestureDetector.SimpleOnGestureListener simpleOnGestureListener = new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            StringBuilder stringBuilder = new StringBuilder(data.getmTagsrchref());
            //点击bannerview如果是主播则跳转到直播界面
            if(isNumeric(stringBuilder.substring(stringBuilder.length()-8))){
                PublicAPI.requestStarByID(stringBuilder.substring(stringBuilder.length()-8)).execute(new BaseRequestCallback<RoomListResult>() {
                    @Override
                    public void onRequestSucceed(RoomListResult result) {
                        // TODO Auto-generated method stub
                        roomdata = result.getDataList().get(0);
                        Utils.autoEnterLiveOrZone(getContext(), roomdata, LiveActivity.class, NewOtherUserZoneActivity.class);
                    }

                    @Override
                    public void onRequestFailed(RoomListResult result) {
                        // TODO Auto-generated method stub
                        PromptUtils.showToast("网络连接错误,请检查网络后重试", 1);
                    }
                });
            }else if (stringBuilder.substring(stringBuilder.length()-5).equals("xhtml")) {
                if (LoginUtils.isAlreadyLogin() && UserInfoUtils.getAccessToken() != null) {
                    System.out.println(stringBuilder);
                    Intent intent = new Intent(getContext(), BannerActivity.class);
                    intent.putExtra(BannerIntentKey.INTENT_CLICK_URL, stringBuilder.toString()+"?"+"access_token=" +UserInfoUtils.getAccessToken());
                    intent.putExtra(BannerIntentKey.INTENT_TITLE, data.getmName());
                    getContext().startActivity(intent);
                }else {
                    Intent intent = new Intent(getContext(), BannerActivity.class);
                    intent.putExtra(BannerIntentKey.INTENT_CLICK_URL, stringBuilder.toString());
                    intent.putExtra(BannerIntentKey.INTENT_TITLE, data.getmName());
                    getContext().startActivity(intent);
                }

            }else{
                 if (LoginUtils.isAlreadyLogin() && UserInfoUtils.getAccessToken() != null) {
                     stringBuilder.append(stringBuilder.indexOf("?") == -1 ? "?" : "&")
                             .append("access_token=").append(UserInfoUtils.getAccessToken());
                 }
                 Intent intent = new Intent(getContext(), BannerActivity.class);
                 intent.putExtra(BannerIntentKey.INTENT_CLICK_URL, stringBuilder.toString());
                 intent.putExtra(BannerIntentKey.INTENT_TITLE, data.getmName());
                 getContext().startActivity(intent);
            }

            return super.onSingleTapUp(e);
        }
    };
    final GestureDetector gestureDetector = new GestureDetector(getContext(), simpleOnGestureListener);
    imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    });
    imageView.setImageBitmap(bitmap);
    imageView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dp2px(BANNER_HEIGHT)));
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    imageView.setBackgroundColor(getResources().getColor(R.color.transparent));
    mBannerView.addView(imageView);
    mBannerView.setEnableAutoScroll(true);

    //设置在BannerView条目数为1时不可滑动
    if(mBannerView.getChildCount() == 1){
        mBannerView.setEnableManualScroll(false);
    }else{
        mBannerView.setEnableManualScroll(true);
    }
}
public boolean isNumeric(String str){ 
    Pattern pattern = Pattern.compile("[0-9]*"); 
    Matcher isNum = pattern.matcher(str);
    if( !isNum.matches() ){
       return false; 
    } 
    return true; 
}
}

自动向左滚动控件

- 设置拖延时间,默认3s

package com.rednovo.weibo.widget.zoomview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.*;
import android.view.animation.DecelerateInterpolator;
import android.widget.FrameLayout;
import android.widget.Scroller;

/**
 * 自动向左滚动控件
 *
 * @author ll
 * @version 2.0.0
 * @since 2012-8-24
 */
public class HorizonScrollableViewGroup extends FrameLayout {

private static final String LOG_TAG = "ScrollableViewGroup";
private static final long DELAY = 3000;
private static final int INVALID_SCREEN = -1;
private static final int TOUCH_STATE_REST = 0;
private static final int TOUCH_STATE_SCROLLING = 1;
private static final int SNAP_VELOCITY = 500;

private int mDefaultScreen;
private int mCurrentScreen;
private int mNextScreen = INVALID_SCREEN;

private boolean mEnableRuntimeScrollMotion = true;
// private int mMaximumVelocity;
private Scroller mScroller;
private int mTouchState;
private float mLastMotionX;
private float mLastMotionY;
private int mTouchSlop;
private boolean mAllowLongPress;
private VelocityTracker mVelocityTracker;

private int mPaintFlag = 0;

private OnCurrentViewChangedListener mOnCurrentViewChangedListener;
private boolean mIsTouch = false;

private boolean mEnableAutoScroll = true;
private static final int WHAT_AUTO_SCROLL = 1;

private boolean mEnableManualScroll = true;

/**
 * 设置图片是否允许自动滚动显示
 * @param enableAutoScroll true: 允许, false : 不允许
 */
public void setEnableAutoScroll(boolean enableAutoScroll) {
    mEnableAutoScroll = enableAutoScroll;
    mHandler.removeMessages(WHAT_AUTO_SCROLL);
    if (mEnableAutoScroll) {
        mHandler.sendEmptyMessageDelayed(WHAT_AUTO_SCROLL, DELAY);
    }
}

private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        if (!mIsTouch && getChildCount() > 1) {
            snapToScreen(mCurrentScreen + 1);
        }

        if (!mEnableAutoScroll) {
            return;
        }

        mHandler.removeMessages(WHAT_AUTO_SCROLL);
        mHandler.sendEmptyMessageDelayed(WHAT_AUTO_SCROLL, DELAY);
    }
};

/**
 * 页面切换的回调接口
 * @author ll
 * @version 2.0.0
 * @since 2012-8-24
 */
public interface OnCurrentViewChangedListener {
    /**
     * 当前页面切换的回调接口.
     *
     * @param view 要切换的View
     * @param currentScreen 当前屏幕
     */
    public void onCurrentViewChanged(View view, int currentScreen);
};

/**
 * 构造函数
 * @param context 上下文
 */
public HorizonScrollableViewGroup(Context context) {
    super(context);
    initViewGroup();
}

/**
 * 构造函数,支持布局
 * @param context 上下我
 * @param attrs 属性组
 */
public HorizonScrollableViewGroup(Context context, AttributeSet attrs) {
    super(context, attrs);
    initViewGroup();
}

/**
 * 构造函数,支持布局
 * @param context 上下我
 * @param attrs 属性组
 * @param defStyle 风格
 */
public HorizonScrollableViewGroup(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initViewGroup();
}

/*
 * (non-Javadoc)
 *
 * @see android.view.ViewGroup#onLayout(boolean, int, int, int, int)
 */
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int childLeft = 0;
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() != View.GONE) {
            final int childWidth = child.getMeasuredWidth();
            child.layout(childLeft, 0, childLeft + childWidth, child.getMeasuredHeight());
            childLeft += childWidth;
        }
    }
}

/**
 * Initializes various states for this viewgroup.
 */
private void initViewGroup() {
    mScroller = new Scroller(getContext(), new DecelerateInterpolator());
    mCurrentScreen = mDefaultScreen;
    final ViewConfiguration configuration = ViewConfiguration.get(getContext());
    mTouchSlop = configuration.getScaledTouchSlop() << 1; // 2
    // mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();

// mHandler.sendEmptyMessageDelayed(WHAT_AUTO_SCROLL, DELAY);
}

/**
 * 是否默认View显示.
 *
 * @return boolean
 */
public boolean isDefaultViewShowing() {
    return mCurrentScreen == mDefaultScreen;
}

/**
 * 获取当前View id.
 *
 * @return int
 */
public int getCurrentView() {
    return mCurrentScreen;
}

/**
 * 设置是否允许手动滑动
 * @param enable  enable
 */
public void setEnableManualScroll(boolean enable) {
    mEnableManualScroll = enable;
}

/**
 * 设置当前View.
 *
 * @param currentView 当前View id
 */
public void setCurrentView(int currentView) {
    // snapToScreen(currentView);
    mCurrentScreen = Math.max(0, Math.min(currentView, getChildCount() - 1));
    scrollTo(mCurrentScreen * getWidth(), 0);
    if (mOnCurrentViewChangedListener != null) {
        mOnCurrentViewChangedListener.onCurrentViewChanged(this, mCurrentScreen);
    }

    invalidate();
}

/*
 * (non-Javadoc)
 *
 * @see android.view.View#computeScroll()
 */
@Override
public void computeScroll() {
    if (mScroller.computeScrollOffset()) {

// FIXED computeScroll;
final int currx = mScroller.getCurrX(), curry = mScroller.getCurrY(), scrx = getScrollX(), scry = getScrollY();

        if (currx != scrx || curry != scry) {
            scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
        } else {
            invalidate();
        }
    } else if (mNextScreen != INVALID_SCREEN) {
        mCurrentScreen = Math.max(0, Math.min(mNextScreen, getChildCount() - 1));
        mNextScreen = INVALID_SCREEN;
        clearChildrenCache();
        final int scrx = getScrollX(), scry = getScrollY(), mCurrentScrollX = mCurrentScreen * getWidth();
        if (scrx != mCurrentScrollX) {
            scrollTo(mCurrentScrollX, scry);
        }
        if (mOnCurrentViewChangedListener != null) {
            mOnCurrentViewChangedListener.onCurrentViewChanged(this, mCurrentScreen);
        }
    }
}

/*
 * (non-Javadoc)
 *
 * @see android.view.ViewGroup#dispatchDraw(android.graphics.Canvas)
 */
@Override
protected void dispatchDraw(Canvas canvas) {
    if (getChildCount() == 0) {
        return;
    }
    boolean fastDraw = mTouchState != TOUCH_STATE_SCROLLING && mNextScreen == INVALID_SCREEN;
    // If we are not scrolling or flinging, draw only the current screen
    if (fastDraw) {
        View child = getChildAt(mCurrentScreen);
        if (child != null) {
            drawChild(canvas, getChildAt(mCurrentScreen), getDrawingTime());
        }
    } else {
        final long drawingTime = getDrawingTime();
        // If we are flinging, draw only the current screen and the target
        // screen
        if (mNextScreen >= 0 && mNextScreen < getChildCount() && (Math.abs(mCurrentScreen - mNextScreen) == 1 || mPaintFlag != 0)) {
            final View viewCurrent = getChildAt(mCurrentScreen), viewNext = getChildAt(mNextScreen);
            if (viewCurrent != null) {
                drawChild(canvas, viewCurrent, drawingTime);
                if (mPaintFlag == 0) {
                    drawChild(canvas, viewNext, drawingTime);
                } else {
                    Paint paint = new Paint();
                    if (mPaintFlag < 0) {
                        if (viewNext.getDrawingCache() != null) {
                            canvas.drawBitmap(viewNext.getDrawingCache(), -viewNext.getWidth(), viewNext.getTop(), paint);
                        }
                    } else {
                        if (viewNext.getDrawingCache() != null) {
                            canvas.drawBitmap(viewNext.getDrawingCache(), getWidth() * getChildCount(), viewNext.getTop(), paint);
                        }
                    }
                }
            }
        } else {
// If we are scrolling, draw all of our children
            final int count = getChildCount();
            for (int i = 0; i < count; i++) {
                drawChild(canvas, getChildAt(i), drawingTime);
            }

            if (mPaintFlag != 0) {
                final View viewNext;
                Paint paint = new Paint();
                if (mPaintFlag < 0) {
                    viewNext = getChildAt(getChildCount() - 1);
                    if (viewNext.getDrawingCache() != null) {
                        canvas.drawBitmap(viewNext.getDrawingCache(), -viewNext.getWidth(), viewNext.getTop(), paint);
                    }
                } else {
                    viewNext = getChildAt(0);
                    if (viewNext.getDrawingCache() != null) {
                        canvas.drawBitmap(viewNext.getDrawingCache(), getWidth() * getChildCount(), viewNext.getTop(), paint);
                    }

                }
            }
        }
    }
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.view.ViewGroup#requestChildRectangleOnScreen(android.view.View,
 * android.graphics.Rect, boolean)
 */
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
    int screen = indexOfChild(child);
    if (screen != mCurrentScreen || !mScroller.isFinished()) {
        snapToScreen(screen);
        return true;
    }
    return false;
}

/*
 * (non-Javadoc)
 *
 * @see android.view.ViewGroup#onRequestFocusInDescendants(int,
 * android.graphics.Rect)
 */
@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
    int focusableScreen;
    if (mNextScreen != INVALID_SCREEN) {
        focusableScreen = mNextScreen;
    } else {
        focusableScreen = mCurrentScreen;
    }
    //getChildAt(focusableScreen).requestFocus(direction, previouslyFocusedRect);
    return false;
}

/*
 * (non-Javadoc)
 *
 * @see android.view.ViewGroup#dispatchUnhandledMove(android.view.View, int)
 */
@Override
public boolean dispatchUnhandledMove(View focused, int direction) {
    if (direction == View.FOCUS_LEFT) {
        if (getCurrentView() > 0) {
            snapToScreen(getCurrentView() - 1);
            return true;
        }
    } else if (direction == View.FOCUS_RIGHT) {
        if (getCurrentView() < getChildCount() - 1) {
            snapToScreen(getCurrentView() + 1);
            return true;
        }
    }
    return super.dispatchUnhandledMove(focused, direction);
}

/*
 * (non-Javadoc)
 *
 * @see
 * android.view.ViewGroup#onInterceptTouchEvent(android.view.MotionEvent)
 */
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    final int action = ev.getAction();

    if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)) {
        return true;
    }

    final float x = ev.getX();
    final float y = ev.getY();

    switch (action) {
        case MotionEvent.ACTION_MOVE:
            final int xDiff = (int) Math.abs(x - mLastMotionX);
            final int yDiff = (int) Math.abs(y - mLastMotionY);

            final int touchSlop = mTouchSlop;
            boolean xMoved = xDiff > touchSlop;
            boolean yMoved = yDiff > touchSlop;

            if (xMoved || yMoved) {
                if (xMoved) {
                    // Scroll if the user moved far enough along the X axis
                    if (mEnableRuntimeScrollMotion) {
                        mTouchState = TOUCH_STATE_SCROLLING;
                        enableChildrenCache();
                    } else if (xDiff > getWidth() >> 3) {
                        mTouchState = TOUCH_STATE_SCROLLING;
                    } else {
                        mTouchState = TOUCH_STATE_REST;
                    }
                }
                // Either way, cancel any pending longpress
                if (mAllowLongPress) {
mAllowLongPress = false;
// Try canceling the long press. It could also have been
// scheduled
// by a distant descendant, so use the mAllowLongPress flag
// to block
// everything
                    final View currentScreen = getChildAt(mCurrentScreen);
                    currentScreen.cancelLongPress();
                }
            }
            break;

        case MotionEvent.ACTION_DOWN:
            // Remember location of down touch
            mLastMotionX = x;
            mLastMotionY = y;
            mAllowLongPress = true;
        /*
         * If being flinged and user touches the screen, initiate drag;
         * otherwise don't. mScroller.isFinished should be false when being
         * flinged.
         */
            mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING;

            mIsTouch = true;
            break;

        case MotionEvent.ACTION_CANCEL:
        case MotionEvent.ACTION_UP:
            mTouchState = TOUCH_STATE_REST;
            mAllowLongPress = false;

            mIsTouch = false;
            mHandler.removeMessages(WHAT_AUTO_SCROLL);
            mHandler.sendEmptyMessageDelayed(WHAT_AUTO_SCROLL, DELAY);
            break;

        default:
            break;
    }

    if (action == MotionEvent.ACTION_DOWN
            || action == MotionEvent.ACTION_MOVE) {
        getParent().requestDisallowInterceptTouchEvent(true);
    }

    return mTouchState != TOUCH_STATE_REST;
}

void enableChildrenCache() {
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View layout = getChildAt(i);
        layout.setDrawingCacheEnabled(true);
        if (layout instanceof ViewGroup) {
            ((ViewGroup) layout).setAlwaysDrawnWithCacheEnabled(true);
        }
    }
}

void clearChildrenCache() {
    mPaintFlag = 0;
    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View layout = getChildAt(i);
        if (layout instanceof ViewGroup) {
            ((ViewGroup) layout).setAlwaysDrawnWithCacheEnabled(false);
        }
    }
}

/*
 * (non-Javadoc)
 *
 * @see android.view.View#onTouchEvent(android.view.MotionEvent)
 */
@Override
public boolean onTouchEvent(MotionEvent event) {//这里改
    if (getChildCount() == 0) {
        return super.onTouchEvent(event);
    }

    if (mVelocityTracker == null) {
        mVelocityTracker = VelocityTracker.obtain();
    }
    mVelocityTracker.addMovement(event);

    final int action = event.getAction();
    final float x = event.getX();
    switch (action) {
        case MotionEvent.ACTION_DOWN:
            mIsTouch = true;
            mScroller.abortAnimation();

            mLastMotionX = x;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mEnableManualScroll && mEnableRuntimeScrollMotion && mTouchState == TOUCH_STATE_SCROLLING) {
                // Scroll to follow the motion event
                int deltaX = (int) (mLastMotionX - x);
                mLastMotionX = x;

                if (deltaX < 0) {
                    if (getScrollX() <= 0) {
                        mPaintFlag = -1;
                    }
                    scrollBy(deltaX, 0);
                } else if (deltaX > 0) {
                    int availableToScroll = getChildAt(getChildCount() - 1).getRight() - getScrollX() - getWidth();
                    if (availableToScroll <= 0) {
                        mPaintFlag = 1;
                        availableToScroll += getWidth() << 1;
                    }
                    if (availableToScroll > 0) {
                        scrollBy(Math.min(availableToScroll, deltaX), 0);
                    }
                }
            }
            mTouchState = TOUCH_STATE_SCROLLING;
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            if (mEnableManualScroll && mTouchState == TOUCH_STATE_SCROLLING) {
                final VelocityTracker velocityTracker = mVelocityTracker;
                velocityTracker.computeCurrentVelocity(1000);

                int velocityX = (int) velocityTracker.getXVelocity();

                if (velocityX > SNAP_VELOCITY) {
                    // Fling hard enough to move left
                    snapToScreen(mCurrentScreen - 1);
                } else if (velocityX < -SNAP_VELOCITY) {
                    // Fling hard enough to move right
                    snapToScreen(mCurrentScreen + 1);
                } else {
                    snapToDestination();
                }

                if (mVelocityTracker != null) {
                    mVelocityTracker.recycle();
                    mVelocityTracker = null;
                }
            }
            mTouchState = TOUCH_STATE_REST;
            mIsTouch = false;
            mHandler.removeMessages(WHAT_AUTO_SCROLL);
            mHandler.sendEmptyMessageDelayed(WHAT_AUTO_SCROLL, DELAY);
            break;
        default:
            break;
    }

    if (action == MotionEvent.ACTION_DOWN
            || action == MotionEvent.ACTION_MOVE) {
        getParent().requestDisallowInterceptTouchEvent(true);
    }

    return true;
}

private void snapToDestination() {
    final int screenWidth = getWidth();
    final int scrollWidth = getScrollX() + (screenWidth >> 1);
    final int viewCount = getChildCount();
    final int whichScreen;
    if (scrollWidth < 0) {
        whichScreen = -1;
    } else if (scrollWidth > screenWidth * viewCount) {
        whichScreen = viewCount;
    } else {
        whichScreen = screenWidth > 0 ? (getScrollX() + (screenWidth / 2)) / screenWidth : 0;
    }
    snapToScreen(whichScreen);
}

/**
 * 跳转到指定屏幕.
 *
 * @param whichScreen 屏幕Id
 */
public void snapToScreen(int whichScreen) {
    if (!mScroller.isFinished()) {
        mScroller.abortAnimation();
    }

    boolean changingScreens = whichScreen != mCurrentScreen;

    final int viewCount = getChildCount() - 1;

    final int delta = whichScreen * getWidth() - getScrollX();

    if (!changingScreens && delta == 0) {
        return;
    }

    enableChildrenCache();

    if (whichScreen < 0) {
        whichScreen = viewCount;
        mPaintFlag = -1; // next screen should be painted before current
    } else if (whichScreen > viewCount) {
        whichScreen = 0;
        mPaintFlag = 1;
    } else {
        mPaintFlag = 0;
    }

    mNextScreen = whichScreen;

    View focusedChild = getFocusedChild();
    if (focusedChild != null && changingScreens && focusedChild == getChildAt(mCurrentScreen)) {
        focusedChild.clearFocus();
    }

    mScroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta));

    invalidate();
}

/**
 * 往左滑动.
 *
 */
public void scrollLeft() {
    if (mNextScreen == INVALID_SCREEN && mCurrentScreen > 0 && mScroller.isFinished()) {
        snapToScreen(mCurrentScreen - 1);
    }
}

/**
 * 往右滑动.
 *
 */
public void scrollRight() {
    if (mNextScreen == INVALID_SCREEN && mCurrentScreen < getChildCount() - 1 && mScroller.isFinished()) {
        snapToScreen(mCurrentScreen + 1);
    }
}

/**
 * 滚动到默认屏幕.
 *
 */
public void moveToDefaultScreen() {
    snapToScreen(mDefaultScreen);
    getChildAt(mDefaultScreen).requestFocus();
}

/**
 * 判断滚动是否结束.
 *
 * @return boolean
 */
public boolean isScrollFinish() {
    return (mEnableRuntimeScrollMotion && mTouchState != TOUCH_STATE_SCROLLING && mNextScreen == INVALID_SCREEN)
            || (!mEnableRuntimeScrollMotion && mScroller.isFinished());
}

/**
 * get当前View改变的接口.
 *
 * @return OnCurrentViewChangedListener
 */
public OnCurrentViewChangedListener getOnCurrentViewChangedListener() {
    return mOnCurrentViewChangedListener;
}

/**
 * 设置当前View改变的接口.
 *
 * @param listener 当前View改变的接口
 */
public void setOnCurrentViewChangedListener(OnCurrentViewChangedListener listener) {
    this.mOnCurrentViewChangedListener = listener;
}

/**
 * 设置是否允许实时滚动.
 *
 * @param enable boolean
 */
public void setEnableRuntimeScrollMotion(boolean enable) {
    mEnableRuntimeScrollMotion = enable;
}

/**
 * 判断是否可以实时滚动.
 *
 * @return boolean
 */
public boolean isEnableRuntimeScrollMotion() {
    return mEnableRuntimeScrollMotion;
}

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();

    mHandler.removeMessages(WHAT_AUTO_SCROLL);
}

/**
 * 取消自动滚动
 */
public void stopAutoScroll() {
    mHandler.removeMessages(WHAT_AUTO_SCROLL);
}
}

添加到主布局

<*.*BannerView
android:id="@+id/id_main_banner_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值