提高用户体验的安卓imageView图片加载方法

一、使用Glide库

在安卓开发中,图片加载是非常常见的需求,而使用Glide库可以轻松地实现高品质、流畅的图片加载,增强用户体验。

Glide库支持本地图片、网络图片、GIF图片等多种图片格式,同时还支持图像缩放、动画、转换等高级功能。

需要注意的是,在使用Glide库之前,需要先在build.gradle文件中添加Glide依赖:


dependencies {
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
}

接下来在代码中使用Glide加载图片:


Glide.with(this)
    .load("http://www.xxx.com/xxx.jpg")
    .placeholder(R.drawable.placeholder) // 占位图
    .error(R.drawable.error) // 错误图
    .into(imageView);

二、使用LruCache进行图片缓存

为了优化图片加载的性能,可以使用LruCache进行图片缓存,减少网络请求的次数。

LruCache是基于LRU(Least Recently Used)算法实现的一个缓存类,它可以按照缓存数据的使用频率来移除最近最少使用的数据对象。


// 初始化缓存
private LruCache mMemoryCache;
private void initCache() {
    final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
    final int cacheSize = maxMemory / 8; // 1/8作为缓存大小
    mMemoryCache = new LruCache(cacheSize) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return bitmap.getByteCount() / 1024;
        }
    };
}

// 存储缓存
private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemoryCache(key) == null) {
        mMemoryCache.put(key, bitmap);
    }
}

// 读取缓存
private Bitmap getBitmapFromMemoryCache(String key) {
    return mMemoryCache.get(key);
}

使用缓存的方式:


Bitmap bitmap = getBitmapFromMemoryCache(url);
if (bitmap != null) {
    imageView.setImageBitmap(bitmap);
} else {
    Glide.with(MainActivity.this)
        .load(url)
        .placeholder(R.drawable.placeholder) // 占位图
        .error(R.drawable.error) // 错误图
        .listener(new RequestListener() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                return false;
            }

            @Override
            public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
                Bitmap bitmap = ((BitmapDrawable) resource).getBitmap();
                addBitmapToMemoryCache(url, bitmap); // 存储到缓存
                return false;
            }
        })
        .into(imageView);
}

三、使用RecyclerView进行图片列表展示

在实际开发中,经常需要实现图片列表的展示,而使用RecyclerView可以高效地展示大量图片,同时还可以实现下拉刷新、上拉加载等功能。

在RecyclerView中,可以使用GridLayoutManager来实现网格布局。

需要注意的是,在网格布局中,图片的宽度应该按比例调整,以避免图片变形。


RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); // 网格布局,2列
recyclerView.setAdapter(new RecyclerView.Adapter() {
    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        Glide.with(MainActivity.this)
            .load(urls[position % urls.length])
            .placeholder(R.drawable.placeholder) // 占位图
            .error(R.drawable.error) // 错误图
            .into(holder.imageView);
    }

    @Override
    public int getItemCount() {
        return 50;
    }
});

private static class MyViewHolder extends RecyclerView.ViewHolder {
    private ImageView imageView;

    MyViewHolder(View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageView);
        ViewGroup.LayoutParams lp = imageView.getLayoutParams();
        lp.width = getScreenWidth() / 2; // 调整宽度,保持比例
        lp.height = lp.width * 9 / 16;
        imageView.setLayoutParams(lp);
    }
}

private static int getScreenWidth() {
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    Point point = new Point();
    windowManager.getDefaultDisplay().getSize(point);
    return point.x;
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/192550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-01 10:28
下一篇 2024-12-01 10:28

相关推荐

  • QML 动态加载实践

    探讨 QML 框架下动态加载实现的方法和技巧。 一、实现动态加载的方法 QML 支持从 JavaScript 中动态指定需要加载的 QML 组件,并放置到运行时指定的位置。这种技术…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • ArcGIS更改标注位置为中心的方法

    本篇文章将从多个方面详细阐述如何在ArcGIS中更改标注位置为中心。让我们一步步来看。 一、禁止标注智能调整 在ArcMap中设置标注智能调整可以自动将标注位置调整到最佳显示位置。…

    编程 2025-04-29
  • 解决.net 6.0运行闪退的方法

    如果你正在使用.net 6.0开发应用程序,可能会遇到程序闪退的情况。这篇文章将从多个方面为你解决这个问题。 一、代码问题 代码问题是导致.net 6.0程序闪退的主要原因之一。首…

    编程 2025-04-29
  • Python创建分配内存的方法

    在python中,我们常常需要创建并分配内存来存储数据。不同的类型和数据结构可能需要不同的方法来分配内存。本文将从多个方面介绍Python创建分配内存的方法,包括列表、元组、字典、…

    编程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一个类的构造函数,在创建对象时被调用。在本篇文章中,我们将从多个方面详细讨论init方法的作用,使用方法以及注意点。 一、定义init方法 在Pyth…

    编程 2025-04-29
  • 用Python绘制酷炫图片

    在本篇文章中,我们将展示如何使用Python绘制酷炫的图片。 一、安装Python绘图库 在使用Python绘制图片之前,我们需要先安装Python绘图库。Python有很多绘图库…

    编程 2025-04-29
  • 用不同的方法求素数

    素数是指只能被1和自身整除的正整数,如2、3、5、7、11、13等。素数在密码学、计算机科学、数学、物理等领域都有着广泛的应用。本文将介绍几种常见的求素数的方法,包括暴力枚举法、埃…

    编程 2025-04-29
  • 使用Vue实现前端AES加密并输出为十六进制的方法

    在前端开发中,数据传输的安全性问题十分重要,其中一种保护数据安全的方式是加密。本文将会介绍如何使用Vue框架实现前端AES加密并将加密结果输出为十六进制。 一、AES加密介绍 AE…

    编程 2025-04-29
  • Python中读入csv文件数据的方法用法介绍

    csv是一种常见的数据格式,通常用于存储小型数据集。Python作为一种广泛流行的编程语言,内置了许多操作csv文件的库。本文将从多个方面详细介绍Python读入csv文件的方法。…

    编程 2025-04-29

发表回复

登录后才能评论