您的位置:首页 > 理论基础 > 计算机网络

网络获取图片实现无线自动轮播

2017-10-15 20:28 441 查看
public class MainActivity extends AppCompatActivity {
private ViewPager view_pager;
private LinearLayout linearlayout;
private List<ImageView> imglist;
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);
//获取小点的布局,,
4000
我这里用的是线性布局
linearlayout = (LinearLayout) findViewById(R.id.linearlayout);
//网络获取图片的方法
getDataFromNet();
}

private void getDataFromNet() {
//异步加载
new AsyncTask<Void,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<DataDataBean.DataBean> 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<DataDataBean.DataBean> data) {
//需要一个集合去记录小点的ImageView控件
imglist = new ArrayList<ImageView>();
//添加小点之前需要先清空
linearlayout.removeAllViews();
//fou循环添加小点
for (int i=0;i<data.size();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 {//继承PagerAdapterContext context;//上下文List<DataDataBean.DataBean> list;//集合Handler handler;//有参方法public MyAdapter(Context context, List<DataDataBean.DataBean> list, Handler handler) {this.context = context;this.list = list;this.handler=handler;}@Overridepublic int getCount() {//这里本是返回集合的大小..但是要实现无线轮播的效果,,需要改变集合的大小return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view==object;}//还需要重写另外两个方法,,,instantiateItem()这是显示视图的方法,,destroyItem()销毁视图的方法@Overridepublic 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() {@Overridepublic 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;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);//销毁视图}}
//需要在清单文件中注册
public class BaseApplcition extends Application{@Overridepublic 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"?><shape xmlns:android="http://schemas.android.com/apk/res/android"><!--颜色--><solid android:color="#00ff00"/>//角的弧度<corners android:radius="10dp"/>//大小<size android:width="10dp" android:height="10dp"/></shape>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: