package com.example.myzidingyilunbotu.view;
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.example.myzidingyilunbotu.R;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
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;
/**
* Created by Dash on 2017/12/2.
*/
public class CustomBanner extends FrameLayout {
private ViewPager viewPager;
private LinearLayout linearLayout;
private List 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 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 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 list) {
//1.需要一个集合记录一下小圆点的imageView控件
images = new ArrayList();
//2...linearLayout上面的视图清空一下再去添加
linearLayout.removeAllViews();
for (int i=0;inew 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 list;
public MyAdapter(Context context, List 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 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 UnlimitedDiscCache(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);
}
}