最近项目需要用到图片轮播,考虑自身技术比较虚,就想在网上找个好轮子用用。果然发现有个大神做了个叫RollViewPager的好东西(https://github.com/Jude95/RollViewPager)。按照网上的文章,效果很容易做出来。但问题是网上的例子使用的都是本地图片,真实情况下用本地图片的可能性几乎没有。实在没找到加载图片的好代码可以参考,只好自己动手改一下。在AndroidStudio下引入rollviewpager非常简单:
compile 'com.jude:rollviewpager:1.4.5'
需要加上网络权限:<uses-permission android:name="android.permission.INTERNET" />
后面的布局也非常简单:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.qunxi.rollviewpager.MainActivity">
<com.jude.rollviewpager.RollPagerView
android:id="@+id/id_rollviewpager"
android:layout_width="match_parent"
android:layout_height="180dp"
app:rollviewpager_play_delay="3000"/>
</RelativeLayout>
MainActivity中的代码如下:
package com.qunxi.rollviewpager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.LruCache; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.Toast; import com.jude.rollviewpager.OnItemClickListener; import com.jude.rollviewpager.RollPagerView; import com.jude.rollviewpager.adapter.StaticPagerAdapter; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; public class MainActivity extends AppCompatActivity { private RollPagerView rollPagerView; private LruCache<String,Bitmap> mLruCaches; //使用LruCahe缓存,可以节省流量,速度也快 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rollPagerView= (RollPagerView) findViewById(R.id.id_rollviewpager); rollPagerView.setAdapter(new TestNomalAdapter()); //这里是rollviewpager的点击事件 rollPagerView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(int position) { Toast.makeText(MainActivity.this, "Item " + position + " clicked", Toast.LENGTH_SHORT).show(); } }); //设置缓存 int maxMemory= (int) Runtime.getRuntime().maxMemory(); int cacheSize=maxMemory/4; mLruCaches=new LruCache<String,Bitmap>(cacheSize){ @Override protected int sizeOf(String key, Bitmap value) { return value.getByteCount(); } }; } private class TestNomalAdapter extends StaticPagerAdapter { //网络图片的地址 private String[] urls={ "http://bmob-cdn-6942.b0.upaiyun.com/2016/12/16/1cedd69a7a5a4de08ecf9d26e4719a38.jpg", "http://bmob-cdn-6942.b0.upaiyun.com/2016/12/16/e8e26ab2404c7b6680ceca7434b5e2b0.png", "http://bmob-cdn-6942.b0.upaiyun.com/2016/12/14/a77d22cbb4464be495515fef22ee8709.jpg", "http://bmob-cdn-6942.b0.upaiyun.com/2016/12/09/5d6379454023d77180a2eb8bc580d730.jpg", "http://bmob-cdn-6942.b0.upaiyun.com/2016/12/09/937ee579409121108061d47e78399349.jpg" }; @Override public View getView(ViewGroup container, int position) { ImageView view = new ImageView(container.getContext()); view.setImageResource(R.drawable.loading); //先加载一个默认的图片,当网络不给力时,有个过度效果 Bitmap bitmap=getBitmapFromCache(urls[position]); //先从缓存中读取图片 if(bitmap!=null){ view.setImageBitmap(bitmap); //如果缓存中有图片,就直接放上去行了 }else { //缓存中没有,只要去异步下载了 AddbBitmapToView addbBitmapToView=new AddbBitmapToView(view); addbBitmapToView.execute(urls[position]); } view.setScaleType(ImageView.ScaleType.CENTER_CROP); view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return view; } @Override public int getCount() { return urls.length; } } //这里使用Asyn异步的方式加载网络图片 class AddbBitmapToView extends AsyncTask<String,Void,Bitmap>{ private ImageView imageView; public AddbBitmapToView(ImageView imageView){ this.imageView=imageView; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if(bitmap!=null){ imageView.setImageBitmap(bitmap); } } @Override protected Bitmap doInBackground(String... params) { Bitmap bitmap=getPicture(params[0]); if(bitmap!=null){ addBitmapToCache(params[0],bitmap); } return bitmap; } } //将图片增加到缓存中 private void addBitmapToCache(String url,Bitmap bitmap){ if(getBitmapFromCache(url)==null){ //如果没有缓存,则增加到缓存中 mLruCaches.put(url,bitmap); } } //从缓存中获取图片 private Bitmap getBitmapFromCache(String url){ return mLruCaches.get(url); } //网络地址获取图片 private Bitmap getPicture(String path){ Bitmap bm=null; InputStream is; try{ URL url=new URL(path); URLConnection connection=url.openConnection(); connection.connect(); is=connection.getInputStream(); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一 bm= BitmapFactory.decodeStream(is,null,options); is.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return bm; } }
代码看上去有点多,主要是有个异步任务和图片下载。下面是效果图,由于我的网络相当给力,默认图片压根没看见:
![]()