问题来源

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 information

ContentResolver.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 的显示处理,所以可以显示动画。

原文:http://blog.csdn.net/jingxia2008/article/details/32327699

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

  1. android 图片转base64内存变大了_开发者最喜爱的图片编码格式:opencv编码,解码,显示base64图片...

    由于图片格式尺寸较大,在互联网上若想传递一张图片,往往会 把图片进行格式转换,然后进行数据传输,图片格式往往会转换为base64编码图片 base64编码图片 BASE64编码表 base64编码 是 ...

  2. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库解码 WebP 图片 )

    文章目录 一.Android 中使用 libwebp.so 库解码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库解码 WebP 图片 libwe ...

  3. gif android 点击 加载,android 加载显示gif图片的解决方案

    使用方法: 1-把GifView.jar加入你的项目. 2-在xml中配置GifView的基本属性,GifView继承自View类,和Button.ImageView一样是一个UI控件.如: andr ...

  4. android listview网络图片,Android ListView从网络获取图片及文字显示

    上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...

  5. android图片系统解决方案-从采集到显示

    概述 Android上图片涉及到的要点: 基础 自定义相机拍照 调用系统相机拍照 图片选择 裁剪 压缩 上传 服务端处理与下载 显示与内存-普通图与超大图 文件夹管理 内置图片管理与包大小 基础 颜色 ...

  6. Android ListView从网络获取图片及文字显示

    原帖地址:http://blog.csdn.net/wangjinyu501/article/details/8219317 上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从 ...

  7. Android 高效显示Bitmap图片

    Android 高效显示Bitmap图片 本文会介绍一些处理与加载Bitmap对象的常用方法,这些技术能够使得程序的UI不会被阻塞,并且可以避免程序超出内存限制.如果我们不注意这些,Bitmap会迅速 ...

  8. android 怎么播放gif图片不显示,android 播放gif动态图片

    android不推荐使用gif图片,一般都是png的,对于gif的图片解析比较消耗资源,但是对于一些动态gif图片的播放,如果比较小的话还是可以的,要是大的话,建议还是把gif图片转换成一帧一帧的pn ...

  9. android高仿微信UI点击头像显示大图片效果

    用过微信的朋友朋友都见过微信中点击对方头像显示会加载大图,先贴两张图片说明下: 这种UI效果对用户的体验不错,今天突然有了灵感,试着去实现,结果就出来了.. 下面说说我的思路: 1.点击图片时跳转到另 ...

最新文章

  1. 为什么AI感知与人类感知无法直接比较?
  2. mysql ldf文件太大_sqlserver 2008R2 数据库文件过大解决办法
  3. JAVA语言中的反射机制
  4. 如何在生产环境下用好EFCore
  5. maximum mean discrepancy
  6. x = x+1,x+=1,x++那个的执行效率高
  7. java 泛型 擦除_Java泛型和类型擦除
  8. 诺顿误杀真相之“为什么诺顿会误杀中文windows”
  9. 【阿里云镜像】配置阿里巴巴开源镜像站镜像——Epel镜像
  10. mysql jpa 批注 视图_JPA 批注参考
  11. c语言 simon 游戏,汉语课堂教学游戏推荐(上)
  12. 数学一年级应用题_小学一年级数学下册应用题练习题归纳
  13. 2022-12-11 第 323 场周赛
  14. Intellij IDEA使用经验(八):快速批量替换
  15. 【UR机械臂CB3 网络课程 】
  16. ZCU102制作PYNQ v2.7镜像
  17. 如何安装和使用SimSo模拟器
  18. 电脑抓取手机包与笔记本wifi热点设置
  19. [小程序] 获取用户头像以及昵称
  20. 灰色关联分析(Grey Relational Analysis, GRA)

热门文章

  1. 面向对象编程-鸵鸟到底是不是鸟?企鹅是不是鸟?
  2. c语言 单词变复数_DEV-C++中编写了一段C程序,其中设置了用文件进行... 请编一个程序,可以将英语规则名词由单数变成复数......
  3. vue中使用better-scroll实现左右菜单联动效果
  4. Spring学习第二天
  5. 鸿蒙系统对家庭,华为:鸿蒙系统远不止手机能用,目标是3亿台
  6. 关于printf(%p,p);使用方法的一些总结
  7. python源码学习系列一
  8. 全自动领取天猫双11优惠券教程!
  9. UVA 492 Pig-Latin
  10. word中设置页眉和页脚、页码,删除或者修改前几页或者特定几页的页眉和页脚、页码