博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 轮播图从 0 到 1
阅读量:5889 次
发布时间:2019-06-19

本文共 8552 字,大约阅读时间需要 28 分钟。

轮播图是 Android 常用功能之一,效果大概是这样的:

之前我封装写了一个,基本达到了要求,是继承了 Fragment(当时脑袋肯定锈掉了),里面 Viewpager add Fragment,这次项目多处有轮播图,发现之前封装的不够用,简直漏洞百出:1、比如底部 point 的位置,之前固定在中间,现在可能要放在右下角,point 最好也能动态改图片;2、现在项目跟微信一样,底部 tab 切换,中间是 Fragment 替换,发现轮播图有问题,Fragment A 循环的 point 的 positoin 居然影响到了 Fragment B,照理,这是两个 BannerFragment,不会影响的啊,报以下错误:

java.lang.IllegalStateException: The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged!

经过排查,找到了原因,因为 Viewpager add Fragment 我全部放在一个类,因此:

public static List bannerList = new ArrayList<>();

这里 static 坏事了,之前一个 banner 没有暴露出来。3、继承了 Fragment,引用比较麻烦,Fragment 有两者引用方法,xml 和代码,两者方式 addData 却报错;4、banner 没有写点击回调。

再次封装

综合以上问题,我进行了优化,继承 LinearLayout,当一个控件来引用,省去不必要的麻烦,底部 point 的位置可以设置:

pointLayout.setGravity(bannerPointGravity);

另外自定义了属性,动态设置 point 大小和图片,轮播图循环时间,也能代码设置,完整代码示例:

* Created by WuXiaolong on 2017/8/24. * 个人博客:http://wuxiaolong.me */public class BannerLayout extends LinearLayout {    private ViewPager viewPager;    private LinearLayout pointLayout;    private ScheduledExecutorService scheduler;    private int mPosition = 0;    private int mBannerCount = 1;    private Context context;    private Activity activity;    private int bannerPointSize;    private int bannerPointGravity;    private int bannerPointDrawableSelected, bannerPointDrawableUnselected;    private int bannerDelaySecond;    public BannerLayout(Context context) {        this(context, null);    }    public BannerLayout(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public BannerLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        initView(context, attrs);    }    private void initView(Context context, AttributeSet attrs) {        this.context = context;        activity = (Activity) context;        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerLayout);        bannerPointSize = typedArray.getDimensionPixelSize(R.styleable.BannerLayout_bannerPointSize, 10);        bannerPointGravity = typedArray.getInt(R.styleable.BannerLayout_bannerPointGravity, Gravity.CENTER);        bannerDelaySecond = typedArray.getInt(R.styleable.BannerLayout_bannerDelaySecond, 5);        bannerPointDrawableSelected = typedArray.getResourceId(R.styleable.BannerLayout_bannerPointDrawableSelected, R.mipmap.point01);        bannerPointDrawableUnselected = typedArray.getResourceId(R.styleable.BannerLayout_bannerPointDrawableUnselected, R.mipmap.point02);        typedArray.recycle();        View view = View.inflate(context, R.layout.banner_view_pager, null);        addView(view);        viewPager = (ViewPager) view.findViewById(R.id.viewPager);        pointLayout = (LinearLayout) view.findViewById(R.id.pointLayout);        pointLayout.setGravity(bannerPointGravity);        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            @Override            public void onPageSelected(int position) {                addPointLayout(position);            }            @Override            public void onPageScrollStateChanged(int state) {            }        });    }    public void start(List bannerList) {        bannerShutdown();        mBannerCount = bannerList.size();        BannerPagerAdapter bannerPagerAdapter = new BannerPagerAdapter(context, bannerList);        viewPager.setAdapter(bannerPagerAdapter);        addPointLayout(0);        startScheduler();    }    private void addPointLayout(int position) {        pointLayout.removeAllViews();        for (int i = 0; i < mBannerCount; i++) {            ImageView imageView = new ImageView(context);            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(bannerPointSize, bannerPointSize);            layoutParams.setMargins(10, 0, 0, 0);            imageView.setLayoutParams(layoutParams);            if (position == i) {                imageView.setImageResource(bannerPointDrawableSelected);            } else {                imageView.setImageResource(bannerPointDrawableUnselected);            }            pointLayout.addView(imageView);        }    }    private void startScheduler() {        scheduler = Executors.newSingleThreadScheduledExecutor();        scheduler.scheduleAtFixedRate(new Runnable() {            @Override            public void run() {                mPosition = viewPager.getCurrentItem();                if (mPosition < mBannerCount - 1) {                    mPosition++;                } else {                    mPosition = 0;                }                activity.runOnUiThread(new Runnable() {                    @Override                    public void run() {                        viewPager.setCurrentItem(mPosition);                    }                });            }        }, 1, bannerDelaySecond, TimeUnit.SECONDS);    }    public void bannerShutdown() {        if (scheduler != null)            scheduler.shutdown();    }    private class BannerPagerAdapter extends PagerAdapter {        private List bannerList = new ArrayList<>();        private Context context;        BannerPagerAdapter(Context context, List bannerList) {            this.context = context;            this.bannerList.clear();            this.bannerList.addAll(bannerList);        }        @Override        public int getCount() {            return bannerList.size();        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        @Override        public Object instantiateItem(ViewGroup container, final int position) {            ImageView imageView = new ImageView(context);            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);            Object object = bannerList.get(position);            //这里我封装了 Glide 4.0 的工具类,用于显示图片            ImageLoaderUtil.load(context, object, imageView);            container.addView(imageView);            return imageView;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View) object);        }    }    public int dp2px(float var0) {        float var1 = context.getResources().getDisplayMetrics().density;        return (int) (var0 * var1 + 0.5F);    }    public void setBannerPointSize(int bannerPointSize) {        this.bannerPointSize = dp2px(bannerPointSize);    }    public void setBannerPointGravity(int bannerPointGravity) {        this.bannerPointGravity = bannerPointGravity;        pointLayout.setGravity(bannerPointGravity);    }    public void setBannerPointDrawableSelected(int bannerPointDrawableSelected) {        this.bannerPointDrawableSelected = bannerPointDrawableSelected;    }    public void setBannerPointDrawableUnselected(int bannerPointDrawableUnselected) {        this.bannerPointDrawableUnselected = bannerPointDrawableUnselected;    }    public void setBannerDelaySecond(int bannerDelaySecond) {        this.bannerDelaySecond = bannerDelaySecond;    }}

