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

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 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 的显示处理,所以能够显示动画。

最新文章

  1. KMP匹配算法 - Number Sequence
  2. C#基础01
  3. li标签包含img的问题
  4. unittest框架介绍
  5. ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境(转)
  6. jdbc的通讯录CRUD
  7. Linux下c/c++项目代码覆盖率的产生方法
  8. UVa 1395 (最小生成树) Slim Span
  9. Java总结之容器
  10. 通信协议:HTTP、TCP、UDP(转)
  11. 数据集下载 MNIST
  12. java 打开浏览器 url
  13. GameUnity 2.0 文档(三) 纸片人八方向
  14. C++开发python windows版本的扩展模块示例
  15. 测试系统工程师TSE的职责与培养
  16. 笔记二:常用的h5语义化标签
  17. tk简单使用
  18. Nginx+IIS分布式部署和负载均衡
  19. 开发常见错误之 : Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar
  20. 让 ScrollViewer 的滚动带上动画

热门文章

  1. Maven部署web应用到远程服务器
  2. matplotlib.pyplot 绘制图形
  3. JavaScript In OA Framework
  4. PHP:第四章——PHP数组添加,删除,插入,分割,合并,及运算符
  5. UVSLive 6324 求射箭覆盖的期望
  6. Hive时间函数笔记
  7. 2.1 C++类的定义和声明
  8. 迁移HTML5移动项目到PhoneGap
  9. DevExpress v17.2新版亮点—WPF篇(六)
  10. Individual work 总结