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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程