<?xml version="1.0" encoding="utf-8"?>
一:banner布局 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="200dp" android:id="@+id/banner_viewpager" ></android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/linear_banner" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignBottom="@+id/banner_viewpager" android:layout_marginBottom="10dp" android:layout_centerHorizontal="true" ></LinearLayout></RelativeLayout>
二:自定义CustomBanner
public class CustomBanner extends FrameLayout { private ViewPager viewPager; private LinearLayout linearLayout; private List<String> list; private int time=2; //第九步handler private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(msg.what==0){ int currentItem = viewPager.getCurrentItem(); viewPager.setCurrentItem(currentItem+1); //再次发送 handler.sendEmptyMessageDelayed(0,time*1000); } } }; private List<ImageView> listDoc; private OnClickLisner onClickLisner; //第一步 public CustomBanner(@NonNull Context context) { super(context); //第二步初始化 init(); } public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public CustomBanner(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } //初始化 private void init() { View view = View.inflate(getContext(), R.layout.banner_item, this); //找到控件 viewPager = (ViewPager) view.findViewById(R.id.banner_viewpager); linearLayout = (LinearLayout) view.findViewById(R.id.linear_banner); } //第三部 // 对外提供设置images路径 public void setImageUrls(List<String> list){ this.list=list; if(list==null){ return; } //第四部 // 创建适配器 LunBoAdapter lunBoAdapter=new LunBoAdapter(list,getContext()); //第五步 // 添加到viewpager上,就可以去MainActity里操作了 viewPager.setAdapter(lunBoAdapter); //显示中间的位置 viewPager.setCurrentItem(list.size()*10000); //使用handler自动轮播 //延迟消息 handler.sendEmptyMessageDelayed(0,1000); //第十步小圆点 initDoc(); //第十一步状态改变监听事件 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //在选中某一页的时候,切换小圆点 for(int i=0;i<listDoc.size();i++){ if(position%listDoc.size()==i){ listDoc.get(i).setBackgroundResource(R.drawable.shape_01); }else{ listDoc.get(i).setBackgroundResource(R.drawable.shape_02); } } } @Override public void onPageScrollStateChanged(int state) { } }); } // 十 初始化小圆点 private void initDoc() { //创建一个集合,记录小圆点 listDoc = new ArrayList<>(); //清空布局 linearLayout.removeAllViews(); //进行添加 for (int i=0;i<list.size();i++){ ImageView docImage=new ImageView(getContext()); //第一个小圆点 if(i==0){ docImage.setBackgroundResource(R.drawable.shape_01); }else{ docImage.setBackgroundResource(R.drawable.shape_02); } //添加到集合 listDoc.add(docImage); //添加到线性布局 LinearLayout.LayoutParams params =new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5,0,5,0); linearLayout.addView(docImage,params); } } //内部适配器 private class LunBoAdapter extends PagerAdapter{ private List<String> list; private Context context; public LunBoAdapter(List<String> list, Context context) { this.list = list; this.context = context; } @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, final int position) { //创建imageview ImageView imageView=new ImageView(context); //平铺 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //加载图片 Glide.with(context).load(list.get(position%list.size())).into(imageView); //添加到容器 container.addView(imageView); //第十六步在适配器中点击图片 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //触发 onClickLisner.onItemClick(position%list.size()); } }); //第十二步,给个触摸事件 imageView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()){ case MotionEvent.ACTION_DOWN: //取消handler身上的消息和回调 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; } }); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } //第八步 // 对外提供轮播时间 public void setTimeSecond(int time){ this.time = time; } //第十四步,点击事件,由第十三步生成的 public void setClickListner(OnClickLisner onClickLisner) { this.onClickLisner = onClickLisner; } //第十五步自己写个接口 public interface OnClickLisner{ void onItemClick(int position); } }三:MainActivity中方法
public class MainActivity extends AppCompatActivity { private CustomBanner customBanner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //第六步 // 拿到id customBanner = (CustomBanner) findViewById(R.id.custom_banner); //第七步 // 请求数据解析 getDataFromNet(); } public void getDataFromNet() { OkHttp3Util.doGet("https://www.zhaoapi.cn/product/getProductDetail?Pid=1&source=android", new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { if(response.isSuccessful()){ String json = response.body().string(); Gson gson =new Gson(); DetalBean detalBean = gson.fromJson(json, DetalBean.class); final List<String> list=new ArrayList<String>(); String[] images = detalBean.getData().getImages().split("\\|"); for (int i=0;i<images.length;i++){ list.add(images[i]); } //执行到主线程 runOnUiThread(new Runnable() { @Override public void run() { //设置显示轮播 customBanner.setImageUrls(list); //第十三步,点击可以进入其他页面 //点击事件 customBanner.setClickListner(new CustomBanner.OnClickLisner() { @Override public void onItemClick(int position) { Toast.makeText(MainActivity.this,"点击",Toast.LENGTH_SHORT).show(); } }); } }); } } }); } }四:MainActivity的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.banner_dome01.MainActivity"> <com.example.banner_dome01.CustomBanner android:id="@+id/custom_banner" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.example.banner_dome01.CustomBanner> </LinearLayout>
五:别忘了网络权限,读写权限,记得导入依赖1.ok的依赖 2.glide 3.gson