自定义组合控件,无限轮播图效果
来源:互联网 发布:淘宝怎么看买家的等级 编辑:程序博客网 时间: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); }}
阅读全文
0 0
- 自定义组合控件,无限轮播图效果
- 自定义组合控件,实现无限轮播
- Android组合控件(无限轮播图)
- 自动无限轮播图,支持多种自定义效果
- 自定义组合控件:Banner、轮播图、广告栏控件
- 自定义控件-组合控件
- 自定义组合控件(密码锁的数字上下滚动效果)
- 动态生成Gallery控件组合实现无限循环自动播放广告图片效果总结
- 自定义组合控件,组合模式
- Android自定义组合控件实现动态轮播图
- Android自定义组合控件
- android自定义组合控件
- 自定义组合控件
- 1.11 自定义组合控件
- 自定义组合控件
- 自定义组合控件
- 自定义组合控件
- 自定义组合控件.txt
- Tesseract-OCR引擎 入门
- Android Studio Git 更新指定目录
- 洛谷 P1091 合唱队形 kevin_xcw
- webview的使用
- 30分钟掌握ES6/ES2015核心内容(上)
- 自定义组合控件,无限轮播图效果
- 递归调用的理解
- 职工信息管理系统
- 仿京东详情页跳转到购物车
- Eclipse中Maven Module和Maven Project的区别
- JS截取与分割字符串substring()和substr()和slice()和split()和John()
- 30分钟掌握ES6/ES2015核心内容(下)
- Mybatis总结
- 20个非常有用的Java程序片段