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

相关文章

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

在Spring Boot中集成RabbitMQ的实战记录

《在SpringBoot中集成RabbitMQ的实战记录》本文介绍SpringBoot集成RabbitMQ的步骤,涵盖配置连接、消息发送与接收,并对比两种定义Exchange与队列的方式:手动声明(... 目录前言准备工作1. 安装 RabbitMQ2. 消息发送者(Producer)配置1. 创建 Spr

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