Android-简单的轮播图控件BannerView

来源:互联网 发布:dwg用什么软件 编辑:程序博客网 时间:2024/06/06 19:21

由于轮播图控件比较常用,就自己封装了一个简单的轮播图控件,废话不多说,直接上代码,使用的时候直接把下面这个类加入到工程就可以了


/** * Created by skyfly on 2017/9/13. * 通用的BannerView类 */public class BannerView extends LinearLayout implements ViewPager.OnPageChangeListener {    private ViewPager mViewPager;    private BannerAdapter mAdapter;    private BannerViewListener mListener;    private int mSelectedPageIndex = 0;    private LinearLayout mIndicatorView;    private BannerHandler mHandler;    private boolean mIsScroll = false;    private static int MSG_LOOP = 0x0001, LOOP_INTERVAL = 3000;    private static class BannerHandler extends Handler {        private WeakReference<BannerView> weakReference = null;        public BannerHandler(BannerView bannerView) {            super(Looper.getMainLooper());            this.weakReference = new WeakReference<BannerView>(bannerView);        }        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (this.weakReference == null) {                return;            }            BannerView bannerView = this.weakReference.get();            if (bannerView == null || bannerView.mViewPager == null || bannerView.mViewPager.getAdapter() == null || bannerView.mViewPager.getAdapter().getCount() <= 1) {                return;            }            if (!bannerView.mIsScroll)            {                bannerView.mViewPager.setCurrentItem(bannerView.mSelectedPageIndex+1, true);            }        }    }    public interface BannerViewListener    {        void onShowImage(ImageView view, String imgUrl);        void onItemClick(int position, String targetUrl, Object userData);        View onCreateIndicatorView();    }    public BannerView(Context context) {        this(context, null);    }    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {        selectIndicatorView(mAdapter.getDataPosition(mSelectedPageIndex), false);        mSelectedPageIndex = position;        selectIndicatorView(mAdapter.getDataPosition(mSelectedPageIndex), true);    }    @Override    public void onPageScrollStateChanged(int state) {        if (state == 1)        {            mIsScroll = true;        }        else if(state == 2)        {            mIsScroll = false;            mHandler.removeCallbacksAndMessages(null);            mHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);        }    }    public BannerView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public BannerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initViews(context);    }    private void initViews(Context context) {        // 动态创建对象        RelativeLayout rl_banner = new RelativeLayout(context);        rl_banner.setLayoutParams(new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));        this.addView(rl_banner, MATCH_PARENT, MATCH_PARENT);        mViewPager = new ViewPager(context);        rl_banner.addView(mViewPager, MATCH_PARENT, MATCH_PARENT);        mIndicatorView = new LinearLayout(context);        mIndicatorView.setOrientation(HORIZONTAL);        mIndicatorView.setGravity(CENTER);        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);        lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);        lp.bottomMargin = (int) dip2px(context, 6);        mIndicatorView.setLayoutParams(lp);        rl_banner.addView(mIndicatorView);        mViewPager.setAdapter(mAdapter = new BannerAdapter(this));        mViewPager.addOnPageChangeListener(this);        mHandler = new BannerHandler(this);        // 启动循环        mHandler.sendEmptyMessageDelayed(MSG_LOOP, LOOP_INTERVAL);    }    public void setBannerViewListener(BannerViewListener l)    {        mListener = l;    }    // 设置数据    public void setBannerDatas(ArrayList<BannerInfo> data)    {        mAdapter.setBannerDatas(data);        // 移除旧的        mIndicatorView.removeAllViews();        // 添加新的        if (data.size() > 1) {            for (int i = 0; i < data.size(); i++) {                if (mListener != null)                {                    mIndicatorView.addView(mListener.onCreateIndicatorView());                }            }        }        if(data.size() > 1) {            // 选中新的            selectIndicatorView(mAdapter.getDataPosition(mSelectedPageIndex), true);        }    }    private void selectIndicatorView(int index, boolean bSelected)    {        View v = mIndicatorView.getChildAt(index);        if (v != null)        {            v.setSelected(bSelected);        }    }    private void onItemClick()    {        if (mListener != null)        {            BannerInfo info = mAdapter.getItem(mSelectedPageIndex);            if(info != null)            {                mListener.onItemClick(mAdapter.getDataPosition(mSelectedPageIndex), info.mTargetUrl, info.mUserData);            }        }    }    private void onShowImage(ImageView v, String url)    {        if (mListener != null)        {            mListener.onShowImage(v, url);        }    }    private float dip2px(Context context, float dpValue) {        final float scale = context.getResources().getDisplayMetrics().density;        return (dpValue * scale + 0.5f);    }    public static class BannerInfo    {        public String mImgUrl;        public String mTargetUrl;        public Object mUserData;        public BannerInfo(String img, String url)        {            this(img, url, null);        }        public BannerInfo(String img, String url, Object userData)        {            mImgUrl = img;            mTargetUrl = url;            mUserData = userData;        }    }    private class BannerAdapter extends PagerAdapter implements View.OnClickListener    {        private ArrayList<BannerInfo> mData = new ArrayList<>();        WeakReference<BannerView> mBannerViewWeakReference ;        public BannerAdapter(BannerView v)        {            mBannerViewWeakReference  = new WeakReference<BannerView>(v) ;        }        public void setBannerDatas(ArrayList<BannerInfo> data)        {            mData = data;            notifyDataSetChanged();        }        @Override        public int getCount() {            return mData.size() > 1 ? 100000000:mData.size();        }        @Override        public boolean isViewFromObject(View v, Object o) {            return v == o;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View) object);        }        @Override        public Object instantiateItem(ViewGroup container, int position) {            ImageView iv = new ImageView(container.getContext());            iv.setScaleType(ImageView.ScaleType.CENTER_CROP);            iv.setOnClickListener(this);            container.addView(iv, -1, -1);            BannerInfo info = getItem(position);            if ( mBannerViewWeakReference.get() != null ){                mBannerViewWeakReference.get().onShowImage(iv, info.mImgUrl);            }            return iv;        }        public BannerInfo getItem(int position)        {            if (mData.size() < 1)            {                return null;            }            return mData.get(position%mData.size());        }        @Override        public void onClick(View view) {            Log.i("aaaa", "onClick");            if ( mBannerViewWeakReference.get() != null ){                mBannerViewWeakReference.get().onItemClick();            }        }        @Override        public int getItemPosition(Object object) {            //return super.getItemPosition(object);            return POSITION_NONE;        }        public int getDataPosition(int position)        {            return position%mData.size();        }    }}


用法也比较简单,在XML中直接引用

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.penquanyun.datarecover.views.OrderTabFragment">    <com.skyfly.controls.BannerView        android:id="@+id/banner"        android:layout_width="match_parent"        android:layout_height="160dp" /></FrameLayout>

初始化JAVA代码

BannerView bv = (BannerView) view.findViewById(R.id.banner);bv.setBannerViewListener(new BannerView.BannerViewListener() {    @Override    public void onShowImage(ImageView view, String imgUrl) {        BitmapUtils.getInstance().display(getContext(), view, imgUrl, R.drawable.img_banner_default);    }    @Override    public void onItemClick(int position, String targetUrl, Object userData) {    }    @Override    public View onCreateIndicatorView() {        ImageView v = new ImageView(getContext());        v.setPadding(10, 0, 0, 0);        v.setImageResource(R.drawable.pager_indicator_selector);        return v;    }});ArrayList<BannerView.BannerInfo> testData = new ArrayList<>();testData.add(new BannerView.BannerInfo("http://f11.baidu.com/it/u=918331178,1783361582&fm=72", ""));testData.add(new BannerView.BannerInfo("http://f11.baidu.com/it/u=1678574154,1323011225&fm=72", ""));testData.add(new BannerView.BannerInfo("http://f11.baidu.com/it/u=1678574154,1323011225&fm=72", ""));testData.add(new BannerView.BannerInfo("http://f11.baidu.com/it/u=918331178,1783361582&fm=72", ""));testData.add(new BannerView.BannerInfo("http://f11.baidu.com/it/u=1678574154,1323011225&fm=72", ""));bv.setBannerDatas(testData);

onShowImage会在现实图片等时候调用,根据自己工程中使用的图片库自己实现

onCreateIndicatorView,在创建标签View的时候调用,这里可以自己随便定制

BannerInfo构造函数有多个实现,第一个参数是要显示的图片URL,第二个参数是点击后要跳转的URL,

pager_indicator_selector 是一个资源,这里给个参考

<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" >   <item android:state_selected="true" android:drawable="@drawable/icon_pager_indicator_selected" />   <item android:drawable="@drawable/icon_pager_indicator_normal"/></selector>



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小天才电话手表联不上网怎么办 肺炎用激素治疗后肚子大了怎么办 8岁以下儿童总是低烧不退怎么办? 微博里面的视频不能改变方向怎么办 朗逸导航倒车一体机死机了怎么办 乐淘乐电话手表的二维码没了怎么办 艾蔻儿童手表二维码丢了怎么办 糖猫儿童智能手表二维码丢了怎么办 海信电视用遥控器关了打不开怎么办 创维4k电视遥控器按键坏了怎么办 大疆3s云台陀螺仪错误怎么办 无线路由我用手机上网网速慢怎么办 下载的软件安装包以丢失怎么办 战舰世界航母的飞机恐惧状态怎么办 cad打开图纸不显示轴号怎么办 若背包忘在服务区没拿怎么办 使劲擤鼻涕耳朵耳朵疼了怎么办 用力擤鼻涕一侧的脸肿了怎么办 擦鼻涕太用力耳朵塞住了怎么办 宝宝鼻腔里有鼻涕呼呼响怎么办 黏痰在嗓子眼很干出不来怎么办 宝宝生病好了不久突然又咳嗽怎么办 7个月的宝宝经常生病怎么办 擤鼻涕鼻子周围红肿爆皮怎么办 洗衣机有鼻涕虫洗过的衣服怎么办 手机丢了里边有穿内衣照片怎么办 脸上不知是过敏还是湿疹流水怎么办 一个月的宝宝鼻子不通气怎么办 六个月的宝宝有清水鼻涕怎么办 一岁三个月宝宝流清鼻涕怎么办 宝宝流清水鼻涕怎么办最简单方法 8个月宝宝流清鼻涕怎么办 7个月宝宝流清鼻涕怎么办 9个月宝宝流清鼻涕怎么办 十一个月宝宝流清鼻涕怎么办 18个月宝宝咳嗽有痰怎么办 2个月宝宝鼻子不通气怎么办 两个月的宝宝鼻塞不通气怎么办 两个月大的宝宝鼻子不通气怎么办 宝宝6个月咳嗽有痰怎么办 6个月的宝宝有痰怎么办