网络获取图片实现无线自动轮播
16lz
2021-01-26
public class MainActivity extends AppCompatActivity { private ViewPager view_pager; private LinearLayout linearlayout; private Listimglist; private Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==1){//判断消息的标志 //获取ViewPager当前显示到哪个位置 int item = view_pager.getCurrentItem(); //然后+1 item++; //重新设置一个 view_pager.setCurrentItem(item); //再次发送,,形成一个死循环,,,到这里图片的无线轮播已经完成,,下面是一些美化 handler.sendEmptyMessageDelayed(1,2000); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取id view_pager = (ViewPager) findViewById(R.id.View_Pager); //获取小点的布局,,我这里用的是线性布局 linearlayout = (LinearLayout) findViewById(R.id.linearlayout); //网络获取图片的方法 getDataFromNet(); } private void getDataFromNet() { //异步加载 new AsyncTask ,Void,String>(){ @Override protected String doInBackground(Void... params) { //路径 String path="http://www.yulin520.com/a2a/impressApi/news/mergeList?pageSize=10&page=1"; try { URL url = new URL(path); HttpURLConnection connection= (HttpURLConnection) url.openConnection(); //设置访问的类型 connection.setRequestMethod("GET"); //读取超时的时间 connection.setReadTimeout(5000); //加载超时的时间 connection.setConnectTimeout(5000); //获取到数据时返回一个状态码,,200为成功 int code = connection.getResponseCode(); if (code == 200){ //获取到的数据将以流的形式 InputStream inputStream = connection.getInputStream(); //写一个方法将字节流转为字符流 String json=streamToString(inputStream,"utf-8"); //将转换成功后的数据反出去 return json; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(String s) {//这个s就是上个方法所反出来的数据 //Gson解析....这里需要导json包..右击当前工程..选择open Moudle settings 》》》Dependencies>> + 号》》》Library Dendency>>找到Gson。。然后 ok 。。 ok Gson gson = new Gson(); //得到一个对象 DataDataBean bean = gson.fromJson(s, DataDataBean.class); //获取到集合 final List data = bean.getData(); //获取到适配器 MyAdapter adapter=new MyAdapter(MainActivity.this,data,handler); //设置适配器 view_pager.setAdapter(adapter); //根据集合的长度,,动态添加小点 initDoc(data); //设置视图刚开始显示视图是从集合的哪个下标开始,,这样才能实现无线轮播,,如果不设置,,只能右无线滑动 view_pager.setCurrentItem(data.size()*10000); //使用handle实现无线自动无线轮播 handler.sendEmptyMessageDelayed(1,2000);//参数一,是一个handle识别消息的标志,,参数二是换下一个图片之间的时间 //viewPager设置监听 view_pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //遍历装ImageView的集合 for (int i=0;i<imglist.size();i++){ if (i==position%data.size()){ imglist.get(i).setImageResource(R.drawable.shape_01); }else{ imglist.get(i).setImageResource(R.drawable.shape_02); } } } @Override public void onPageScrollStateChanged(int state) { } }); } }.execute(); } private void initDoc(List data) { //需要一个集合去记录小点的ImageView控件 imglist = new ArrayList (); //添加小点之前需要先清空 linearlayout.removeAllViews(); //fou循环添加小点 for (int i=0;i ;i++){ //获取控件 ImageView view=new ImageView(MainActivity.this); //用shape写两个颜色不一样的点,,设置开始显示第一张图片,点的颜色 if (i==0){ view.setImageResource(R.drawable.shape_01); }else{ view.setImageResource(R.drawable.shape_02); } imglist.add(view); LinearLayout.LayoutParams params=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); params.setMargins(5,0,5,0);//四个参数:距离左边的距离,,距离上边的距离,,距离右边的距离,,距离下边的距离 linearlayout.addView(view,params); } } //将字节流转为字符流的方法 private String streamToString(InputStream inputStream,String charset) { try { InputStreamReader inputStreamReader = new InputStreamReader(inputStream,charset); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String s = null; StringBuilder builder = new StringBuilder(); while ((s = bufferedReader.readLine()) != null){ builder.append(s); } bufferedReader.close(); return builder.toString(); } catch (Exception e) { e.printStackTrace(); } return null; }}
//适配器
public class MyAdapter extends PagerAdapter {//继承PagerAdapter Context context;//上下文 Listlist;//集合 Handler handler; //有参方法 public MyAdapter(Context context, List list, Handler handler) { this.context = context; this.list = list; this.handler=handler; } @Override public int getCount() {//这里本是返回集合的大小..但是要实现无线轮播的效果,,需要改变集合的大小 return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } //还需要重写另外两个方法,,,instantiateItem()这是显示视图的方法,,destroyItem()销毁视图的方法 @Override public Object instantiateItem(ViewGroup container, int position) { ImageView imageView=new ImageView(context); //设置图片的平铺,,,占满控件的x,,y,轴 imageView.setScaleType(ImageView.ScaleType.FIT_XY); //imageLoader加载图片到这个imageView控件上 ImageLoader.getInstance().displayImage(list.get(position%list.size()).getImg(),imageView,ImageLoaderUtlis.imageOptions()); //给图片设置监听,,,因为图片在自动轮播的时候,,如果不设置这些,,图片不会停止自动轮播 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //获取手指的动作 int action = event.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(1,2000); break; case MotionEvent.ACTION_UP://抬起的动作 handler.sendEmptyMessageDelayed(1,2000); break; } //true表示自己处理触摸事件 return true; } }); container.addView(imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object);//销毁视图 }}
//需要在清单文件中注册
public class BaseApplcition extends Application{ @Override public void onCreate() { super.onCreate(); ImageLoaderUtlis.inint(this); }}//处理图片的一些代码
public class ImageLoaderUtlis { public static void inint(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 imageOptions(){ DisplayImageOptions options = new DisplayImageOptions.Builder() .showImageOnLoading(R.mipmap.ic_launcher) // 设置图片下载期间显示的图片 .showImageForEmptyUri(R.mipmap.ic_launcher) // 设置图片Uri为空或是错误的时候显示的图片 .showImageOnFail(R.mipmap.ic_launcher) // 设置图片加载或解码过程中发生错误显示的图片 .resetViewBeforeLoading(true) // default 设置图片在加载前是否重置、复位 .delayBeforeLoading(1000) // 下载前的延迟时间 .cacheInMemory(true) // default 设置下载的图片是否缓存在内存中 .cacheOnDisk(true) // default 设置下载的图片是否缓存在SD卡中 .considerExifParams(true) // default .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default 设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565) // default 设置图片的解码类型 .displayer(new SimpleBitmapDisplayer()) // default 还可以设置圆角图片new RoundedBitmapDisplayer(20) .build(); return options; }}
//小圆点
<?xml version="1.0" encoding="utf-8"?>xmlns:android="http://schemas.android.com/apk/res/android"> android:color="#00ff00"/> //角的弧度 android:radius="10dp"/> //大小 android:width="10dp" android:height="10dp"/>
更多相关文章
- Android的图片缩放、拖动
- android 获取缓存文件的地址
- android 批量上传图片
- Error:java.util.concurrent.ExecutionException:com.android.id
- gridView ---图片显示类九宫格
- Android(安卓)WebView缓存机制详解
- EditText中inputType="number"还可输入字母的设置
- Android设置屏幕方向
- Android(安卓)CV系列 > 可拖拽布局 拉长 CoordinatorLayout +Bot