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

来源:互联网 发布:photoshop盖印图层 mac 编辑:程序博客网 时间:2024/05/22 00:25

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

在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;    }}
0 0
原创粉丝点击