我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android如何封装Banner控件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android如何封装Banner控件

这篇文章主要介绍“Android如何封装Banner控件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android如何封装Banner控件”文章能帮助大家解决问题。

Android如何封装Banner控件

如上图所示效果我们应该都不陌生,这是一个简单的banner轮播效果,网上也有很多的开源项目,但有时候可能我们仅仅只需要一些简单的效果,并不需要其他过多的东西。这里简单的对banner进行一下封装,随时调用和添加一些新的功能。

代码展示

public class BannerView extends FrameLayout implements ViewPager.OnPageChangeListener{    private ViewPager viewPager;    //网络图片地址    private List<String> imageUrls;    //指示点的容器    private LinearLayout pointLayout;    //当前页面位置    private int currentItem;    //自动播放时间    private int autoPlayTime = 2000;    //是否自动播放    private boolean isAutoPlay;    //是否是一张图片    private boolean isOneImage;    //监听事件    private OnBannerItemClick onBannerItemClick;    //这里利用handler实现循环播放    private Handler handler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            currentItem++;            currentItem = currentItem % (imageUrls.size() + 2);            viewPager.setCurrentItem(currentItem);            handler.sendEmptyMessageDelayed(0,autoPlayTime);            return false;        }    });    public BannerView(@NonNull Context context) {        this(context,null);    }    public BannerView(@NonNull Context context, @Nullable AttributeSet attrs) {        this(context, attrs,0);    }    public BannerView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {        super(context, attrs, defStyleAttr);        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.BannerView,0,0);        //默认自动播放        isAutoPlay = typedArray.getBoolean(R.styleable.BannerView_isAutoPlay,true);        typedArray.recycle();        viewPager = new ViewPager(getContext());        pointLayout = new LinearLayout(getContext());        //添加监听事件        viewPager.addOnPageChangeListener(this);        //利用布局属性将指示器容器放置底部并居中        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);        params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;        params.bottomMargin = 60;        addView(viewPager);        addView(pointLayout,params);    }    @Override    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {    }    @Override    public void onPageSelected(int position) {        currentItem = position;        if (!isOneImage) {            switchToPoint(toRealPosition(position));        }    }    @Override    public void onPageScrollStateChanged(int state) {    //根据滑动松开后的状态,去判断当前的current 并跳转到指定current        if (state == ViewPager.SCROLL_STATE_IDLE) {            int current = viewPager.getCurrentItem();            int lastReal = viewPager.getAdapter().getCount() - 2;            if (current == 0) {                viewPager.setCurrentItem(lastReal, false);            } else if (current == lastReal + 1) {                viewPager.setCurrentItem(1, false);            }        }    }    //配置viewpager适配器    private class BannerAdapter extends PagerAdapter {        @Override        public int getCount() {            return imageUrls.size() + 2;        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        @Override        public Object instantiateItem(ViewGroup container, final int position) {            ImageView imageView = new ImageView(getContext());            imageView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    if (onBannerItemClick != null) {                        onBannerItemClick.onItemClick(toRealPosition(position));                    }                }            });            imageView.setScaleType(ImageView.ScaleType.FIT_XY);            Glide.with(getContext()).load(imageUrls.get(toRealPosition(position))).into(imageView);            container.addView(imageView);            return imageView;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View) object);        }    }    //添加网络图片    public void setImageUrls(List<String> imageUrls) {        this.imageUrls = imageUrls;        if (imageUrls.size() <= 1) {            isOneImage = true;        }else {            isOneImage = false;        }        initViewPager();    }    //加载viewPager    private void initViewPager() {        if (!isOneImage) {            //添加指示点            addPoints();        }        BannerAdapter adapter = new BannerAdapter();        viewPager.setAdapter(adapter);        //默认当前图片        viewPager.setCurrentItem(1);        //判断是否自动播放和是否是一张图片的情况        if (isAutoPlay && !isOneImage) {            handler.sendEmptyMessageDelayed(0,autoPlayTime);        }    }    //添加指示点    private void addPoints() {        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);        lp.setMargins(10, 10, 10, 10);        ImageView imageView;        int length = imageUrls.size();        for (int i = 0; i < length; i++) {            imageView = new ImageView(getContext());            imageView.setLayoutParams(lp);            imageView.setImageResource(R.drawable.select_point_bg);            pointLayout.addView(imageView);        }        switchToPoint(0);    }    //切换指示器    private void switchToPoint(int currentPoint) {        for (int i = 0; i < pointLayout.getChildCount(); i++) {            pointLayout.getChildAt(i).setEnabled(false);        }        pointLayout.getChildAt(currentPoint).setEnabled(true);    }    //返回真实的位置    private int toRealPosition(int position) {        int realPosition;        if (imageUrls.size() > 0) {            realPosition = (position - 1) % imageUrls.size();            if (realPosition < 0)                realPosition += imageUrls.size();        }else{            realPosition = 0;        }        return realPosition;    }    public void setAutoPlay(boolean autoPlay) {        isAutoPlay = autoPlay;    }    public void setOnBannerItemClick(OnBannerItemClick onBannerItemClick) {        this.onBannerItemClick = onBannerItemClick;    }    //添加监听事件回调    public interface OnBannerItemClick{        void onItemClick(int position);    }}

调用方式

