时间:2021-05-21
之前封装过一个,但总觉得不够优雅,就有了这个通用封装,很简洁,不知道够不够优雅,不过原来那个有跟随指示器和丝滑滑动效果,感兴趣可以看一下。
封装过程
1、自定义属性
selectPoint:选中指示器图标
normalPoint:未选中指示器图标
pointWidth:图标宽度
switchTime:轮播间隔事件
location:指示器位置,下中或下右
2、初始化View
初始化ViewPager和指示器组合View
3、绑定数据源
通过setImageData设置轮播图数据源
4、绑定点击事件
通过OnPageClickListener绑定点击事件
5、开启关闭轮播
start和stop方法开启和关闭轮播
用法
xml中
<com.goldou.lovesee.view.NewBannerView android:id="@+id/bannerView" android:layout_width="match_parent" app:selectPoint="@drawable/red_point" app:normalPoint="@drawable/gray_point" app:switchTime="4000" app:location="RIGHT" android:layout_height="200dp" />activity中
int[] imageList = {R.drawable.me_top, R.drawable.me_top, R.drawable.me_top, R.drawable.me_top}; NewBannerView bannerView = view.findViewById(R.id.bannerView); bannerView.setImageData(imageList); bannerView.start(); bannerView.setOnPageClickListener(new NewBannerView.OnPageClickListener() { @Override public void onPageClick(int position) { Toast.makeText(getActivity(), position + "", Toast.LENGTH_SHORT).show(); } });BannerView
public class NewBannerView extends RelativeLayout implements View.OnClickListener { private Context context; private int selectPoint, normalPoint; private float pointWidth = 7; private int location; private int CENTER = 0, RIGHT = 1; private int lastPosition = 0; private ViewPager viewPager; private int switchTime = 5000; private int[] images; private OnPageClickListener onPageClickListener; private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg.what == 101) { viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); start(); } return false; } }); public NewBannerView(Context context) { this(context, null); } public NewBannerView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public NewBannerView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.context = context; initAttr(attrs); } private void initAttr(AttributeSet attrs) { TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.NewBannerView); selectPoint = array.getResourceId(R.styleable.NewBannerView_selectPoint, R.mipmap.ic_launcher_round); normalPoint = array.getResourceId(R.styleable.NewBannerView_normalPoint, R.mipmap.ic_launcher_round); pointWidth = array.getDimension(R.styleable.NewBannerView_pointWidth, pointWidth); location = array.getInteger(R.styleable.NewBannerView_location, RIGHT); switchTime = array.getInteger(R.styleable.NewBannerView_switchTime, switchTime); array.recycle(); } public void setImageData(final int[] images) { this.images = images; final LinearLayout ll_point = new LinearLayout(context); LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); layoutParams.addRule(ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE); layoutParams.bottomMargin = 20; if (location == CENTER) { layoutParams.addRule(CENTER_HORIZONTAL, RelativeLayout.TRUE); } else { layoutParams.addRule(ALIGN_PARENT_RIGHT, RelativeLayout.TRUE); layoutParams.rightMargin = 20; } LinearLayout.LayoutParams params1 = new LinearLayout.LayoutParams(UIUtil.dip2px(pointWidth), UIUtil.dip2px(pointWidth)); LinearLayout.LayoutParams params2 = new LinearLayout.LayoutParams(UIUtil.dip2px(pointWidth), UIUtil.dip2px(pointWidth)); params1.leftMargin = 0; params2.leftMargin = UIUtil.dip2px(pointWidth); for (int i = 0; i < images.length; i++) { ImageView point = new ImageView(context); if (i == 0) { point.setBackgroundResource(selectPoint); point.setLayoutParams(params1); } else { point.setBackgroundResource(normalPoint); point.setLayoutParams(params2); } ll_point.addView(point); } viewPager = new ViewPager(context); viewPager.setAdapter(new BannerAdapter()); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { position = position % images.length; if (lastPosition == position) { return; } ll_point.getChildAt(position).setBackgroundResource(selectPoint); ll_point.getChildAt(lastPosition).setBackgroundResource(normalPoint); lastPosition = position; } @Override public void onPageScrollStateChanged(int state) { } }); LayoutParams layoutParams1 = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); addView(viewPager, layoutParams1); addView(ll_point, layoutParams); } public void start() { handler.sendEmptyMessageDelayed(101, switchTime); } public void stop() { handler.removeCallbacksAndMessages(null); } private int getCurrentItem() { return viewPager.getCurrentItem() % images.length; } @Override public void onClick(View view) { onPageClickListener.onPageClick(getCurrentItem()); } public interface OnPageClickListener { void onPageClick(int position); } public void setOnPageClickListener(OnPageClickListener onPageClickListener) { this.onPageClickListener = onPageClickListener; } private class BannerAdapter extends PagerAdapter { @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { position = position % images.length; ImageView imageView = new ImageView(context); imageView.setImageResource(images[position]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setOnClickListener(NewBannerView.this); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
AndroidAsyncTask详解及使用方法简介:AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask,是android提供
这篇文章主要介绍了PythonDjango封装分页成通用的模块详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参
rubyftp封装实例详解最近自己用ruby封装了一个Net::FTP的工具类.classFtpTooldefinitialize()@current_ftp=
微信小程序之网络请求简单封装实例详解在微信小程序中实现网络请求相对于Android来说感觉简单很多,我们只需要使用其提供的API就可以解决网络请求问题。普通HT
微信小程序滚动选择器(时间日期)详解微信小程序自己封装了很多控件,用起来确实很方便,如果这是Android里面,还需要自己去定义,不废话,效果图:一起来看看怎么