Android通过Movie展示Gif格式图片

本文实例为大家分享Android通过Movie展示Gif格式图片的相关代码,供大家参考,具体内容如下

public class CommonGifView extends View {
  private Resources mResources;
  private Movie mMovie;
  private long startTime = 0;
  private float widthRatio;
  private float heightRatio;

  public CommonGifView(Context context) {
    this(context, null);
  }

  public CommonGifView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public CommonGifView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    mResources = context.getResources();
    TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.custom_gif_view);
    int src_id = ta.getResourceId(R.styleable.custom_gif_view_gif_src, -1);
    setGifViewBg(src_id);
    ta.recycle();
  }

  /**
   * 为View设置gif格式图片背景
   * @description:
   * @author ldm
   * @date 2016-2-18 上午9:21:16
   */
  private void setGifViewBg(int src_id) {
    if (src_id == -1) { return; }
    // 获取对应资源文件的输入流
    InputStream is = mResources.openRawResource(src_id);
    mMovie = Movie.decodeStream(is);// 解码输入流为Movie对象
    requestLayout();
  }

  /*
   * 这个方法供Activity中使用
   */
  public void setGifStream(InputStream is) {
    mMovie = Movie.decodeStream(is);
    requestLayout();
  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    long now = SystemClock.uptimeMillis();
    if (startTime == 0) { // 如果第一帧,记录起始时间
      startTime = now;
    }
    if (mMovie != null) {// 如果返回值不等于null,就说明这是一个GIF图片
      int duration = mMovie.duration();// 取出动画的时长
      if (duration == 0) {
        duration = 1000;
      }
      int currentTime = (int) ((now - startTime) % duration);// 算出需要显示第几帧
      mMovie.setTime(currentTime);
      // mMovie.draw(canvas, getWidth() - mMovie.width(), getHeight() - mMovie.height());
      float scale = Math.min(widthRatio, heightRatio);
      canvas.scale(scale, scale);
      mMovie.draw(canvas, 0, 0);
      invalidate();
    }
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if (mMovie != null) {// 如果返回值不等于null,就说明这是一个GIF图片
      int w = mMovie.width();//宽度
      int h = mMovie.height();//高度
      if (w <= 0) {
        w = 1;
      }
      if (h <= 0) {
        h = 1;
      }
      int left = getPaddingLeft();
      int right = getPaddingRight();
      int top = getPaddingTop();
      int bottom = getPaddingBottom();
      int widthSize, heightSize;
      w += left + right;
      h += top + bottom;
      w = Math.max(w, getSuggestedMinimumWidth());
      h = Math.max(h, getSuggestedMinimumHeight());
      widthSize = resolveSizeAndState(w, widthMeasureSpec, 0);//根据你提供的大小和MeasureSpec,返回你想要的大小值
      heightSize = resolveSizeAndState(h, heightMeasureSpec, 0);
      widthRatio = (float) widthSize / w;
      heightRatio = (float) heightSize / h;
      setMeasuredDimension(widthSize, heightSize);
    }
    else {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
  }
}

自定义属性res/values/attrs.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <declare-styleable name="custom_gif_view">
    <attr name="gif_src" format="reference"></attr>
  </declare-styleable>

</resources>

在Activity中使用:

public class MainActivity extends Activity {
  private CommonGifView view;
  private InputStream is;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    view = (CommonGifView) findViewById(R.id.gif_test);
    try {
      is = getAssets().open("test01.gif");
      view.setGifStream(is);
    }
    catch (IOException e) {
      e.printStackTrace();
    }

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • android播放gif格式图片示例

    复制代码 代码如下: import android.content.Context;import android.graphics.Canvas;import android.graphics.Movie;import android.util.AttributeSet;import android.view.View;import android.view.ViewGroup.LayoutParams; import com.nmbs.R; public class GifView exten

  • Android 录制手机屏幕视频生成GIF图片实例详解

