banner自定义

来源:互联网 发布:客户端软件下载 编辑:程序博客网 时间:2024/06/05 10:06
public class CustomBanner 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 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, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init();    }    /**     * 对外提供设置时间     */    public void setTimeSeconds(int time){        this.time = time;    }    /**     * 初始化的方法,,,加载布局     */    private void init() {        //初始化imageLoader        ImageLoaderUtil.init(getContext());        View view = View.inflate(getContext(), R.layout.custom_banner_layout, this);        //找到控件        viewPager = view.findViewById(R.id.view_pager);        linearLayout = view.findViewById(R.id.linear_layout);    }    /**     * 对外提供设置数据的方法     */    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控件上            ImageLoader.getInstance().displayImage(list.get(position %list.size()),imageView, ImageLoaderUtil.getDefaultOption());            //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);        }    }    private static class ImageLoaderUtil {        /**         * 初始化         *         * @param context         */        public static void init(Context context) {            File cacheDir = StorageUtils.getCacheDirectory(context);  //缓存文件夹路径            ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)                    .threadPoolSize(3) // default  线程池内加载的数量                    .threadPriority(Thread.NORM_PRIORITY - 2) // default 设置当前线程的优先级                    .tasksProcessingOrder(QueueProcessingType.FIFO) // default                    .denyCacheImageMultipleSizesInMemory()                    .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通过自己的内存缓存实现                    .memoryCacheSize(2 * 1024 * 1024)  // 内存缓存的最大值                    .memoryCacheSizePercentage(13) // default                    .diskCache(new UnlimitedDiskCache(cacheDir)) // default 可以自定义缓存路径                    .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd(本地)缓存的最大值                    .diskCacheFileCount(100)  // 可以缓存的文件数量                    // default为使用HASHCODEUIL进行加密命名, 还可以用MD5(new Md5FileNameGenerator())加密                    .diskCacheFileNameGenerator(new HashCodeFileNameGenerator())                    .imageDownloader(new BaseImageDownloader(context)) // default                    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default                    .writeDebugLogs() // 打印debug log                    .build(); //开始构建            //关键初始化的代码            ImageLoader.getInstance().init(config);        }        public static DisplayImageOptions getDefaultOption() {            DisplayImageOptions options = new DisplayImageOptions.Builder()                    .showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片                    .showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片                    .showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片                    .resetViewBeforeLoading(true)  // default 设置图片在加载前是否重置、复位                    .cacheInMemory(true) // default  设置下载的图片是否缓存在内存中                    .cacheOnDisk(true) // default  设置下载的图片是否缓存在SD卡中                    .considerExifParams(true) // default                    .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示                    .bitmapConfig(Bitmap.Config.ARGB_8888) // default 设置图片的解码类型                    .displayer(new SimpleBitmapDisplayer()) // default  还可以设置圆角图片new RoundedBitmapDisplayer(20)                    .build();            return options;        }    }    public void setOnBannerClickListner(OnBannerClickListner bannerClickListner){        this.bannerClickListner = bannerClickListner;    }    /**     * 点击的接口     */    public interface OnBannerClickListner {        public void onBannerClick(int position);    }}
//activity中的方法
private int time = 100;private CustomBanner customBanner;private List<String> list;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    customBanner = (CustomBanner) findViewById(R.id.custom_bannner);    customBanner.setTimeSeconds(3);  getDataFromNet();}private void getDataFromNet() {    //http://120.27.23.105/ad/getAd    //1.创建一个okhttp客户端对象   OkHttpClient httpClient=new OkHttpClient();    //2.通过请求的构建器来创建一个请求对象,并指定请求的url地址    Request request = new Request.Builder()            .url("http://120.27.23.105/ad/getAd")            .build();    okhttp3.Call call = httpClient.newCall(request);    call.enqueue(new Callback() {       @Override       public void onFailure(okhttp3.Call call, IOException e) {           e.printStackTrace();       }       @Override       public void onResponse(okhttp3.Call call, Response response) throws IOException {           if (response.isSuccessful()){               final String string = response.body().string();               runOnUiThread(new Runnable() {                   @Override                   public void run() {                       Log.i("---+++",string);                       BannerBean bannerBean = new Gson().fromJson(string, BannerBean.class);                       final List<BannerBean.DataBean> data = bannerBean.getData();                       list = new ArrayList<>();                       for (int i = 0;i<data.size();i++){                           list.add(data.get(i).getIcon());                       }                       customBanner.setImageUrl(list);                       //设置点击事件                       customBanner.setOnBannerClickListner(new CustomBanner.OnBannerClickListner() {                           @Override                           public void onBannerClick(int position) {                               //Toast.makeText(MainActivity.this,"点击了",Toast.LENGTH_SHORT).show();                               //判断                               BannerBean.DataBean dataBean = data.get(position);                               if (dataBean.getType() == 0){//跳转到详情                                   Intent intent = new Intent(MainActivity.this,SecondActivity.class);                                   intent.putExtra("url",dataBean.getUrl());                                   startActivity(intent);                               }else if (dataBean.getType() == 1){                                   Toast.makeText(MainActivity.this,"我要跳转到商品详情页",Toast.LENGTH_SHORT).show();                               }                           }                       });                   }               });       }    }});}
//组合控件
<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:id="@+id/view_pager"        android:layout_width="match_parent"        android:layout_height="200dp">    </android.support.v4.view.ViewPager>    <LinearLayout        android:id="@+id/linear_layout"        android:orientation="horizontal"        android:layout_centerHorizontal="true"        android:layout_alignBottom="@+id/view_pager"        android:layout_marginBottom="10dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content">    </LinearLayout></RelativeLayout>
//shape-01
<shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="#00ff00"/>    <corners android:radius="10dp"/>    <size android:height="10dp" android:width="10dp"/></shape>
//shape2
<shape xmlns:android="http://schemas.android.com/apk/res/android">    <solid android:color="#ff0000"/>    <corners android:radius="10dp"/>    <size android:height="10dp" android:width="10dp"/></shape>
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胳膊起疙瘩很痒怎么办 后背长很多痘痘怎么办 肩膀两边长痘痘怎么办 红酒喝了过敏了怎么办 脚底长湿疹很痒怎么办 怀孕脚痒怎么办小窍门 孕妇烂脚丫和痒怎么办 腿上都是红血丝怎么办 全身皮肤干痒怎么办啊 脸过敏干痒脱皮怎么办 脸过敏了特别干怎么办 太阳晒后皮肤红怎么办 皮肤晒过后很痒怎么办 脸突然又红又痒怎么办 膝盖又红又痒怎么办 脸又红又痒怎么办 皮肤红痒有点热怎么办 浑身起红疙瘩 痒怎么办 身上长红包很痒怎么办 喝酒后身上很痒怎么办 身上长了小红包怎么办 腿长红包很痒怎么办 14岁脸上有雀斑怎么办 皮肤痒起红点或红块怎么办 脸过敏像长痱子怎么办 脸上有淡淡白块怎么办 过敏了脸上会起小疙瘩怎么办 脸过敏出红疙瘩怎么办 脸上长红色的小疙瘩怎么办 脸上都是小米粒痘痘怎么办 小孩身上起风团疙瘩怎么办 脸上长疙瘩很痒怎么办 一个多月宝宝脸上有湿疹怎么办 脸上发红发痒起疙瘩怎么办 脸过敏了怎么办最简单 胸下垂应该怎么办19岁 身上的肉特别松怎么办 才30岁脸部松弛怎么办 脸上的皮肤很松怎么办 面部皮肤干燥起皮刺痛怎么办 脸上的皮肤很粗糙怎么办