android图片轮播第一弹_异步获取和本地获取图片_轻量级可集成到项目中型

本文主要是介绍android图片轮播第一弹_异步获取和本地获取图片_轻量级可集成到项目中型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前因为项目需要,要做一个类似于金融app上的图片轮播,后来我才发现原来 时候时候发现很多要么是太复杂,要么是有一些bug,还有一些非要用到Universal_Image_loader或者一些第三方的lib包,我就很不理解,我就是想单独使用这个功能,干嘛非要引一些乱七八糟的包呢,难道就没有一个类似于官方控件的东西使用。总而言之,言而总之,就是没有那种拿来就可以用的东西。

经过几天的探索,也借鉴很多大神们的杰作,终于在一个月黑风高的下午,我完成了android图片轮播的第一步,将图片轮播的第一个版本做了出来,里面借鉴了一些github上的项目,例如https://github.com/loopj/android-smart-image-view(smartImageView_图片缓存),https://github.com/daikainan/imagecycleview(imagecycleview _图片轮播),这些都是精髓啊,童鞋们。

好了,童鞋们,言归正传,我们开始来看看我辛苦的结果
首先,先看效果
网络获取图片
这里写图片描述

在这里实时项目的代码和资源文件,只要把这些拷到你的项目中,你的项目就已经完成来了两个功能,一个是引导界面,一个是图片轮播,是不是很开心
这里写图片描述 这里写图片描述

好了好了,为我们先看看怎么用吧,这样你就算不看下面的源码分析也一样可以使用我们的项目。


####carousel_view.xml: ####

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/ad_rl"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.ViewPagerandroid:id="@+id/adv_pager"android:layout_width="match_parent"android:layout_height="match_parent" ></android.support.v4.view.ViewPager><LinearLayoutandroid:id="@+id/viewGroup"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_marginBottom="8dp"android:gravity="center"android:orientation="horizontal" ></LinearLayout>
</RelativeLayout>

####UrlActivity:##

package com.dds.carousel;import java.util.ArrayList;import com.dds.carousel.carousel.CarouselView;
import com.dds.carousel.carousel.CarouselView.ImageCycleViewListener;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;/** 测试图片轮播效果 设置url*/
public class UrlActivity extends Activity {private CarouselView mAdView;private ArrayList<String> mImageUrl = null;// 此处的url一部获取到private String imageUrl1 = "http://pic31.nipic.com/20130702/2926417_003653575119_2.jpg";private String imageUrl2 = "http://pic.58pic.com/58pic/11/22/39/458PICK58PICgAk.jpg";private String imageUrl3 = "http://pic2.ooopic.com/12/52/76/42bOOOPIC81_1024.jpg";public int stype = 0;// 这个是底部指示器,1为长条形,0为圆形@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mImageUrl = new ArrayList<String>();mImageUrl.add(imageUrl1);mImageUrl.add(imageUrl2);mImageUrl.add(imageUrl3);mAdView = (CarouselView) findViewById(R.id.ad_view);mAdView.setImageUrlResources(mImageUrl, mAdCycleViewListener, stype);}private ImageCycleViewListener mAdCycleViewListener = new ImageCycleViewListener() {@Overridepublic void onImageClick(int position, View imageView) {Toast.makeText(UrlActivity.this, mImageUrl.get(position) + position, Toast.LENGTH_SHORT).show();}};
}

是不是很简单,只需要你将url的列表设置上去就可以了,这个url可是你异步从晚上获取的哦,并且还可以设置点击的监听,再也不用担心图片轮播花费你的时间了,啊哈哈哈哈哈
,另外代码里面也写了获取本地资源文件的demo,从此以后你就可以省去做这一步的麻烦了 。

最后我们进行源码分析吧,

  • 轮播分析
    CarouselView.java:主要在这个文件中,点击它就可看到源码,
    这里主要是用到了ViewPager,将滑动的数量设置为 Integer.MAX_VALUE,之前看到了别人写的代码是将最后一张放到第一张的前面,将第一张放到最后一张的后面,形成 C - A- B -C - A这样的顺序也可实现想要的效果,并且解决滑动中的小bug,但我总觉得那样不太好弄,而我这个的扩展性是很好的,我会慢慢往里面增加内容,大家共同学习

  • 图片缓存
    SmartImageView:
    这是github上的一个项目,我单独提取一部分内容,后来我发现这个写的和我在培训机构里学到的原理居然是相同的,以前我在课堂上也写过一个类似的,我这里就不贴源码了,点击前面蓝色内容就可以跳转到项目界面,我还会将以前的代码放到github上和大家一起学习

本项目扩展性很好,大家可以一起交流学习,那么就到这了

源码下载

https://github.com/ddssingsong/CarouselView.git
这个是Eclipse版本的内容,如果想换到android studio 请看下面的内容


@添加

2016年10月10日

之前对这个讲解的不是很透彻,搞的我自己都不是太明白,下面根 据https://github.com/ddssingsong/CirculateView_smartview,来具体讲解用法

基础控件:viewpager 重写LinearLayout

几个关键点

  1. 自动轮播

