版权声明:本文为博主原创文章,未经博主同意不得转载。

https://blog.csdn.net/jingxia2008/article/details/32327699

问题来源

android 能够在 gallery 里面显示内部存储的图片,支持 jpeg。png,gif,bmp 等,甚至文件类型和图片后缀名不一致。仅仅要是图片文件就能显示,然后 git 仅仅会显示第一帧图像,然而 android 事实上是能够显示 gif 动画的,在浏览器里打开 gif 动画,就能够正常载入显示。

Gallery 查看图片

gallery 实现了 Gallery/src/com/android/camera/ViewImage.java   
                        ImageViewTouchBase newView =mSlideShowImageViews[mSlideShowImageCurrent];newView.setVisibility(View.VISIBLE);newView.setImageRotateBitmapResetBase(bitmap, true);newView.bringToFront();

通过自己实现的  ImageViewTouchBase 装载图片并显示

ImageViewTouchBase 继承自 framework 的 ImageView
package com.android.camera;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.widget.ImageView;abstract class ImageViewTouchBase extends ImageView {

framework 处理图片

ImageView 是 android 图片框架实现通用图片处理显示类:
能够显示 resource 里面的图片,
    public void setImageResource(int resId) {if (mUri != null || mResource != resId) {updateDrawable(null);mResource = resId;mUri = null;final int oldWidth = mDrawableWidth;final int oldHeight = mDrawableHeight;resolveUri();if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {requestLayout();}invalidate();}}

我们在 gallery 里面打开的图片调用是通过 uri 传过来的,

    public void setImageURI(Uri uri) {if (mResource != 0 ||(mUri != uri &&(uri == null || mUri == null || !uri.equals(mUri)))) {updateDrawable(null);mResource = 0;mUri = uri;final int oldWidth = mDrawableWidth;final int oldHeight = mDrawableHeight;resolveUri();if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {requestLayout();}invalidate();}}

android 会解析 uri 得到目标文件路径

        } else if (mUri != null) {String scheme = mUri.getScheme();if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {try {// Load drawable through Resources, to get the source density informationContentResolver.OpenResourceIdResult r =mContext.getContentResolver().getResourceId(mUri);d = r.r.getDrawable(r.id);} catch (Exception e) {Log.w("ImageView", "Unable to open content: " + mUri, e);}} else if (ContentResolver.SCHEME_CONTENT.equals(scheme)|| ContentResolver.SCHEME_FILE.equals(scheme)) {InputStream stream = null;try {stream = mContext.getContentResolver().openInputStream(mUri);d = Drawable.createFromStream(stream, null);} catch (Exception e) {Log.w("ImageView", "Unable to open content: " + mUri, e);} finally {if (stream != null) {try {stream.close();} catch (IOException e) {Log.w("ImageView", "Unable to close content: " + mUri, e);}}}} else {d = Drawable.createFromPath(mUri.toString());}

我们点击 gallery 的图片会产生包括 content 的 uri:

I/ActivityManager( 1304): START u0 {dat=content://media/external/images/media/21 cmp=com.android.gallery/com.android.camera.ViewImage (has extras)} from pid 1706
然后通过 Drawable 从 inputstream 里面解析创建 Drawable 对象
    public static Drawable createFromStream(InputStream is, String srcName) {Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");try {return createFromResourceStream(null, null, is, srcName, null);} finally {Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);}}

后面的流程就是交给 skia 解析然后获得一个 bitmap 并返回了。 skia 的 decode 能够自己主动识别 steam 里面的数据流创建对应的 decoder。

问题答案

framework 是通用的图片显示处理,最后仅仅返回了一个 bitmap ,所以 gif 仅仅能处理第一帧图像了。可是 browser 是从新实现了图像显示接口,有专门针对 gif 的显示处理,所以能够显示动画。

转载于:https://www.cnblogs.com/xfgnongmin/p/10736401.html

android 图片解码显示流程相关推荐

  1. android图片解码显示,android 图片解码显示流程

    问题来源 android 可以在 gallery 里面显示内部存储的图片,支持 jpeg,png,gif,bmp 等,甚至文件类型和图片后缀名不一致,只要是图片文件就能显示,然后 git 只会显示第一 ...

  2. android 图片气泡,android图片上显示气泡消息

    经常需要在一个图片上面显示一个气泡,在气泡上面显示消息的数量.这里提供一种方法,直接设置textview的背景色,并且设置textview的文本信息. xmlns:tools="http:/ ...

  3. Android APN的显示流程源代码分析

    一.名词介绍 1.PLMN(Public Land Mobile Network,公共陆地移动网络)由政府或它所批准的经营者,为公众提供陆地移动通信业务目的而建立和经营的网络.一句话:一个移动通信网络 ...

  4. ThumbnailUtils.extractThumbnail Android图片缩略图显示总结及比较

    博客源址:Android图片缩放总结及比较 博客时间:2011-08-01 17:42 在Android中对大图片进行缩放真的很不尽如人意,不知道是不是我的方法不对.下面我列出3种对图片缩放的方法,并 ...

  5. Android 图片黑白显示 自定义饱和度

    Android 自定义显示黑白色图片 1.先下载下来需要显示的图片(或头像) 我模拟下,将图片放到assert文件夹下,拿到他的InputStream.代码如下: 1 InputStream in = ...

  6. android 图片百分比显示,Android编程实现等比例显示图片的方法

    本文实例讲述了Android编程实现等比例显示图片的方法.分享给大家供大家参考,具体如下: 在android中,由于密度的影响,如果想得到图片的宽高是不行的,具体为什么我就大概说一下,具体的请搜索度娘 ...

  7. android屏幕旋转显示流程

    PAD默认屏幕显示方向是竖着显示,改成默认横屏显示需要将屏幕的默认显示方向顺时针旋转90度. android显示系统的核心是surfaceflinger,它为所有的应用程序提供显示服务,它能够将各种应 ...

  8. Android 图片缩略图显示

    //通过openRawResource获取一个inputStream对象InputStream inputStream = getResources().openRawResource(R.drawa ...

  9. 【Android SDM660源码分析】- 03 - UEFI XBL GraphicsOutput BMP图片显示流程

    [Android SDM660源码分析]- 03 - UEFI XBL GraphicsOutput BMP图片显示流程 1. GraphicsOutput.h 2. 显示驱动初化 DisplayDx ...

最新文章

  1. Calabash探索3-Calabash进阶
  2. .Net Core 项目引用本地类库方式(二)
  3. Python编程基础:第三节 字符串方法String Methods
  4. Xilinx FPGA PLL 资源与INTEL FPGA PLL资源locked信号的不同
  5. 英语口语-文章朗读Week10 Wednesday
  6. arp 华为 查看 路由器_华为路由器运行状态查看-路由器
  7. 计算机的工作原理是二进制原理吗,电子计算机的工作原理基于二进制。()
  8. 索引更新:刚发布的文章就能被搜到,这是怎么做到的?
  9. JavaScript的对象观
  10. 操作系统原理与实践-1熟悉实验环境
  11. WinXP系统连接网络教程
  12. heic转换成jpg,学会这个方法就够了
  13. 关于笔记本双显卡状态下独立显卡的配置问题
  14. 面试通过了,也给了Offer,不去有什么后果?
  15. 【Windows】中DOMAIN域
  16. 在MNIST数据集上训练一个手写数字识别模型
  17. Unity动画机制 Animator与Animator Controller教程
  18. 如何发现「将死」的ReLu?可视化工具TensorBoard助你一臂之力
  19. 5V转3.3V的N种方法
  20. 手机连接无线没有网络连接到服务器是怎么回事啊,手机连接WIFI后无法上网,是怎么回事?...

热门文章

  1. 2-9 彩虹瓶 (20 分)
  2. 爱签电子合同助力房产交易电子化
  3. HDU 1010 Tempter of the Bone heuristic 剪枝法
  4. 新钛云服数字化转型服务案例入选Forrester报告!
  5. 二层业务之vlan mapping dot1q tunnel
  6. Kubernetes【升级】 CKS 2021【11】---Cluster Hardening - Upgrade Kubernetes
  7. 思科精锐SG220开启snmp命令详解
  8. dos重启计算机命令行,命令行中,重启计算机的命令是什么
  9. 毫无保留,这是我全部的嵌入式学习秋招经验!
  10. 西门子Wincc+S7-300污水处理大项目 带西门子Wincc上位机+S7-300程序