    Android 录制手机屏幕视频生成GIF图片实例详解 无图无真相,在我们日常的网络交流中往往需要给交流对象提供直观的显示,而视频是一个很好的方式,但是视频需要播放器,还需要当做文件进行对点传输,并不是很方便.想CSDN这样的博客网站也并不支持在博客里放视频这种方式,除非你贴外链,太烦了不是么.最好是如下图这种gif方式,直观 今天来教大家一个易操作的录制方式.当然,一般只适合Android开发者.因为你需要有AndroidStudio 工具 AndroidStudio(完成手机屏幕的视频录制,

  • Android下录制App操作生成Gif动态图的全过程

    Android App开发完了,自然希望录个gif做个展示.视频也可以做展示,但是需要上传到优酷.土豆等等,而且本来就十几秒的App演示操作过程,视频网站的广告就要一分钟,没有gif轻量简单省流量. 下图是我录制的一个短信消灭器应用的效果图: 本文教大家如何录制gif,分享给大家供大家参考,具体内容如下 思路 生成gif的思路是两步 1.把App操作过程录制成视频 2.根据视频转换成Gif 目前网上录制GIf的思路也基本都是分为这2步,不知道有没有更好的方法,一步就生成gif动态的? 利用adb

  • Android中GIF动图的播放控制和监听详解

    前言 最近接手的项目里涉及到了 GIF 动图的播放与监听,在上一版本中对于 GIF 的处理是由 H5 来实现的,因为考虑到用户体验,因此现在的需求是将这块儿原生化,途中差点误入歧途!下面来看看详细的介绍吧. Android 中 GIF 动图处理与监听 刚开始第一个想到的便是 glide , 但是自认为 glide 不能够控制 GIF 以及去监听它,所以网上去搜寻别的方法.看到有一个方案是将图片分帧,一张张的去用逐帧动画来实现. 我开始怀疑给这个解决方案的人了,都什么时代了还做这种费力不讨好,大量

  • Android 加载GIF图最佳实践方案

    起因 最近在项目中遇到需要在界面上显示一个本地的 GIF 图.按照惯例我直接用了 Glide 框架来实现. Glide 地址: https://github.com/bumptech/glide 我用的 Glide版本为 4.0.0-RC1 , 具体的实现代码如下: Glide.with( this ).asGif().load( R.drawable.yiba_location ).into( location_image ) ; 运行的效果很卡顿,我怀疑是不是方法没有用对,调了压缩模式,还是

  • android 显示gif图片实例详解

    在android中不支持gif格式的图片,但是由于我希望在我的程序中刚刚加载的时候有一个小人在跑步表示正在加载.而这个小人跑就是一个gif图片.也就是希望程序一启动时就加载gif图片.在网上查找了一些方法不知道是我使用的android的版本高(android4.4)还是什么问题就是加载不出来.最后想了一个办法加载了出来.这个办法就是将gif放在webView中让其显示. 下面是关于这个的代码: activity_prepare_fullscreen.xml文件 <RelativeLayout x

  • Android通过Movie展示Gif格式图片

    本文实例为大家分享Android通过Movie展示Gif格式图片的相关代码,供大家参考,具体内容如下 public class CommonGifView extends View { private Resources mResources; private Movie mMovie; private long startTime = 0; private float widthRatio; private float heightRatio; public CommonGifView(Con

  • 在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('cat.jpg') # 这里需要我们在当前目录下放一张名为cat.jpg的文件 img.tofile('cat.raw') #利用numpy中array的函数tofile将数据写入文件 #这时我们发现当前目录下新增了一个文件,名为cat.raw 有了raw文件,我们就可以读取这个文件,并显示出来. #

  • Android拍照或从图库选择图片并裁剪

    今天看<第一行代码>上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo. 一. 拍照选择图片 1.使用隐式Intent启动相机 //构建隐式Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机 startActivityForResult(intent, 1); 2.处理相机拍照返回的结果 //用户点击了取消 if(data == n

  • Android实现从缓存中读取图片与异步加载功能类

    本文实例讲述了Android实现从缓存中读取图片与异步加载功能类.分享给大家供大家参考,具体如下: 在新浪微博的微博列表中的图片,为了加速其显示也为了加快程序的响应,可以参考该图片异步加载类实现. public class AsyncImageLoader { //SoftReference是软引用,是为了更好的为了系统回收变量 private HashMap<String, SoftReference<Drawable>> imageCache; public AsyncImag

  • Android仿微信朋友圈添加图片的实例代码

    老习惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧! 在项目中这种添加图片上传的效果应该是非常常见的,后面有个添加的按钮应该让有些童鞋不知道咋办了吧,其实没那么复杂,通过GridView就可以实现了 先说明一下,这里主要是讲添加图片的效果,至于图片选择器用的是第三方库photopicker,6.0权限用的是第三方库EasyPermission 1.首先这是用GridView实现的 <?xml version="1.0"

  • Android异步加载数据和图片的保存思路详解

    把从网络获取的图片数据保存在SD卡上, 先把权限都加上 网络权限 android.permission.INTERNET SD卡读写权限 android.permission.MOUNT_UNMOUNT_FILESYSTEMS android.permission.WRITE_EXTERNAL_STORAGE 总体布局 写界面,使用ListView,创建条目的布局文件,水平摆放的ImageView TextView 在activity中获取到ListView对象,调用setAdapter()方法

  • Android开发之使用ViewPager实现图片左右滑动切换效果

    Android中图片的左右切换随处可见,今天我也试着查阅资料试着做了一下,挺简单的一个小Demo,却也发现了一些问题,话不多说,上代码~: 使用了3个xml文件作为ViewPager的滑动page,布局都是相同的,如下只展示其中之一: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/

  • Android手势滑动实现ImageView缩放图片大小

    本文推出了两种Android手势实现ImageView缩放图片大小的方法,分享给大家供大家参考,具体内容如下 方法一: 将以下代码写到MulitPointTouchListener.java中,然后对你相应的图片进行OnTouchListener. 例如:imageView.setOnTouchListener(new MulitPointTouchListener ()); 在xml中要将ImageView的缩放格式改成Matrix 例如:android:scaleType="matrix&q

  • Android实现TextView显示HTML加图片的方法

    本文实例讲述了Android实现TextView显示HTML加图片的方法.分享给大家供大家参考,具体如下: TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运行,则不能显示图片,只显示小方框. 究其原因,是在4.0的系统上执行的时候报错了,异常是:Android.os.NetworkOnMainThreadException 经过查文档,原来是4.

  • android自定义Camera拍照并查看图片

    本文实例为大家分享了android自定义Camera拍照并查看图片的具体代码,供大家参考,具体内容如下 1.打开相机 a.预览拍摄图片,需用到SurfaceView,并且实现其回调函数implements SurfaceHolder.Callback: activity_camera.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

随机推荐