使用Handler中的postDelayed(Runnable r, long delayMillis)方法制作一个自动发送器,每隔3秒发送一个指令进行图片轮播,
代码如下

   private Handler mHandler = new Handler();/*** 图片自动轮播Task*/private Runnable mImageTimerTask = new Runnable() {@Overridepublic void run() {mAdvPager.setCurrentItem(mAdvPager.getCurrentItem() + 1);// 就一直在后台循环mHandler.postDelayed(mImageTimerTask, 3000);}};

然后在轮播开启的时候注册这个自动发送器, 在轮播停止的时候移除这个轮播,并设置一个标志位表明轮播已经停止

 mHandler.postDelayed(mImageTimerTask, 3000);//注册mHandler.removeCallbacks(mImageTimerTask);//移除

2.无限轮播

 这里的无限轮播是设置一个比较大的值`Integer.MAX_VALUE`作为ViewPager的中的Item个数,当滑动到最后一个item时,继续向里面添加数据,通过`position % mAdList.size() (位置%需要展示的图片个数=当前显示的图片的position)` 计算出需要装载的图片进行装填

代码如下

 private class ImageCycleAdapter extends PagerAdapter {/*** 图片视图缓存列表*/private ArrayList<SmartImageView> mImageViewCacheList;/*** 图片资源列表*/private ArrayList<String> mAdList = new ArrayList<String>();private ArrayList<String> mATitle = new ArrayList<String>();/*** 广告图片点击监听*/private ImageCycleViewListener mImageCycleViewListener;private Context mContext;public ImageCycleAdapter(Context context, ArrayList<String> adList, ArrayList<String> title,ImageCycleViewListener imageCycleViewListener) {this.mContext = context;this.mAdList = adList;this.mATitle = title;mImageCycleViewListener = imageCycleViewListener;mImageViewCacheList = new ArrayList<SmartImageView>();}@Overridepublic int getCount() {return Integer.MAX_VALUE;//设置一个很大的值}@Overridepublic boolean isViewFromObject(View view, Object obj) {return view == obj;}@Overridepublic Object instantiateItem(ViewGroup container, final int position) {String imageUrl = mAdList.get(position % mAdList.size());//算出需要装填的图片String title = mATitle.get(position % mATitle.size());//算出需要装填的标题,viewGroup2.setText(title);SmartImageView imageView = null;if (mImageViewCacheList.isEmpty()) {imageView = new SmartImageView(mContext);imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));imageView.setScaleType(ScaleType.CENTER_CROP);} else {imageView = mImageViewCacheList.remove(0);}// 设置图片点击监听imageView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mImageCycleViewListener.onImageClick(position % mAdList.size(), v);}});imageView.setTag(imageUrl);container.addView(imageView);imageView.setImageUrl(imageUrl, null);//设置图片return imageView;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {SmartImageView view = (SmartImageView) object;mAdvPager.removeView(view);mImageViewCacheList.add(view);}}

3.触摸时停止自动滑动,松开时重新开始

这个使用到了事件的分发,用到了`dispatchTouchEvent(MotionEvent event)`方法,来对触摸事件进行监听
代码如下
  @Overridepublic boolean dispatchTouchEvent(MotionEvent event) {//当手指离开屏幕的时候开始滑动事件,其他事件停止滑动if (event.getAction() == MotionEvent.ACTION_UP) {startImageTimerTask();} else {stopImageTimerTask();}return super.dispatchTouchEvent(event);}

4.图片的缓存

这里使用一个libary是SmartView,一个轻量级的图片缓存框架,这里只使用了它最简单的方法,

SmartImageView imageView = new SmartImageView(mContext);
imageView .setImageUrl(imageUrl, null)

这个框架可以进行三级缓存,也可以添加Loading中和Loadng失败的图片,具体请看上面的介绍。。。

5.设置轮播图片的点击监听,一个接口搞定,这里不再赘述

  public interface ImageCycleViewListener {void onImageClick(int position, View imageView);}

6.指示器的添加

本demo中有两种指示器,以后再改,现在没时间了

**源码:**https://github.com/ddssingsong/CirculateView_smartview,持续更新中

这篇关于android图片轮播第一弹_异步获取和本地获取图片_轻量级可集成到项目中型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014522

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

SpringBoot项目中Maven剔除无用Jar引用的最佳实践

《SpringBoot项目中Maven剔除无用Jar引用的最佳实践》在SpringBoot项目开发中,Maven是最常用的构建工具之一,通过Maven,我们可以轻松地管理项目所需的依赖,而,... 目录1、引言2、Maven 依赖管理的基础概念2.1 什么是 Maven 依赖2.2 Maven 的依赖传递机

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

C#实现获取电脑中的端口号和硬件信息

《C#实现获取电脑中的端口号和硬件信息》这篇文章主要为大家详细介绍了C#实现获取电脑中的端口号和硬件信息的相关方法,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 我们经常在使用一个串口软件的时候,发现软件中的端口号并不是普通的COM1,而是带有硬件信息的。那么如果我们使用C#编写软件时候,如

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