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

本文实例为大家分享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();
    }

  }
}

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, Movie
Gif格式图片
android movie gif、android展示gif图片、android 展示gif、gif movie gear、gif movie gear怎么用,以便于您获取更多的相关知识。

时间: 2024-09-30 17:16:34

Android通过Movie展示Gif格式图片_Android的相关文章

Android生成带圆角的Bitmap图片_Android

本文实例讲述了Android生成带圆角的Bitmap图片.分享给大家供大家参考.具体如下: 有时候我们在开发Android应用时,会遇到圆角图片的问题,那么,我们如何在Android中用代码来生成圆角Bitmap图片呢?下面这段代码也许能够帮到你. 该方法主要用到了drawRoundRect来画圆角矩形,然后通过drawBitmap来画图片. //生成圆角图片 public static Bitmap GetRoundedCornerBitmap(Bitmap bitmap) { try { B

Android使用okHttp(get方式)下载图片_Android

一.首先下载Jar包 https://github.com/square/okhttp  如果使用android studio只需要加入依赖compile 'com.squareup.okhttp3:okhttp:3.2.0'   二.下载一张图片并显示使用的是hanlder的方式  package com.liunan.okhttpdemo2; import android.graphics.Bitmap; import android.graphics.BitmapFactory; impo

最近较流行的效果 Android自定义View实现倾斜列表/图片_Android

先看看效果图: 实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果 代码实现: 1.定义属性 在values文件夹下的attrs文件添加以下代码 <resources> <declare-styleable name="TiltView"> <attr name="type" format="integer" /> </declare-styleable> </resources>

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

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

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

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

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

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

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

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

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

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

Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍_Android

主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果:第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似.本文分析 Tween动画的rotate实现旋转效果. 在新浪微博客户端中各个操作进行中时activity的右上角都会有个不停旋转的图标,类似刷新的效果,给用户以操作中的提示.这种非模态的提示方式推荐使用,那么下面就分享下如何实现这种效果