权限
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
依赖
//okhttp compile 'com.squareup.okhttp3:okhttp:3.6.0' compile 'com.squareup.okio:okio:1.11.0' //gson compile 'com.google.code.gson:gson:2.8.2' //glide implementation 'com.github.bumptech.glide:glide:4.4.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'//布局
drawable
un_checked_shape.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#88000000" /> <corners android:radius="10dp" /> <size android:width="10dp" android:height="10dp" /> </shape> checked_shape.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#ff0000" /> <corners android:radius="10dp" /> <size android:width="10dp" android:height="10dp" /> </shape>layout
activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dash="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.dash.custombanner.MainActivity"> <com.dash.custombanner.CustomBanner dash:time="5" android:id="@+id/custom_banner" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.dash.custombanner.CustomBanner> </LinearLayout>
custom_banner_layout
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v4.view.ViewPager android:id="@+id/custom_banner_view_pager" android:layout_width="match_parent" android:layout_height="200dp"> </android.support.v4.view.ViewPager> <LinearLayout android:layout_centerHorizontal="true" android:id="@+id/linear_doc" android:layout_marginBottom="10dp" android:layout_alignBottom="@+id/custom_banner_view_pager" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> </LinearLayout> </RelativeLayout>MainActivity
public class MainActivity extends AppCompatActivity { private CustomBanner customBanner; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customBanner = findViewById(R.id.custom_banner); //customBanner.setTimeSeconds(5); Map<String, String> params = new HashMap<>(); OkHttp3Util_03.doPost("https://www.zhaoapi.cn/ad/getAd", params, 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(); final CutomBean cutomBean = new Gson().fromJson(json,CutomBean.class); runOnUiThread(new Runnable() { @Override public void run() { List<String> imageUrls = new ArrayList<>(); final List<CutomBean.DataBean> data = cutomBean.getData(); for (int i = 0;i<data.size();i++) { imageUrls.add(data.get(i).getIcon()); } //设置图片地址的数据 customBanner.setImageUrls(imageUrls); //设置点击事件 customBanner.setOnBannerListner(new CustomBanner.OnBannerListner() { @Override public void onBannerClick(int position) { Toast.makeText(MainActivity.this,data.get(position).getTitle(),Toast.LENGTH_SHORT).show(); } }); } }); } } }); } }
OkHttp3Util_03
public class OkHttp3Util_03 { /** * 懒汉 安全 加同步 * 1.私有的静态成员变量 只声明不创建 * 2.私有的构造方法 * 3.提供返回实例的静态方法 */ private static OkHttpClient okHttpClient = null; private OkHttp3Util_03() { } public static OkHttpClient getInstance() { if (okHttpClient == null) { //加同步安全 synchronized (OkHttp3Util_03.class) { if (okHttpClient == null) { //okhttp可以缓存数据....指定缓存路径 File sdcache = new File(Environment.getExternalStorageDirectory(), "cache"); //指定缓存大小 int cacheSize = 10 * 1024 * 1024; okHttpClient = new OkHttpClient.Builder()//构建器 .connectTimeout(15, TimeUnit.SECONDS)//连接超时 .writeTimeout(20, TimeUnit.SECONDS)//写入超时 .readTimeout(20, TimeUnit.SECONDS)//读取超时 .addInterceptor(new CommonParamsInterceptor())//添加应用拦截器的方法 .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//设置缓存 .build(); } } } return okHttpClient; } /** * get请求 * 参数1 url * 参数2 回调Callback * * oldUrl表示老的地址,,,是没封装公共参数之前的地址....公共参数指的是source=android * */ public static void doGet(String oldUrl, Callback callback) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = getInstance(); //创建Request Request request = new Request.Builder().url(oldUrl).build(); //得到Call对象 Call call = okHttpClient.newCall(request); //执行异步请求 call.enqueue(callback);//异步执行..子线程不会阻塞...excute同步执行...阻塞线程 } /** * post请求 * 参数1 url * 参数2 Map<String, String> params post请求的时候给服务器传的数据 * add..("","") * add() */ public static void doPost(String url, Map<String, String> params, Callback callback) { //创建OkHttpClient请求对象 OkHttpClient okHttpClient = getInstance(); //3.x版本post请求换成FormBody 封装键值对参数 FormBody.Builder builder = new FormBody.Builder(); //遍历集合,,,map集合遍历方式 for (String key : params.keySet()) { builder.add(key, params.get(key)); } //创建Request....formBody...new formBody.Builder()...add()....build() Request request = new Request.Builder().url(url).post(builder.build()).build(); Call call = okHttpClient.newCall(request); call.enqueue(callback); } /** * 封装公共参数的拦截器 */ private static class CommonParamsInterceptor implements Interceptor{ //intercept方法就是拦截的意思....拦截的是一个请求,,,一旦拦截之后可以对请求的参数进行处理 //Chain chain 链条的意思 @Override public Response intercept(Chain chain) throws IOException { Log.e("----","拦截器------"); //调用request()方法得到拦截的请求 Request request = chain.request(); //获取请求的方式 String method = request.method();//GET POST //拦截的请求的路径 String oldUrl = request.url().toString(); //要添加的公共参数...map Map<String,String> map = new HashMap<>(); map.put("source","android"); if ("GET".equals(method)){ StringBuilder stringBuilder = new StringBuilder();//创建一个stringBuilder...字符串缓冲区 stringBuilder.append(oldUrl); if (oldUrl.contains("?")){ //?在最后面....2类型 if (oldUrl.indexOf("?") == oldUrl.length()-1){ }else { //3类型...拼接上& stringBuilder.append("&"); } }else { //不包含? 属于1类型,,,先拼接上?号 stringBuilder.append("?"); } //添加公共参数....source=android&appVersion=100& for (Map.Entry<String,String> entry: map.entrySet()) { //拼接 stringBuilder.append(entry.getKey()) .append("=") .append(entry.getValue()) .append("&"); } //删掉最后一个&符号 if (stringBuilder.indexOf("&") != -1){ stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&")); } //得到含有公共参数的新路径.....使用新路径去请求 String newUrl = stringBuilder.toString(); //新的路径构建一个新的请求 request = request.newBuilder().url(newUrl).build(); }else if ("POST".equals(method)){ Log.e("--oldUrl--",oldUrl); //参数在请求的实体内容上....拿到以前的参数,把以前的参数和公共参数全都添加到请求实体上 RequestBody requestBody = request.body(); if (requestBody instanceof FormBody){//前边是不是后边的子类/实例对象 FormBody oldBody = (FormBody) requestBody;//keywords...page FormBody.Builder builder = new FormBody.Builder(); //先添加之前的参数 for (int i = 0;i<oldBody.size();i++){ //键值对的形式添加 builder.add(oldBody.name(i),oldBody.value(i)); } //添加公共参数 for (Map.Entry<String,String> entry: map.entrySet()) { builder.add(entry.getKey(),entry.getValue()); } //构建一个新的请求 request = request.newBuilder().url(oldUrl).post(builder.build()).build(); } } //执行请求 获取到响应 Response response = chain.proceed(request); return response; } } }
CustomBanner
public class CustomBanner extends RelativeLayout { private ViewPager custom_banner_view_pager; private LinearLayout linear_doc; private List<String> list; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0) { int currentItem = custom_banner_view_pager.getCurrentItem(); //接收到之后 显示下一张 custom_banner_view_pager.setCurrentItem(currentItem +1 ); //再次发送 handler.sendEmptyMessageDelayed(0,time *1000); } } }; private int time = 2;//初始化自动轮播的时间 private List<ImageView> imageViews; private OnBannerListner onBannerListner; //使用new在代码中创建的时候调用 public CustomBanner(Context context) { super(context); init(); } //在xml文件中使用的时候 反射调用该构造方法 public CustomBanner(Context context, AttributeSet attrs) { super(context, attrs); time = attrs.getAttributeIntValue("http://schemas.android.com/apk/res-auto", "time", 1); Log.i("-----","获取的时间值:"+time); init(); } 在xml文件中使用的时候 反射调用该构造方法 public CustomBanner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } /** * 初始化的方法 */ private void init() { //把拿到的视图挂载到当前自定义控件上 View view = View.inflate(getContext(),R.layout.custom_banner_layout,this); custom_banner_view_pager = view.findViewById(R.id.custom_banner_view_pager); linear_doc = view.findViewById(R.id.linear_doc); } /** * 设置图片的路径 * @param list */ public void setImageUrls(final List<String> list) { this.list = list; if (list == null) { return; } //设置适配器 CustomBannerAdapter customBannerAdapter = new CustomBannerAdapter(); custom_banner_view_pager.setAdapter(customBannerAdapter); //初始化小圆点 initDoc(); //无线自动轮播... //刚开始展示中间某个位置的图片 custom_banner_view_pager.setCurrentItem(list.size()*100000,false); //发送延时消息 handler.sendEmptyMessageDelayed(0,time *1000); //监听 custom_banner_view_pager.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<list.size();i++) { if (i == position %list.size() ) { imageViews.get(i).setImageResource(R.drawable.checked_shape); }else { imageViews.get(i).setImageResource(R.drawable.un_checked_shape); } } } @Override public void onPageScrollStateChanged(int state) { } }); } /** * 初始化小圆点 */ private void initDoc() { //先创建一个集合 去记录小圆点 imageViews = new ArrayList<>(); //清空 imageViews.clear(); linear_doc.removeAllViews(); //添加 for (int i = 0;i<list.size();i++) { ImageView imageDoc = new ImageView(getContext()); if (i == 0) { imageDoc.setImageResource(R.drawable.checked_shape); }else { imageDoc.setImageResource(R.drawable.un_checked_shape); } //添加到集合 imageViews.add(imageDoc); //添加到线性布局 LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(5,0,5,0); linear_doc.addView(imageDoc,layoutParams); } } public void setOnBannerListner(OnBannerListner onBannerListner) { this.onBannerListner = onBannerListner; } /** * 对外提供设置时间的方法 * @param time */ public void setTimeSeconds(int time) { this.time = time; } private class CustomBannerAdapter 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, final int position) { //创建imageView ImageView imageView = new ImageView(getContext()); imageView.setScaleType(ImageView.ScaleType.FIT_XY); //触摸事件的处理 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; } }); //点击事件 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { //postion...做%的操作 onBannerListner.onBannerClick(position % list.size()); } }); //加载图片显示 Glide.with(getContext()).load(list.get(position % list.size())).into(imageView); //添加到容器 container.addView(imageView); //返回imageView return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } public interface OnBannerListner{ void onBannerClick(int position); } }
CutomBean
public class CutomBean { private String msg; private String code; private TuijianBean tuijian; private MiaoshaBean miaosha; private List<DataBean> data; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public TuijianBean getTuijian() { return tuijian; } public void setTuijian(TuijianBean tuijian) { this.tuijian = tuijian; } public MiaoshaBean getMiaosha() { return miaosha; } public void setMiaosha(MiaoshaBean miaosha) { this.miaosha = miaosha; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class TuijianBean { private String name; private List<ListBean> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public List<ListBean> getList() { return list; } public void setList(List<ListBean> list) { this.list = list; } public static class ListBean { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class MiaoshaBean { private String name; private int time; private List<ListBeanX> list; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getTime() { return time; } public void setTime(int time) { this.time = time; } public List<ListBeanX> getList() { return list; } public void setList(List<ListBeanX> list) { this.list = list; } public static class ListBeanX { private double bargainPrice; private String createtime; private String detailUrl; private String images; private int itemtype; private int pid; private double price; private int pscid; private int salenum; private int sellerid; private String subhead; private String title; public double getBargainPrice() { return bargainPrice; } public void setBargainPrice(double bargainPrice) { this.bargainPrice = bargainPrice; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getDetailUrl() { return detailUrl; } public void setDetailUrl(String detailUrl) { this.detailUrl = detailUrl; } public String getImages() { return images; } public void setImages(String images) { this.images = images; } public int getItemtype() { return itemtype; } public void setItemtype(int itemtype) { this.itemtype = itemtype; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public int getPscid() { return pscid; } public void setPscid(int pscid) { this.pscid = pscid; } public int getSalenum() { return salenum; } public void setSalenum(int salenum) { this.salenum = salenum; } public int getSellerid() { return sellerid; } public void setSellerid(int sellerid) { this.sellerid = sellerid; } public String getSubhead() { return subhead; } public void setSubhead(String subhead) { this.subhead = subhead; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } } public static class DataBean { private int aid; private String createtime; private String icon; private Object productId; private String title; private int type; private String url; public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getIcon() { return icon; } public void setIcon(String icon) { this.icon = icon; } public Object getProductId() { return productId; } public void setProductId(Object productId) { this.productId = productId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getType() { return type; } public void setType(int type) { this.type = type; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }