Android高效开发(一)—合理使用图片资源

Android开发图片资源使用与优化指南 Android提供了两种类型的动画框架:视图动画(View Animation):针对视图控件的动画,如平移、旋转、缩放和透明度变化。视图动画只改变视觉效果,不改变视图的实际状态。属性动画(Property Animation):从Android 3.0开始引入,可以对对象的任何属性进行动画操作,并且动画效果会改变对象的实际属性。属性动画包括和等类。 阅读详情

前言

在Android开发中,我们难免会遇到加载图片的场景。不管是网络图片、资源图片或者是SD卡中的图片,都需要加载到内存中使用。如果不能合理处理图片,可能会导致OOM的问题或者其他性能问题,接下就讨论下Android中图片资源处理的几种常用的方式。

Resource中的图片资源的处理

在Android中开发的时候都会用到很多图片素材,对于某些背景图片、各种图标或者其他一些提示图片我们通常会放到res目录中的drawable中。

我们知道在res目录下有很多drawable目录,比如:drawable、drawable-hdpi、drawable-mdpi等。这些目录对应了不同密度的屏幕,在不同密度的屏幕下会优先从对应目录下取图片资源。

目录名称密度(Density)
res/drawable0
res/drawable-ldpi120
res/drawable-mdpi160
res/drawable-hdpi240
res/drawable-xhdpi320
res/drawable-xxdpi480

这六种目录代表了目前市面上Android机型不同的6中密度的屏幕。

注意:res/drawable目录的密度为0,不是说有机型的屏幕密度为0。这是默认密度,在不同机型下默认密度不一样。

Android如何找到res中图片资源

Android在加载资源图片时,会先获取当前设备的屏幕密度,然后根据屏幕密度去找图片资源。如果没有在对应的文件夹下找到图片资源,就会采取就近原则,从与屏幕密度最相近的图片资源目录获取。如果都没有就只能从默认的资源目录下获取(也就是res/drawable)。

在获取到图片资源时,如果密度不匹配,Android会对图片进行处理。比如在res/drawable-mdpi找到了图片,但是设备屏幕密度是xxdpi的,那么Android就会按照3倍大小缩放这张图片。根据图片内存的计算公式(图片高度 x 图片宽度 x 一个像素占用的内存大小)。比如:一张800x480的图片原来占用内存大约是1.46M,增加3倍后图片是3200x1920,占用内存大约是23M。而一般Android系统分配给每个进程的内存也才一百多M,在低配手机中很容易就产生OOM。

如何处理

针对上面的情况,如何处理资源文件呢?因为Android拿到低密度的图片时,在高密度设备会将其放大。所以在添加资源文件时,应该优先使用高品质图片从高密度的目录往下放。

Bitmap图片的处理

Bitmap类型的图片也是在开发中经常用到的。对于Bitmap图片如果不加处理直接使用的话,也很容易导致OOM。因为会有一些占用很大的图片被加载到内存中,而真正的需求可能并不需要这么大的图片。

接下来的内容大多来自于Google推荐的一种处理Bitmap图片的方法。链接在下面,感兴趣的同学也可以直接阅读文档。

https://developer.android.com/topic/performance/graphics/load-bitmap

在Google的方案中,主要的思想是按需加载Bitmap。所谓的按需加载,就是根据图片的尺寸和要加载图片的ImageView的尺寸对Bitmap进行压缩处理。

获取Bitmap图片的尺寸
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

上面的代码会获取到Bitmap图片的宽、高、MimeType。同时这里有个参数是比较重要的,inJustDecodeBounds这个参数设为true的时候不会在内存中分配Bitmap的空间,只是获取到了Bitmap图片的宽高等信息。

计算压缩比例
public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        //如果Bitmap图片宽高大于ImageView宽高,就缩放图片
        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        //计算缩放比例
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

上面的代码通过图片的尺寸计算Bitmap图片的缩放比例。最终得到的结果inSampleSize就是需要缩放的比例。

获得图片
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

这一步是获取得到最终的Bitmap图片,可以看到BitmapFactory.Options options的inSampleSize是缩放比例,在获取图片之前,将inJustDecodeBounds设置为false,然后再次调用decode方法就获得了最终的Bitma对象。

使用图片加载框架

在处理图片时,特别是网络图片如果我们想要高效的利用图片资源。这个时候使用图片加载框架是一个很好的选择。比如:Glide框架。这也是Google推荐的图片加载框架。

图片加载框架不仅能帮助我们处理图片。同时还能通过缓存复用图片,提高图片的利用率。

总结

在Android开发中,图片的处理几乎是所以应用都要面对的场景,能够了解一些图片的优化的小技巧,能够提高我们在开发中的效率与质量。如果各位同学有更好的方法,欢迎在评论区讨论,大家共同学习。

Android开发图片素材管理与优化 分辨率是屏幕水平和垂直像素的数量,表示屏幕上能够显示的细节程度。屏幕密度(DPI,每英寸点数)表示屏幕上每英寸有多少个像素点。Android将密度分为几个主要的类别:低密度(ldpi)、中等密度(mdpi)、高密度(hdpi)、超高密度(xhdpi)等。Drawable资源通常在XML文件中定义,并放置在目录下。通过XML定义的Drawable可以轻松地在布局文件或代码中引用。例如,这是一个简单的shape.xml文件,用于定义一个圆形的Drawable资源:-- 红色填充 --> 阅读详情

相关推荐

Android高效图片浏览器开发实战项目

在现代Android应用中,图片浏览功能已不再局限于静态展示。用户期望获得更自然、直观的交互体验,如双指缩放、拖拽平移、旋转查看等操作。为了满足这些需求,开发者往往需要超越系统默认ImageView的能力,构建一个支持多手势交互的可定制化图像视图组件。本章节将深入剖析如何从零开始实现一个具备完整手势响应能力的自定义ImageView,涵盖事件分发机制、矩阵变换原理、惯性滑动算法设计以及嵌套滚动冲突解决方案。

weixin_31800911的博客 933

Android 如何在不换资源的前提下裁剪图片尺寸

原生控件图片裁剪

baidu_34395789的博客 669

Android系统图片资源浏览与应用实战指南

在Android应用开发中,资源管理是构建用户界面和实现功能交互的核心环节之一。Android通过一套完整的资源组织机制,将图片、字符串、布局、颜色等静态内容统一纳入R类进行管理,使得开发者能够以高效、类型安全的方式访问各类资源。其中,drawable资源作为视觉呈现的重要组成部分,承载了大量UI元素的图像显示任务。// 示例:通过资源ID访问系统内置图标系统预定义的类提供了丰富的内置图标与图形资源,涵盖通知、菜单、对话框等多种场景下的标准控件样式。

weixin_35516624的博客 708

安卓开发:添加图片资源并显示在页面中

找到项目中的MainActivity.kt 文件,添加函数以及可组合项Image用来显示图片;可以选择其他的 .kt文件;或者直接点击 : 编辑器左侧的 Resource Manager。选择 QUALFIER TYPE 和 VALUE 后,点击下一步;1,依次点击 工具--Resource Manager;

yinge0508的博客 2149

Android斗地主游戏所需的54张扑克牌图片资源包

ImageView是Android开发中用于显示图片的组件。它支持多种格式的图片,如JPEG、PNG、GIF和WebP等。除了展示静态图片,ImageView还可以被用来展示通过动画效果变化的图片,或者通过编程动态生成的图形。ImageView广泛应用于图片浏览、商品详情页面、游戏界面以及其他需要显示图片的地方。XML是Android平台上定义动画的首选方法,因为它易于修改和维护,同时支持设计师和开发者之间的协作。定义动画的XML文件通常放在res/anim目录下。

weixin_35879493的博客 859

开发安卓用的图片资源

整合了很多安卓用的图标,很实用,希望对开发的人提供很大的帮助

安卓针对不同尺寸图片创建存放的drawable文件夹

右键res

weifengdada的博客 718

android开发(微信图片资源)

无偿共享图片,众多android开发者所需要的图片资源,什么点,特别棒!不说了,下了才知道!棒棒哒!

Android使用图片资源

android项目下资源文件放到res

都是浮云 9751

获取系统图片资源及归类

思路不错

android开发常用图片

比较全的android开发常用图片

Android高效显示图片详解(一)

说明:       本讲义分为三部分,较为详细的介绍了Android平台下图片显示,加载等操作的处理原则与办法,以供大家共同学习,转载请注明出处 “From 移动微技”。 前提与解释:       安卓平台作为一款移动端的应用操作平台,其内存容量是十分有限的,内存资源是十分珍贵的,是无法与传统的桌面平台相比的,因此,在安卓平台下同样的图片操作与处理都要十分谨慎,否则你

moyunfei1987的专栏 507

android开发常用到的小图标

android开发常用到的小图标下载,android开发小图标

Android是如何对应用进行内存管理和限制的,我们如何合理使用内存。

总之,合理使用内存是 Android 应用程序开发中的一个重要问题。开发者应该了解 Android 的内存管理机制,并采取相应的优化措施,以确保应用程序的稳定性和性能。同时,开发者还可以使用 Android 提供的工具和技术来分析和优化应用程序的内存使用情况。

challenge51all的专栏 1748

如何使用obspy下载地震波形数据

如果你是地震研究学者,或者需要进行地震方面的研究,那么地震数据下载是一个必不可少的流程,本文将告诉你如何使用obspy下载想要的地震数据

monsterk1的博客 2074

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

安卓开发之Bitmap(一)

Bitmap是安卓开发中和图片相关的最常见的一个类。无论是图片的处理,加载,以及自定义控件,都和Bitmap息息相关。 Bitmap的使用并不是很困难,但是在使用过程中及其容易导致OOM,这也是让开发者最烦心的事之一。合理有效的使用Bitmap,避免OOM。 BitmapFactory

jialiang的博客 1955

Nginx&&Keepalived(一)Keepalived介绍

一、背景: 案例1:如现有服务my-service-demo,希望实现高可用和负载均衡: 首先,my-service-demo服务部署在两台机器上,通过nginx去代理这两个节点,负载均衡就实现了。如果只有一个nginx,这台nginx机器一旦宕机,访问nginx会报错。这时候在另外一台机器nginx2上也安装nginx,并配置同样的代理,可以解决上述问题,但是暴露给用户的只有一个域名(或ip),不可能给用户提供两个域名,域名1(nginx机器1)访问不了了再让用户访问域名2(nginx机器2),这

w_t_y_y的博客 2881

Glide: 掌握 Android 图片加载的艺术

在 Android 开发中,图片加载是一个常见且关键的功能。一个高效、流畅的图片加载库可以极大地提升用户体验。Glide 是目前最受欢迎的 Android 图片加载库之一,它提供了简单、高效、功能丰富的图片加载解决方案。本文将带你深入了解 Glide 的核心特性、使用方法以及最佳实践。

Unity打怪升级 1289

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

基于MediaPipe的智能俯卧撑计数与姿势矫正系统

在现代健身和体能训练中,俯卧撑是最基础也是最有效的自重训练动作之一。然而,许多人在进行俯卧撑训练时常常存在姿势不正确、计数不准确等问题。本文将介绍如何利用计算机视觉和姿态估计技术,开发一个智能的俯卧撑计数与姿势矫正系统。

qq_36224726的博客 916

安卓开发之资源概述、优劣分析与优化方案

随着智能手机的普及,Android操作系统已成为全球最广泛使用的移动平台之一。在Android应用开发中,资源管理是构建高效、响应迅速且用户友好的应用程序的关键要素。 本文主要探讨了安卓应用程序开发过程中的资源管理机制,包括其基本结构、功能特点以及存在的挑战,并提出了一系列优化方案。通过对资源管理的深入剖析,旨在提高应用性能、增强用户体验并适应日益多样化的设备环境。

wlred1980的博客 1381

江科大51单片机笔记【1】单片机及开发板介绍

单片机,Micro Controller Unit,简称MCU,内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(传感器)、处理(CPU)和硬件设备(电机、LED)的控制单片机算是一个袖珍版计算机,是一个完整的计算机系统,成本低体积小结构简单单片机的使用领域:智能仪表、实时工控、通讯设备、导航系统、家用电器等。

2301_80195807的博客 833
上一篇: HTTPS工作原理
下一篇: Dart中的异步与事件循环
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值