自定义组合控件,无限轮播图效果

来源:互联网 发布:淘宝怎么看买家的等级 编辑:程序博客网 时间:2024/06/06 07:19
CustomBanner


package bwie.com.zhouyimoni;import android.content.Context;import android.graphics.Bitmap;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.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;import com.nostra13.universalimageloader.cache.disc.naming.HashCodeFileNameGenerator;import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;import com.nostra13.universalimageloader.core.DisplayImageOptions;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.ImageScaleType;import com.nostra13.universalimageloader.core.assist.QueueProcessingType;import com.nostra13.universalimageloader.core.display.SimpleBitmapDisplayer;import com.nostra13.universalimageloader.core.download.BaseImageDownloader;import com.nostra13.universalimageloader.utils.StorageUtils;import java.io.File;import java.util.ArrayList;import java.util.List;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为使用HASHCODE对UIL进行加密命名, 还可以用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);    }}_——————————————————————————————————————————————————————
MainActivity

package bwie.com.zhouyimoni;import android.Manifest;import android.annotation.TargetApi;import android.content.Intent;import android.content.pm.PackageManager;import android.os.Bundle;import android.support.v4.app.ActivityCompat;import android.support.v4.content.ContextCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.Toast;import com.google.gson.Gson;import java.io.IOException;import java.util.ArrayList;import java.util.List;import okhttp3.Call;import okhttp3.Callback;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.Response;public class MainActivity extends AppCompatActivity {    private int time = 100;    private CustomBanner customBanner;    private List<String> list;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        customBanner = (CustomBanner) findViewById(R.id.custom_bannner);        customBanner.setTimeSeconds(3);    }    private void getDataFromNet() {        //http://120.27.23.105/ad/getAd        //1.创建一个okhttp客户端对象        OkHttpClient okHttpClient = new OkHttpClient();        //2.通过请求的构建器来创建一个请求对象,并指定请求的url地址        Request request = new Request.Builder()                .url("http://120.27.23.105/ad/getAd")                .build();        //3.客户端调用请求        Call call = okHttpClient.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                e.printStackTrace();            }            @Override            public void onResponse(Call call, final 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();                                    }                                }                            });                        }                    });                }            }        });    }    /**     * C.请求权限的结果....可以获取到用户是否允许了权限     */    @TargetApi(23)    @Override    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {        super.onRequestPermissionsResult(requestCode, permissions, grantResults);        if (requestCode == 1001) {            //grantResults用户允许权限的返回值....数组里面放的是用户是否允许权限            //PackageManager.PERMISSION_GRANTED允许权限            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {                getDataFromNet();            } else {                Toast.makeText(MainActivity.this, "拒绝", Toast.LENGTH_SHORT).show();            }        }    }    public void getData(View view) {        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {            //B.不允许...的时候,,,请求用户允许这个权限            // Activity arg0代表当前的activity, @NonNull String[] arg1请求的权限的数组,也就是需要请求允许哪些权限, int arg2请求码            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);        } else {            getDataFromNet();        }    }}
——————————————————————————————————————————————————
SecondActivity

package bwie.com.zhouyimoni;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.webkit.WebSettings;import android.webkit.WebView;import android.webkit.WebViewClient;public class SecondActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        String url = getIntent().getStringExtra("url");        WebView webView = (WebView) findViewById(R.id.web_view);        webView.loadUrl(url);        webView.setWebViewClient(new WebViewClient());        WebSettings settings = webView.getSettings();        settings.setJavaScriptCanOpenWindowsAutomatically(true);        settings.setJavaScriptEnabled(true);    }}

原创粉丝点击