精华内容
下载资源
问答
  • 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,...现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53759439

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新。

    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。每一个都非常稳定,功能也都十分强大。但是它们的使用场景基本都是重合的,也就是说我们基本只需要选择其中一个来进行学习和使用就足够了,每一个框架都尝试去掌握的话则有些浪费时间。

    在这几个框架当中,我对Volley和Glide研究得比较深入,对UniversalImageLoader、Picasso和Fresco都只是有一些基本的了解。从易用性上来讲,Glide和Picasso应该都是完胜其他框架的,这两个框架都实在是太简单好用了,大多数情况下加载图片都是一行代码就能解决的,而UniversalImageLoader和Fresco则在这方面略逊一些。

    那么再拿Glide和Picasso对比呢,首先这两个框架的用法非常相似,但其实它们各有特色。Picasso比Glide更加简洁和轻量,Glide比Picasso功能更为丰富。之前已经有人对这两个框架进行过全方面的对比,大家如果想了解更多的话可以去参考一下 这篇文章

    总之,没有最好的框架,只有最适合自己的框架。经过多方面对比之后,我还是决定选择了Glide来进行研究,并且这也是Google官方推荐的图片加载框架。

    说实话,关于Glide的文章我已经筹备了好久,去年这个时候本来就打算要写了,但是一直都没有动笔。因为去年我的大部分时间都放在了写《第二行代码》上面,只能用碎片时间来写写博客,但是Glide的难度远超出了我用碎片时间所能掌握的难度。当然,这里我说的是对它的源码进行解析的难度,不是使用上的难度,Glide的用法是很简单的。所以,我觉得去年我写不好Glide这个题材的文章,也就一直拖到了今年。

    而现在,我花费了大量的精力去研究Glide的源码和各种用法,相信现在已经可以将它非常好地掌握了,因此我准备将我掌握的这些知识整理成一个新的系列,帮忙大家更好地学习Glide。这个Glide系列大概会有8篇左右文章,预计花半年时间写完,将会包括Glide的基本用法、源码解析、高级用法、功能扩展等内容,可能会是目前互联网上最详尽的Glide教程。

    那么本篇文章是这个系列的第一篇文章,我们先来了解一下Glide的基本用法吧。

    开始

    Glide是一款由Bump Technologies开发的图片加载框架,使得我们可以在Android平台上以极度简单的方式加载和展示图片。

    目前,Glide最新的稳定版本是3.7.0,虽然4.0已经推出RC版了,但是暂时问题还比较多。因此,我们这个系列的博客都会使用Glide 3.7.0版本来进行讲解,这个版本的Glide相当成熟和稳定。

    要想使用Glide,首先需要将这个库引入到我们的项目当中。新建一个GlideTest项目,然后在app/build.gradle文件当中添加如下依赖:

    dependencies {
        compile 'com.github.bumptech.glide:glide:3.7.0'
    }

    如果你还在使用Eclipse,可以点击 这里 下载Glide的jar包。

    另外,Glide中需要用到网络功能,因此你还得在AndroidManifest.xml中声明一下网络权限才行:

    <uses-permission android:name="android.permission.INTERNET" />

    就是这么简单,然后我们就可以自由地使用Glide中的任意功能了。

    加载图片

    现在我们就来尝试一下如何使用Glide来加载图片吧。比如这是必应上一张首页美图的地址:

    http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg

    然后我们想要在程序当中去加载这张图片。

    那么首先打开项目的布局文件,在布局当中加入一个Button和一个ImageView,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Load Image"
            android:onClick="loadImage"
            />
    
        <ImageView
            android:id="@+id/image_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>

    为了让用户点击Button的时候能够将刚才的图片显示在ImageView上,我们需要修改MainActivity中的代码,如下所示:

    public class MainActivity extends AppCompatActivity {
    
        ImageView imageView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            imageView = (ImageView) findViewById(R.id.image_view);
        }
    
        public void loadImage(View view) {
            String url = "http://cn.bing.com/az/hprichbg/rb/Dongdaemun_ZH-CN10736487148_1920x1080.jpg";
            Glide.with(this).load(url).into(imageView);
        }
    
    }

    没错,就是这么简单。现在我们来运行一下程序,效果如下图所示:

    可以看到,一张网络上的图片已经被成功下载,并且展示到ImageView上了。

    而我们到底做了什么?实际上核心的代码就只有这一行而已:

    Glide.with(this).load(url).into(imageView);

    千万不要小看这一行代码,实际上仅仅就这一行代码,你已经可以做非常非常多的事情了,包括加载网络上的图片、加载手机本地的图片、加载应用资源中的图片等等。

    下面我们就来详细解析一下这行代码。

    首先,调用Glide.with()方法用于创建一个加载图片的实例。with()方法可以接收Context、Activity或者Fragment类型的参数。也就是说我们选择的范围非常广,不管是在Activity还是Fragment中调用with()方法,都可以直接传this。那如果调用的地方既不在Activity中也不在Fragment中呢?也没关系,我们可以获取当前应用程序的ApplicationContext,传入到with()方法当中。注意with()方法中传入的实例会决定Glide加载图片的生命周期,如果传入的是Activity或者Fragment的实例,那么当这个Activity或Fragment被销毁的时候,图片加载也会停止。如果传入的是ApplicationContext,那么只有当应用程序被杀掉的时候,图片加载才会停止。

    接下来看一下load()方法,这个方法用于指定待加载的图片资源。Glide支持加载各种各样的图片资源,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等。因此load()方法也有很多个方法重载,除了我们刚才使用的加载一个字符串网址之外,你还可以这样使用load()方法:

    // 加载本地图片
    File file = new File(getExternalCacheDir() + "/image.jpg");
    Glide.with(this).load(file).into(imageView);
    
    // 加载应用资源
    int resource = R.drawable.image;
    Glide.with(this).load(resource).into(imageView);
    
    // 加载二进制流
    byte[] image = getImageBytes();
    Glide.with(this).load(image).into(imageView);
    
    // 加载Uri对象
    Uri imageUri = getImageUri();
    Glide.with(this).load(imageUri).into(imageView);

    最后看一下into()方法,这个方法就很简单了,我们希望让图片显示在哪个ImageView上,把这个ImageView的实例传进去就可以了。当然,into()方法不仅仅是只能接收ImageView类型的参数,还支持很多更丰富的用法,不过那个属于高级技巧,我们会在后面的文章当中学习。

    那么回顾一下Glide最基本的使用方式,其实就是关键的三步走:先with(),再load(),最后into()。熟记这三步,你就已经入门Glide了。

    占位图

    现在我们来学一些Glide的扩展内容。其实刚才所学的三步走就是Glide最核心的东西,而我们后面所要学习的所有东西都是在这个三步走的基础上不断进行扩展而已。

    观察刚才加载网络图片的效果,你会发现,点击了Load Image按钮之后,要稍微等一会图片才会显示出来。这其实很容易理解,因为从网络上下载图片本来就是需要时间的。那么我们有没有办法再优化一下用户体验呢?当然可以,Glide提供了各种各样非常丰富的API支持,其中就包括了占位图功能。

    顾名思义,占位图就是指在图片的加载过程中,我们先显示一张临时的图片,等图片加载出来了再替换成要加载的图片。

    下面我们就来学习一下Glide占位图功能的使用方法,首先我事先准备好了一张loading.jpg图片,用来作为占位图显示。然后修改Glide加载部分的代码,如下所示:

    Glide.with(this)
         .load(url)
         .placeholder(R.drawable.loading)
         .into(imageView);

    没错,就是这么简单。我们只是在刚才的三步走之间插入了一个placeholder()方法,然后将占位图片的资源id传入到这个方法中即可。另外,这个占位图的用法其实也演示了Glide当中绝大多数API的用法,其实就是在load()和into()方法之间串接任意想添加的功能就可以了。

    不过如果你现在重新运行一下代码并点击Load Image,很可能是根本看不到占位图效果的。因为Glide有非常强大的缓存机制,我们刚才加载那张必应美图的时候Glide自动就已经将它缓存下来了,下次加载的时候将会直接从缓存中读取,不会再去网络下载了,因而加载的速度非常快,所以占位图可能根本来不及显示。

    因此这里我们还需要稍微做一点修改,来让占位图能有机会显示出来,修改代码如下所示:

    Glide.with(this)
         .load(url)
         .placeholder(R.drawable.loading)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .into(imageView);

    可以看到,这里串接了一个diskCacheStrategy()方法,并传入DiskCacheStrategy.NONE参数,这样就可以禁用掉Glide的缓存功能。

    关于Glide缓存方面的内容我们将会在后面的文章进行详细的讲解,这里只是为了测试占位图功能而加的一个额外配置,暂时你只需要知道禁用缓存必须这么写就可以了。

    现在重新运行一下代码,效果如下图所示:

    可以看到,当点击Load Image按钮之后会立即显示一张占位图,然后等真正的图片加载完成之后会将占位图替换掉。

    当然,这只是占位图的一种,除了这种加载占位图之外,还有一种异常占位图。异常占位图就是指,如果因为某些异常情况导致图片加载失败,比如说手机网络信号不好,这个时候就显示这张异常占位图。

    异常占位图的用法相信你已经可以猜到了,首先准备一张error.jpg图片,然后修改Glide加载部分的代码,如下所示:

    Glide.with(this)
         .load(url)
         .placeholder(R.drawable.loading)
         .error(R.drawable.error)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .into(imageView);

    很简单,这里又串接了一个error()方法就可以指定异常占位图了。

    现在你可以将图片的url地址修改成一个不存在的图片地址,或者干脆直接将手机的网络给关了,然后重新运行程序,效果如下图所示:

    这样我们就把Glide提供的占位图功能都掌握了。

    指定图片格式

    我们还需要再了解一下Glide另外一个强大的功能,那就是Glide是支持加载GIF图片的。这一点确实非常牛逼,因为相比之下Jake Warton曾经明确表示过,Picasso是不会支持加载GIF图片的。

    而使用Glide加载GIF图并不需要编写什么额外的代码,Glide内部会自动判断图片格式。比如这是一张GIF图片的URL地址:

    http://p1.pstatp.com/large/166200019850062839d3

    我们只需要将刚才那段加载图片代码中的URL地址替换成上面的地址就可以了,现在重新运行一下代码,效果如下图所示:

    也就是说,不管我们传入的是一张普通图片,还是一张GIF图片,Glide都会自动进行判断,并且可以正确地把它解析并展示出来。

    但是如果我想指定图片的格式该怎么办呢?就比如说,我希望加载的这张图必须是一张静态图片,我不需要Glide自动帮我判断它到底是静图还是GIF图。

    想实现这个功能仍然非常简单,我们只需要再串接一个新的方法就可以了,如下所示:

    Glide.with(this)
         .load(url)
         .asBitmap()
         .placeholder(R.drawable.loading)
         .error(R.drawable.error)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .into(imageView);

    可以看到,这里在load()方法的后面加入了一个asBitmap()方法,这个方法的意思就是说这里只允许加载静态图片,不需要Glide去帮我们自动进行图片格式的判断了。

    现在重新运行一下程序,效果如下图所示:

    由于调用了asBitmap()方法,现在GIF图就无法正常播放了,而是会在界面上显示第一帧的图片。

    那么类似地,既然我们能强制指定加载静态图片,就也能强制指定加载动态图片。比如说我们想要实现必须加载动态图片的功能,就可以这样写:

    Glide.with(this)
         .load(url)
         .asGif()
         .placeholder(R.drawable.loading)
         .error(R.drawable.error)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .into(imageView);

    这里调用了asGif()方法替代了asBitmap()方法,很好理解,相信不用我多做什么解释了。

    那么既然指定了只允许加载动态图片,如果我们传入了一张静态图片的URL地址又会怎么样呢?试一下就知道了,将图片的URL地址改成刚才的必应美图,然后重新运行代码,效果如下图所示。

    没错,如果指定了只能加载动态图片,而传入的图片却是一张静图的话,那么结果自然就只有加载失败喽。

    指定图片大小

    实际上,使用Glide在绝大多数情况下我们都是不需要指定图片大小的。

    在学习本节内容之前,你可能还需要先了解一个概念,就是我们平时在加载图片的时候很容易会造成内存浪费。什么叫内存浪费呢?比如说一张图片的尺寸是1000*1000像素,但是我们界面上的ImageView可能只有200*200像素,这个时候如果你不对图片进行任何压缩就直接读取到内存中,这就属于内存浪费了,因为程序中根本就用不到这么高像素的图片。

    关于图片压缩这方面,我之前也翻译过Android官方的一篇文章,感兴趣的朋友可以去阅读一下 Android高效加载大图、多图解决方案,有效避免程序OOM

    而使用Glide,我们就完全不用担心图片内存浪费,甚至是内存溢出的问题。因为Glide从来都不会直接将图片的完整尺寸全部加载到内存中,而是用多少加载多少。Glide会自动判断ImageView的大小,然后只将这么大的图片像素加载到内存当中,帮助我们节省内存开支。

    当然,Glide也并没有使用什么神奇的魔法,它内部的实现原理其实就是上面那篇文章当中介绍的技术,因此掌握了最基本的实现原理,你也可以自己实现一套这样的图片压缩机制。

    也正是因为Glide是如此的智能,所以刚才在开始的时候我就说了,在绝大多数情况下我们都是不需要指定图片大小的,因为Glide会自动根据ImageView的大小来决定图片的大小。

    不过,如果你真的有这样的需求,必须给图片指定一个固定的大小,Glide仍然是支持这个功能的。修改Glide加载部分的代码,如下所示:

    Glide.with(this)
         .load(url)
         .placeholder(R.drawable.loading)
         .error(R.drawable.error)
         .diskCacheStrategy(DiskCacheStrategy.NONE)
         .override(100, 100)
         .into(imageView);

    仍然非常简单,这里使用override()方法指定了一个图片的尺寸,也就是说,Glide现在只会将图片加载成100*100像素的尺寸,而不会管你的ImageView的大小是多少了。

    好了,今天是我们这个Glide系列的第一篇文章,写了这么多内容已经算是挺不错的了。现在你已经了解了Glide的基本用法,当然也是一些最常用的用法。下一篇文章当中,我们会尝试去分析Glide的源码,研究一下在这些基本用法的背后,Glide到底执行了什么神奇的操作,能够使得我们加载图片变得这么简单?感兴趣的朋友请继续阅读 Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫下方二维码即可关注:

    20160507110203928         20161011100137978

    展开全文
  • Android图片加载框架Picasso最全使用教程 一 Android图片加载框架Picasso最全使用教程 二 Android图片加载框架Picasso最全使用教程 三 Android图片加载框架Picasso最全使用教程 四 Android图片加载框架Picasso...

     

    Android图片加载框架Picasso最全使用教程 一

     

    Android图片加载框架Picasso最全使用教程 二

    Android图片加载框架Picasso最全使用教程 三

    Android图片加载框架Picasso最全使用教程 四

    Android图片加载框架Picasso最全使用教程 五

    Picasso介绍

    Picasso是Square公司开源的一个Android图形缓存库

    A powerful image downloading and caching library for Android
    一个Android下强大的图片下载缓存库

    Picasso实现了图片的异步加载,并解决了Android中加载图片时常见的一些问题,它有以下特点:

    • Adapter中取消了不在视图范围内的ImageView的资源加载,因为可能会产生图片错位;
    • 使用复杂的图片转换技术降低内存的使用
    • 自带内存和硬盘的二级缓存机制

    为什么要用Picasso

      Android系统作为图片资源加载的主角,它是通过图像的像素点来把图像加载到内存中的;现在一张500W的摄像头拍出的照片(2592x1936),加载到内存中需要大约19M的内存;如果你加入了信号强度不一的网络中进行了复杂的网络请求,并进行图片的缓存与其他处理,你会耗费大量的时间与精力来处理这些问题,但如果用了Picasso, 这些问题都一消而散;

    将Picasso加入到你的项目中

     目前Picasso的最新版本是2.5.2,你可以下载对应的Jar包,将Jar包添加到你的项目中,或者在build.gradle配置文件中加入

    compile 'com.squareup.picasso:picasso:2.5.2'

    注意如果你开启了混淆,你需要将以下代码添加到混淆规则文件中:

    -dontwarn com.squareup.okhttp.**

    小试牛刀:从网络加载一张图片

    Picasso使用简单易用的接口,并有一个实现类Picasso,一个完整的功能请求至少需要三个参数;

    • with(Context context) - Context上下文在很多Android Api中都是必须的
    • load(String imageUrl) - 图片网络加载地址
    • into(ImageView targetImageView) - 想进行图片展示的ImageView

    简单用例:

    ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
    String internetUrl = "http://b.hiphotos.baidu.com/image/pic/item/32fa828ba61ea8d3fcd2e9ce9e0a304e241f5803.jpg";Picasso
        .with(context)
        .load(internetUrl)
        .into(targetImageView);

      就是这么简单,如果你的 URL地址正确并且图片存在,在几秒中之内就能看到这张图片了;如果图片资源不存在,Picasso也会有错误的回调,现在你已经看到了只需3行代码就能加载图片了,当然这只是冰山一角,让我们继续揭开Picasso的神秘面纱;

    图片的其他加载方式

      Picasso的图片不仅仅能加载网络资源,也能从本地文件,Android项目资源,以及URI地址进行图片加载,下面我们就对这三种方式进行实例说明;

    从Android Resources 中加载

      代码也是三行,只需要将网络资源地址更改为一个int值地址即可,上代码:

    ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
    int resourceId = R.mipmap.ic_launcher;
    
    Picasso
        .with(context)
        .load(resourceId)
        .into(targetImageView);

    注意: R.mipmapAndroid Studio中新的资源引用路径,这个老司机都知道.

    从本地File文件中加载

      如果你让用户选择本地的一张图片进行展示的话,就需要用到这个加载方式了,当然,也是So Easy,只需要将地址更换为一个File即可,上代码:

    ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
    File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Running.jpg");
    
    Picasso
        .with(context)
        .load(file)
        .into(targetImageView); 

    注意:这个file并不一定非得是在你的设备中,可以是任意的路径,只要是File路径即可;

    URI地址中加载

      这个请求方式相比其他也并没有什么不同,上代码:

    public static final String ANDROID_RESOURCE = "android.resource://";
    public static final String FOREWARD_SLASH = "/";
    
    private static Uri resourceIdToUri(Context context, int resourceId) {
        return Uri.parse(ANDROID_RESOURCE + context.getPackageName() + FOREWARD_SLASH + resourceId);
    }
    
    Uri uri = resourceIdToUri(context, R.mipmap.future_studio_launcher);
    ImageView targetImageView = (ImageView) findViewById(R.id.imageView);
    
    Picasso  
        .with(context)
        .load(uri)
        .into(targetImageView);

    注意:为了示范,只能用资源文件转换为URI,并不仅仅是这种方式, 它可以支持任意的URI地址;

    OK,到此我们已经对Picasso有一个基本的认识和了解了,跟着我的脚步,继续发现Picasso更多好玩的功能,下面会介绍Picasso在ListViewGridView的用法,愿大家都有美好的一天~~

     

    展开全文
  • Android第三方视频加载框架JCVideoPlayer

    千次阅读 2019-01-19 13:56:01
    正好最近做项目有个需要加载网络视频技术,就找了找,碰到了这个开源的框架。主要还是网络请求下来的视频地址,然后简单的,赋一下值,非常OK。不过限自己练习用毕竟看需求的嘛,不多介绍复制用吧。 先看看效果大概...

    正好最近做项目有个需要加载网络视频技术,就找了找,碰到了这个开源的框架。主要还是网络请求下来的视频地址,然后简单的,赋一下值,非常OK。不过限自己练习用毕竟看需求的嘛,不多介绍复制用吧。

    • 先看看效果大概就是这样

    网络权限:

      <uses-permission android:name="android.permission.INTERNET" />

    导入两个依赖:

        implementation 'fm.jiecao:jiecaovideoplayer:4.8.3'    //视频框架依赖
        implementation 'com.github.bumptech.glide:glide:4.8.0'    //Glide依赖


    <!--  布局控件引入  -->
    <fm.jiecao.jcvideoplayer_lib.JCVideoPlayerStandard
            android:id="@+id/videoplayer"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    

    送大家个免费搞笑视频接口(里面有的视频地址过期了,不过不耽误使用,数据持续更新,参数可拼接) 

    https://www.apiopen.top/satinGodApi?type=1&page=1
      JCVideoPlayerStandard.FULLSCREEN_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;  //横向
      JCVideoPlayerStandard.NORMAL_ORIENTATION = ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT;  //纵向
    
            /**
             * 参数1:视频路径
             * 参数2:播放器类型
             * 参数3:视频标题  可为空
             */
       boolean up = videoplayer.setUp(bean.playUrl, JCVideoPlayer.SCREEN_LAYOUT_LIST, "")
         if (up) {
             //展示播放器图片并充满
             videoplayer.thumbImageView.setScaleType(ImageView.ScaleType.FIT_XY)
             Glide.with(this).load(bean.feed).into(videoplayer.thumbImageView)
          }
    
        @Override
        public void onBackPressed() { 
            "全屏竖屏切换的时候继续播放"
            if (JCVideoPlayerStandard.backPress()){
                return;
            }
            super.onBackPressed();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            "释放资源停止视频播放"
            JCVideoPlayerStandard.releaseAllVideos();
        }
    
    
    
    

     设置Activity可旋转

      <activity
                android:name=".activity.VideoActivity"
        android:configChanges="orientation|screenSize|keyboardHidden"></activity>

     

    展开全文
  • Android图片加载框架Picasso最全使用教程 一Android图片加载框架Picasso最全使用教程 二Android图片加载框架Picasso最全使用教程 三Android图片加载框架Picasso最全使用教程 四Android图片加载框架Picasso最全使用...

    Android图片加载框架Picasso最全使用教程 一

    Android图片加载框架Picasso最全使用教程 二

    Android图片加载框架Picasso最全使用教程 三

    Android图片加载框架Picasso最全使用教程 四

    Android图片加载框架Picasso最全使用教程 五

    前言

      前面我们已经介绍了Picasso的基本用法及如何将一张图片加载到ImageView中,下面我们就利用Picasso在ListView中加载图片;Let’s Go!

    一个ListView的简单应用示例

    1: 首先,需要先准备好一些网络图片资源

    public static String[] imageUrls = {
                "http://i.imgur.com/rFLNqWI.jpg",
                "http://i.imgur.com/C9pBVt7.jpg",
                "http://i.imgur.com/rT5vXE1.jpg",
                "http://i.imgur.com/aIy5R2k.jpg",
                "http://i.imgur.com/MoJs9pT.jpg",
                "http://i.imgur.com/S963yEM.jpg",
                "http://i.imgur.com/rLR2cyc.jpg",
                "http://i.imgur.com/SEPdUIx.jpg",
                "http://i.imgur.com/aC9OjaM.jpg",
                "http://i.imgur.com/76Jfv9b.jpg",
                "http://i.imgur.com/fUX7EIB.jpg",
                "http://i.imgur.com/syELajx.jpg",
                "http://i.imgur.com/COzBnru.jpg",
                "http://i.imgur.com/Z3QjilA.jpg",
        };

    2: 然后写一个简单的Activity,需要一个Adapter,并将Adapter设置到ListView中填充数据

    public class MainActivity extends AppCompatActivity {
    
        private ListView lv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lv = (ListView) findViewById(R.id.lv);
            lv.setAdapter(new ImageListAdapter(this,imageUrls));
        }
    }
    

    3:我们需要在Adapter中加载一个ListView子item的layout文件,当然也很简单

    <?xml version="1.0" encoding="utf-8"?>
    <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" 
        android:layout_height="200dp">
    
    </ImageView>

    4: 我们还需要一个自定义的Adapter,功能很简单,只显示一张图片即可

     public class ImageListAdapter extends ArrayAdapter{
            private Context context;
    
            private String[] imageUrls;
    
            public ImageListAdapter(Context context,String[] imageUrls){
                super(context,R.layout.item_picasso,imageUrls);
    
                this.context = context;
                this.imageUrls = imageUrls;
    
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView==null){
                    convertView = View.inflate(context,R.layout.item_picasso,null);
                }
    
                //加载图片
                Picasso
                        .with(context)
                        .load(imageUrls[position])
                        .into((ImageView) convertView);
    
                return convertView;
            }
        }

    注意:

    • 我们一般会复用ConvertView来保持listview的快速平滑的滚动,而Picasso的一个优点就是会自动处理划出屏幕外的图片请求,并给对应的ImageView加载出正确的资源;
    • 另外,你会发现当你上下滚动后,会发现图片加载速度有了明显的提升,这正是因为Picasso的高速缓存,而且不需要再去从网络加载,Picasso所实现的缓存的大小取决于你自己的设备;
    • Picasso加载图片的资源会从三个地方进行获取, 内存,磁盘,和网络,这些操作都不需要你自己处理,Picasso已经能智能完成;

    一个GridView的小示例

    ListViewGridView的展示及使用上并没有什么区别,很简单,上代码:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.smallcheric.picasso.MainActivity">
        <android.support.v7.widget.AppCompatButton
            android:id="@+id/bt"
            android:layout_centerHorizontal="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="切换"/>
        <ListView
            android:id="@+id/lv"
            android:layout_below="@id/bt"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             />
        <GridView
            android:id="@+id/grid"
            android:layout_below="@id/bt"
            android:visibility="gone"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:numColumns="2"/>
    </RelativeLayout>
    

    最后,附上Github地址点我

    如果图片地址不存在或为空怎么处理

    上面我们写的代码都是在正常的情况下,但是如果我们的图片地址错误将怎么处理呢,如果不去处理,网络可能会一直请求或者我们的屏幕上会出现一片空白,这都不是我们希望看到的.

    Picasso给了我们两种解决方案:

    • 在判断为空的地址时,取消网络请求,调用cancelRequest(),然后调用imageView.setImageDrawable(null)
    • 或者调用Picasso的.placeHolder()方法进行图片的替换展示
    • 如果图片网址错误,我们也可以调用.error()方法进行图片替换
     @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                if (convertView==null){
                    convertView = View.inflate(context,R.layout.item_picasso,null);
                }
                ImageView imageView = (ImageView)convertView;
                if (TextUtils.isEmpty(imageUrls[position])){
                    Picasso
                            .with(context)
                            .cancelRequest(imageView);
                    imageView.setImageDrawable(null);
                }else {
                    //加载图片
                    Picasso
                            .with(context)
                            .load(imageUrls[position])
                            .placeholder(R.mipmap.ic_launcher)
                            .error(R.mipmap.ic_launcher)
                            .into((ImageView) convertView);
                }
                return convertView;
            }

    注意:.placeholder().error()所传的参数与.load()相同

    OK,到现在为止,我们已经基本掌握了Picasso的基本用法,后面将为大家分析到Picasso性能方面的特性,让我们共同期待,愿大家都有美好的一天.

    展开全文
  • 直到最近开发的一个项目中,我才发现为什么很多开发者都放弃ImageLoader这套用熟了的框架换用glide图片加载框架了。 1.ImageLoad特殊场景的内存泄漏; 普通activity的界面使用中,加载图片的页面销毁查看内存泄漏也没有...
  • Android网络加载框架:Picasso简介

    千次阅读 2016-01-14 13:47:43
    * Android网络加载框架:Picasso,开源地址:http://square.github.io/picasso/ * 该框架是由Square公司为Android开发提供的一套图形缓存框架,实现图片的下载及缓存功能 * 优点: * 可以加载本地及网络图片 ...
  • 动态加载框架DL的基本结构、原理解析
  • Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程 。 Glide缓存简介 Glide的缓存设计可以说是非常先进的,考虑的场景也很周全。在缓存这一功能上,Glide又将它分成了两个模块,一个是...
  • 现在在Android加载图片的框架都已经烂大街了,所以我们这里也不说谁好谁坏,当然也不做比较了,因为得出的结果都是片面的,没有谁好谁坏只有适不适合需求罢了起因是在泰国举行的
  • :Introduction to Glide, Image Loader Library for Android, recommended by Google在泰国举行的Google开发者大会上,Google为我们Android开发者介绍了一款作者是bumptech的、名为Glide的图片加载框架。...
  • 大家好,又到了学习Glide的时间了。...不过Glide的这个框架的功能实在是太强大了,它所能做的事情远远不止于目前我们所学的这些。因此,今天我们就再来学习一个新的功能模块,并且是一个非常重要的模块
  • 我们都知道,使用Glide来加载一张网络上的图片是非常简单的,但是让人头疼的是,我们却无从得知当前图片的下载进度。如果这张图片很小的话,那么问题也不大,反正很快就会被加载出来。但如果这是一张比较大的GIF图,...
  • Android图片加载框架最全解析(一),Glide的基本用法 这篇文章中讲解的很清楚了,这里就不再赘述。 好了,现在你已经成功入门Glide 4了,那么接下来就让我们学习一下Glide 4的更多用法吧。 占位图 观察...
  • Android图片加载框架Glide使用总结

    万次阅读 2016-07-05 14:47:36
    目录:  使用Glide结合列表的样式进行图片加载 如果使用的是RecyclerView,可以在Adapter的onBindViewHolder... 当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeH
  • 说到Picasso,相信Android开发人员绝不陌生,它是Square公司开发的一款图片加载神器。使用过它的coder绝对是爱不释手:对它本身而言,轻量安全,有效加载图片并防止OOM;对我们开发者来说,简单方便,一行代码搞定...
  • Android图片加载框架最全解析(三),深入探究Glide的缓存机制 。 今天是这个Glide系列的第四篇文章,我们又要选取一个新的功能模块开始学习了,那么就来研究一下Glide的回调和监听功能吧。今天的学习模式仍然是...
  • Android图片加载框架Picasso最全使用教程 三

    万次阅读 多人点赞 2016-04-04 01:59:05
    如果一个屏幕上顶部图片较大,而底部图片较小,因为Picasso是异步加载,所以小图会先加载出来,但是对于用户来说,更希望看到的是上面的图片先加载,底部的图片后加载,Picasso支持设置优先级,分为 HIGH , MEDIUM , 和 ...
  • 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可...现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军
  • Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程 。 显然我们已经用惯了 Glide.with(context).load(url).into(imageView) 这样一行简洁的Glide图片加载语句,但是我们好像从来没有注意过...
  • Android Glide图片加载框架详解

    万次阅读 2015-07-15 10:39:33
    Glide是一个快速和有效的开源图像加载Android框架,内存和磁盘缓存,和资源汇集成一个简单和易于使用的界面。 Glide支持抓取、解码和显示视频照片,图片,动画gif。Glide包含一个灵活的api,允许开发者插入任何网络...
  • android glide 图片加载框架使用

    千次阅读 2015-12-11 10:03:46
    android glide 图片加载框架使用
  • Android通用LoadingView加载框架

    千次阅读 2018-07-05 11:27:31
    手写一个通用加载中、显示数据、加载失败、空数据的LoadingView框架。 定义3个布局:加载中,加载失败,空数据 加载中: &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt...
  • Android图片加载Glide框架使用详解

    千次阅读 多人点赞 2016-03-21 16:21:00
    现在的图片加载框架也是很多,我们最熟悉的应该是UIL了,今天就来记录一下Glide的使用。老规矩,在节目开始之前,我们先来一个搞笑段子:虽然我不会赚钱,但是我会省钱啊。我早上就看上一辆兰博基尼,我一咬牙、一...
  • 1.ImageLoader2.Volley3.picasso4.glide5.fresco首先:以前自己一直是使用ImageLoader的,,ImageLoader大家都是知道的,使用最广泛,使用方式也是最灵活的,,但后续出现了很多图片加载框架,自己也没去体验, 有一...
  • Android 框架练成 教你打造高效的图片加载框架

    万次阅读 多人点赞 2014-12-12 09:29:07
    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41874561,本文出自:【张鸿洋的博客】1、概述优秀的图片加载框架不要太多,什么UIL , Volley ,Picasso,Imageloader等等。但是作为一名合格的...
  • 《Android图片加载与缓存开源框架Android Glide》 Android Glide是一个开源的图片加载和缓存处理的第三方框架。和Android的Picasso库类似,个人感觉比Android Picasso好用。Android Glide使自身内部已经实现...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,375
精华内容 42,150
关键字:

android视频加载框架