        //设置是否自动播放        bannerView.setAutoPlay(true);        //添加网络图片        bannerView.setImageUrls(data);        //banner的点击事件        bannerView.setOnBannerItemClick(new BannerView.OnBannerItemClick() {            @Override            public void onItemClick(int position) {                Toast.makeText(MainActivity.this,"图片" + position,Toast.LENGTH_LONG).show();            }        });

代码分析

这里我只考虑了使用网络图片进行展示,使用本地图片原理是一样的,在里面多加个方法即可。此效果代码不是很复杂,通俗易懂。唯一值得一说的是我在实现viewpager无限滑动时采用的是return imageUrls.size() + 2的方法。这里我们添加两条数据分别为第一条和最后一条。第一条代表着最后一张图片而最后一条则代表着第一张图片。

通过此图我们应该不难发现,当我们滑动到第二个0的时候则跳转到第一个0,滑动到第一个2的时候则跳转到第二个2。这里0代表第一张图片,2代表第二张图片。这样就可以实现无限滑动的效果了,可能有些人会觉得这样做有些复杂还要判断真实的位置不如直接将getConut()返回一个最大值然后取其中间值即可。但这样做其实代码性能并不是很高。

关于“Android如何封装Banner控件”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android如何封装Banner控件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android如何封装Banner控件

这篇文章主要介绍“Android如何封装Banner控件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android如何封装Banner控件”文章能帮助大家解决问题。如上图所示效果我们应该都不陌生,
2023-07-05

Android封装Banner控件方法介绍

android-banner实现了一般banner循环轮播的效果,一页只显示一张图片,也可以一页显示一张图和相邻两个图片的一部分,此项目仅仅是banner展示图片,没有多余的诸如指示器、页面切换动画等效果代码,详见效果图和案例代码
2023-03-12

Android自定义封装banner组件

自定义封装 banner 组件,供大家参考,具体内容如下1. 效果图预览 2.基本功能一个简单方便的轮播图组件,基于viewpager 基础上进行的封装。可设置 项目中图片,网络图片, View;支持循环自动播放,手势滑动切换,item点击
2023-05-31

android控件封装 自己封装的dialog控件

自定义dialog肯定是用的很多了但是感觉每次做都是很乱 单纯完成任务而已,现在封装了一下 以后用到直接copy 先上图: 主activity 代码如下: package com.su.testcustomdialog; import c
2022-06-06

android控件Banner如何实现简单轮播图效果

小编给大家分享一下android控件Banner如何实现简单轮播图效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!本文实例为大家分享了android控件Banner实现简单轮播图效果的具体代码,供大家参考,具体内容如下实
2023-06-15

jquery如何封装插件

jQuery插件封装是一种组织代码的有效方法,使其可重用和模块化。本文详细介绍了插件封装的过程:创建jQuery对象、定义选项、实现功能、使用插件、增强功能和发布插件。插件的优点包括可重用性、模块化、代码共享和自定义。最佳实践包括选择描述性名称、编写清晰文档和遵循最佳实践。
jquery如何封装插件
2024-04-02

Banner如何在Android应用中使用

这期内容当中小编将会给大家带来有关Banner如何在Android应用中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。首先倒入一个依赖: compile com.youth.banner:banner
2023-05-31

vue如何封装TabBar组件

这篇文章主要为大家展示了“vue如何封装TabBar组件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何封装TabBar组件”这篇文章吧。实现思路:步骤一:TabBar和TabBarIt
2023-06-25

vue3如何封装Notification组件

这篇文章给大家分享的是有关vue3如何封装Notification组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。弹窗组件的思路基本一致:向body插入一段HTML。我将从创建、插入、移除这三个方面来说我的做法
2023-06-29

如何封装vue日历组件

这篇文章将为大家详细讲解有关如何封装vue日历组件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下图示封装的组件的代码如下