其中自定义属性的attrs.xml:

使用说明

xml

调用:

public class MainActivity extends AppCompatActivity {    private BannerLayout bannerView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        bannerView = (BannerLayout) findViewById(R.id.bannerView);        List bannerList = new ArrayList<>();        bannerList.add(R.mipmap.horizontal_default);        bannerList.add("http://pic1.win4000.com/wallpaper/5/598161750eddb.jpg");        bannerList.add("http://pic1.win4000.com/wallpaper/4/597efb5b6aae8.jpg");        bannerView.setBannerPointSize(10);        bannerView.setBannerPointGravity(Gravity.CENTER);        bannerView.setBannerPointDrawableSelected(R.drawable.gray_radius);        bannerView.setBannerPointDrawableUnselected(R.mipmap.point01);        bannerView.setBannerDelaySecond(5);        //banner 设置方法完毕时最后调用 start 方法        bannerView.start(bannerList);    }    @Override    protected void onStop() {        super.onStop();        bannerView.bannerShutdown();    }}

最后

欢迎加入Android进阶交流群;701740775。进群可免费领取一份最新技术大纲和Android进阶资料。请备注csdn

转载地址:http://wggix.baihongyu.com/

你可能感兴趣的文章
wcf服务契约的重载
查看>>
数据帮助类DBhelper的定义
查看>>
基础命令
查看>>
linux下单节点oracle数据库间ogg搭建
查看>>
PLSQL Developer软件使用大全
查看>>
javaWebSerivice学习篇4-WSDL文档结构图
查看>>
swift三方库
查看>>
python自定义线程池
查看>>
坑到了,EF执行带事物的存储过程
查看>>
杭州之行
查看>>
函数式宏定义用do...while(0)的好处
查看>>
oracle ORA-00917: missing comma 是因为少逗号
查看>>
策略模式简介
查看>>
UIViewController中loadView的用法(应当注意的几点)
查看>>
POJ NOI0105-42 画矩形
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
entity framework 6 通用数据类
查看>>
读取FTP上的excel文件,并写入数据库
查看>>
vs2008快捷键极其技巧 转载
查看>>