基于ViewPager的自动轮播模块–解决与ScrollView冲突问题

在第一次写项目的时候,客户提出了这个需求,所以就在网上查找现成的解决办法。也用过几个别的案例,不过效果都不好,于是就多方结合修改最终完善。

在Activity中加入初始化组件的代码

private void initAutoViewPager() {
    autoViewPager.isHavaPoint(true);
    //父控件没有ScrollView时不用设置
    autoViewPager.setScrollView(scrollView);
    //引入数据的格式可以自定义
    autoViewPager.setData(list);
}

在布局文件中加入

<com.gravin.AutoViewPager
    android:id="@+id/home_ad"
    android:layout_width="match_parent"
    android:layout_height="@dimen/viewpager_height" />

在原有的代码中加入上述代码就可以实现图片轮播的效果了。

核心代码

package com.gravin;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Timer;
import java.util.TimerTask;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.Toast;

/**
 * 滑动广告
 * 
 * @author Gavin
 * 
 */
public class AutoViewPager extends FrameLayout {
    private Context mContext = null;
    private boolean isHavaPoint=true;
    private boolean mIsSwitched = false;
    //存放子视图
    private ArrayList<View> mPageViews = null;
    private ViewGroup mPointsViewGroup = null;
    private ViewPager mViewPager = null;
    private ScrollView mScroll = null;
    //图片切换间隔
    private long time=1000;
    private GuidePageAdapter mGuidePageAdapter = null;
    //存放要显示的数据
    private ArrayList<HashMap<String, Object>> data = null;
    private ImageView[] mPointViews = null;
    private GuidePageChangeListener mGuidePageChangeListener = null;
    private Timer mTimer = null;

    public AutoViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }
    public AutoViewPager(Context context) {
        super(context);
        mContext = context;
    }

    /**
     * 引入父控件中的ScrollView
     */
    public void setScrollView(ScrollView scrollView) {
        mScroll = scrollView;
    }


    private void init() {
        LayoutInflater.from(mContext).inflate(R.layout.viewpager, this, true);
        //用于存放页面指示器的控件
        mPointsViewGroup = (ViewGroup) findViewById(R.id.viewpager_PointsLayout);

        mViewPager = (ViewPager) findViewById(R.id.viewpager_ViewPager);
        mViewPager.setAdapter(getGuidePageAdapter());
        mViewPager.setOnPageChangeListener(getGuidePageChangeListener());

        //防止与ScrollView冲突
        if (mScroll != null) {
            mViewPager.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        mIsSwitched=true;
                        mScroll.requestDisallowInterceptTouchEvent(true);
                        break;
                    case MotionEvent.ACTION_MOVE:
                        mIsSwitched=true;
                        mScroll.requestDisallowInterceptTouchEvent(true);
                        break;
                    case MotionEvent.ACTION_UP:
                        mScroll.requestDisallowInterceptTouchEvent(false);
                        break;
                    }
                    return false;
                }
            });
        }
        mPageViews = new ArrayList<View>();

        for (int m = 0; m < data.size(); m++) {
            View view = LayoutInflater.from(mContext).inflate(R.layout.viewpager_subview, null);
            //显示图片的ImageView
            ImageView img = (ImageView) view.findViewById(R.id.viewpager_subview_img);

            final HashMap<String, Object> map = data.get(m);
            img.setBackgroundResource(Integer.valueOf(map.get("img").toString()));
            //ImageLoader.getInstance().displayImage(map.get("pic").toString(),img);

            view.setClickable(true);
            view.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(mContext, map.get("img").toString(), Toast.LENGTH_SHORT).show();
                }
            });
            mPageViews.add(view);
        }
        //及时通知Adapter数据更新
        mGuidePageAdapter.notifyDataSetChanged();


        if (isHavaPoint) {
            mPointViews = new ImageView[data.size()];
            ViewGroup.MarginLayoutParams mp = new ViewGroup.MarginLayoutParams(15, 15);
            mp.setMargins(5, 0, 5,0);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(mp);
            for (int i = 0; i < data.size(); i++) {
                ImageView imageView = new ImageView(mContext);
                mPointViews[i] = imageView;
                if (i == 0) {
                    // 默认选中第一张图片
                    mPointViews[i].setBackgroundResource(R.drawable.page_indicator_focused);
                } else {
                    mPointViews[i].setBackgroundResource(R.drawable.page_indicator);
                }

                mPointsViewGroup.addView(mPointViews[i],params);
            }
        }
        //开始轮播
        startTimer();
    }

    /**
     * 是否显示页面指示器,请在setData之前调用
     */
    public void isHavaPoint(boolean isHavaPoint){
        this.isHavaPoint=isHavaPoint;
    }
    /**
     * 引入数据
     * @param data
     */
    public void setData(ArrayList<HashMap<String, Object>> data) {
        this.data = data;
        if (data == null || data.size() == 0) {
            return;
        }
        init();

    }

    class GuidePageAdapter extends PagerAdapter {
        @Override
        public int getCount() {
            return mPageViews == null ? 0 : mPageViews.size();
        }

        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == arg1;
        }

        @Override
        public void destroyItem(ViewGroup arg0, int arg1, Object arg2) {
            arg0.removeView(mPageViews == null ? null : mPageViews.get(arg1));
        }

        @Override
        public Object instantiateItem(ViewGroup arg0, int arg1) {
            arg0.addView(mPageViews == null ? null : mPageViews.get(arg1));
            return mPageViews == null ? null : mPageViews.get(arg1);
        }


    }

    class GuidePageChangeListener implements OnPageChangeListener {
        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageSelected(int arg0) {
            if (isHavaPoint) {
                for (int i = 0; i < mPointViews.length; i++) {
                    mPointViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);
                    if (arg0 != i) {
                        mPointViews[i].setBackgroundResource(R.drawable.page_indicator);
                    }
                }
            }
            mIsSwitched = true;
        }
    }


    private void startTimer() {
        if (mTimer == null) {
            mTimer = new Timer(true);
        }
        mTimer.schedule(new TimerTask() {

            @Override
            public void run() {
                mHandler.sendEmptyMessage(0);
            }
        }, 1000, time);
    }


    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case 0:
                if (mIsSwitched) {
                    mIsSwitched = false;
                } else {
                    int now = mViewPager.getCurrentItem();
                    int size = mPageViews == null ? 0 : mPageViews.size();
                    if (now < size - 1) {
                        now++;
                    } else {
                        now = 0;
                    }
                    mViewPager.setCurrentItem(now, true);
                }
            }
        }
    };

    private void stopTimer() {
        if (mTimer != null) {
            mTimer.cancel();
            mTimer = null;
        }
    }

    //在垃圾回收之前停止计时器
    @Override
    protected void finalize() throws Throwable {
        stopTimer();
    };

    private GuidePageAdapter getGuidePageAdapter() {
        if (mGuidePageAdapter == null) {
            mGuidePageAdapter = new GuidePageAdapter();
        }
        return mGuidePageAdapter;
    }

    private GuidePageChangeListener getGuidePageChangeListener() {
        if (mGuidePageChangeListener == null) {
            mGuidePageChangeListener = new GuidePageChangeListener();
        }
        return mGuidePageChangeListener;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值