package com.example.zdylb; import android.content.Context; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; 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 com.bumptech.glide.Glide; import java.util.ArrayList; import java.util.List; /** * Created by huoxuebin on 2018/1/1. */ public class Banner extends FrameLayout { private ViewPager viewPager; private LinearLayout linearLayout; private List<String> list; private int time = 2; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { //viewPager显示下一页 viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); //再次发送延时消息 handler.sendEmptyMessageDelayed(0, time * 1000); } } }; private ArrayList<ImageView> images; private OnBannerClickListner bannerClickListner; public Banner(@NonNull Context context) { super(context); init(); } public Banner(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public Banner(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 对外提供设置时间 */ public void setTimeSeconds(int time) { this.time = time; } /** * 初始化的方法,,,加载布局 */ private void init() { View view = View.inflate(getContext(), R.layout.bannner_layout, this); //找到控件 viewPager = view.findViewById(R.id.banner_view_pager); linearLayout = view.findViewById(R.id.linear_bannner); } /** * 对外提供设置数据的方法 */ public void setImageUrl(List<String> list) { this.list = list; if (list == null) { return; } //设置适配器 MyAdapter myAdapter = new MyAdapter(getContext(), list); //设置适配器 viewPager.setAdapter(myAdapter); initDoc(list); //2.手动的可以无限滑动 viewPager.setCurrentItem(list.size() * 100000);//设置当前展示中间某个足够大的位置 handler.sendEmptyMessageDelayed(0, time * 1000);//发送一个延时的空消息 //viewPage设置监听事件 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** * 当选中某个页面的时候,把当前的小圆点背景变成绿色 * @param position */ @Override public void onPageSelected(int position) { for (int i = 0; i < images.size(); i++) { if (i == position % images.size()) { images.get(i).setImageResource(R.drawable.shape_01); } else { images.get(i).setImageResource(R.drawable.shape_02); } } } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 动态添加小圆点 * * @param list */ private void initDoc(List<String> list) { //1.需要一个集合记录一下小圆点的imageView控件 images = new ArrayList<ImageView>(); //2...linearLayout上面的视图清空一下再去添加 linearLayout.removeAllViews(); for (int i = 0; i < list.size(); i++) { ImageView imageView = new ImageView(getContext()); if (i == 0) { imageView.setImageResource(R.drawable.shape_01); } else { imageView.setImageResource(R.drawable.shape_02); } //添加到集合去 images.add(imageView); //添加到线性布局上 //这是布局参数,,刚开始小圆点之间没有距离,所以使用java代码指定宽度高度,并且指定小圆点之间的距离 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5, 0, 5, 0); linearLayout.addView(imageView, params); } } private class MyAdapter extends PagerAdapter { Context context; List<String> list; public MyAdapter(Context context, List<String> list) { this.context = context; this.list = list; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * viewPager具有预加载,默认的前后加载一页,,,默认的容器里面最多三页 * * @param container * @param position * @return */ @Override public Object instantiateItem(ViewGroup container, final int position) { //1.把这个当前展示的视图添加到容器中...container ImageView imageView = new ImageView(context); //..........使图片平铺整个imageView控件 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //imageLoader加载图片到这个imageView控件上 Glide.with(context).load(list.get(position%list.size())).into(imageView); //给imageView设置触摸的监听事件 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { int action = motionEvent.getAction();//获取手指的动作 switch (action) { case MotionEvent.ACTION_DOWN://按下的动作...应该取消发送消息的操作 handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_MOVE://移动的动作 handler.removeCallbacksAndMessages(null); break; case MotionEvent.ACTION_CANCEL://取消 //重新发送 handler.sendEmptyMessageDelayed(0, time * 1000); break; case MotionEvent.ACTION_UP://抬起的动作 handler.sendEmptyMessageDelayed(0, time * 1000); break; } return false; } }); imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { bannerClickListner.onBannerClick(position % list.size()); } }); container.addView(imageView);//添加到容器 //2.把当前展示的视图返回 return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //销毁视图 container.removeView((View) object); } } public void setOnBannerClickListner(OnBannerClickListner bannerClickListner){ this.bannerClickListner = bannerClickListner; } /** * 点击的接口 */ public interface OnBannerClickListner { public void onBannerClick(int position); } }
自定义view轮播
最新推荐文章于 2024-04-09 01:09:46 发布