gif播放

一,源碼android

public class GifMovieView extends View {

   private static final int DEFAULT_MOVIEW_DURATION = 1000;

   private int mMovieResourceId;
   private Movie mMovie;

   private long mMovieStart;
   private int mCurrentAnimationTime = 0;

   private float mLeft;
   private float mTop;

   private float mScale;

   private int mMeasuredMovieWidth;
   private int mMeasuredMovieHeight;

   private volatile boolean mPaused = false;
   private boolean mVisible = true;

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

   public GifMovieView(Context context, AttributeSet attrs) {
      this(context, attrs, R.styleable.CustomTheme_gifMoviewViewStyle);
   }

   public GifMovieView(Context context, AttributeSet attrs, int defStyle) {
      super(context, attrs, defStyle);

      setViewAttributes(context, attrs, defStyle);
   }

   private void setViewAttributes(Context context, AttributeSet attrs, int defStyle) {

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
         setLayerType(View.LAYER_TYPE_SOFTWARE, null);
      }

      final TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.GifMoviewView, defStyle,
            R.style.Widget_GifMoviewView);

      mMovieResourceId = array.getResourceId(R.styleable.GifMoviewView_gif, -1);
      mPaused = array.getBoolean(R.styleable.GifMoviewView_paused, false);

      array.recycle();

      if (mMovieResourceId != -1) {
         mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
      }
   }

   public void setMovieResource(int movieResId) {
      this.mMovieResourceId = movieResId;
      mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
      requestLayout();
   }

   public void setMovie(Movie movie) {
      this.mMovie = movie;
      requestLayout();
   }

   public Movie getMovie() {
      return mMovie;
   }

   public void setMovieTime(int time) {
      mCurrentAnimationTime = time;
      invalidate();
   }

   public void setPaused(boolean paused) {
      this.mPaused = paused;

      if (!paused) {
         mMovieStart = android.os.SystemClock.uptimeMillis() - mCurrentAnimationTime;
      }

      invalidate();
   }

   public boolean isPaused() {
      return this.mPaused;
   }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

      if (mMovie != null) {
         int movieWidth = mMovie.width();
         int movieHeight = mMovie.height();

         float scaleH = 1f;
         int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);

         if (measureModeWidth != MeasureSpec.UNSPECIFIED) {
            int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);
            if (movieWidth > maximumWidth) {
               scaleH = (float) movieWidth / (float) maximumWidth;
            }
         }

         float scaleW = 1f;
         int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);

         if (measureModeHeight != MeasureSpec.UNSPECIFIED) {
            int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);
            if (movieHeight > maximumHeight) {
               scaleW = (float) movieHeight / (float) maximumHeight;
            }
         }

         mScale = 1f / Math.max(scaleH, scaleW);

         mMeasuredMovieWidth = (int) (movieWidth * mScale);
         mMeasuredMovieHeight = (int) (movieHeight * mScale);

         setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);

      } else {
         setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
      }
   }

   @Override
   protected void onLayout(boolean changed, int l, int t, int r, int b) {
      super.onLayout(changed, l, t, r, b);

      mLeft = (getWidth() - mMeasuredMovieWidth) / 2f;
      mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
      
      mVisible = getVisibility() == View.VISIBLE;
   }

   @Override
   protected void onDraw(Canvas canvas) {
      if (mMovie != null) {
         if (!mPaused) {
            updateAnimationTime();
            drawMovieFrame(canvas);
            invalidateView();
         } else {
            drawMovieFrame(canvas);
         }
      }
   }

   @SuppressLint("NewApi")
   private void invalidateView() {
      if(mVisible) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            postInvalidateOnAnimation();
         } else {
            invalidate();
         }
      }
   }

   private void updateAnimationTime() {
      long now = android.os.SystemClock.uptimeMillis();

      if (mMovieStart == 0) {
         mMovieStart = now;
      }

      int dur = mMovie.duration();

      if (dur == 0) {
         dur = DEFAULT_MOVIEW_DURATION;
      }

      mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
   }

   @SuppressLint("WrongConstant")
   private void drawMovieFrame(Canvas canvas) {

      mMovie.setTime(mCurrentAnimationTime);

      canvas.save(Canvas.MATRIX_SAVE_FLAG);
      canvas.scale(mScale, mScale);
      mMovie.draw(canvas, mLeft / mScale, mTop / mScale);
      canvas.restore();
   }
   
   @SuppressLint("NewApi")
   @Override
   public void onScreenStateChanged(int screenState) {
      super.onScreenStateChanged(screenState);
      mVisible = screenState == SCREEN_STATE_ON;
      invalidateView();
   }
   
   @SuppressLint("NewApi")
   @Override
   protected void onVisibilityChanged(View changedView, int visibility) {
      super.onVisibilityChanged(changedView, visibility);
      mVisible = visibility == View.VISIBLE;
      invalidateView();
   }
   
   @Override
   protected void onWindowVisibilityChanged(int visibility) {
      super.onWindowVisibilityChanged(visibility);
      mVisible = visibility == View.VISIBLE;
      invalidateView();
   }
}

在styles.xml下面canvas

<declare-styleable name="GifMoviewView">
    <attr name="gif" format="reference" />
    <attr name="paused" format="boolean" />
</declare-styleable>
<declare-styleable name="CustomTheme">
    <attr name="gifMoviewViewStyle" format="reference" />
</declare-styleable>

而後佈局app

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/home_bj"
    tools:context="com.hatai.smartlokey.SplashActivity">

    <com.hatai.smartlokey.utils.widget.GifMovieView
        android:id="@+id/iv_splash"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onGifClick"
        tools:ignore="OnClick" />
</RelativeLayout>

在界面上面ide

package com.hatai.smartlokey;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import com.hatai.smartlokey.base.BaseActivity;
import com.hatai.smartlokey.base.MvpActivity;
import com.hatai.smartlokey.modules.splash.presenter.SplashPresenter;
import com.hatai.smartlokey.modules.splash.view.SplashView;
import com.hatai.smartlokey.utils.SmButton;
import com.hatai.smartlokey.utils.widget.GifMovieView;

public class SplashActivity extends MvpActivity<SplashView,SplashPresenter>implements SplashView
{

    private GifMovieView iv_splash;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        mvpPresenter.getVideoInto();
        initView();
    }

    @Override
    protected SplashPresenter createPresenter() {
        return new SplashPresenter();
    }


    private void initView()
    {
        iv_splash= (GifMovieView) findViewById(R.id.iv_splash);
        iv_splash.setMovieResource(R.mipmap.sm_video_all);
        iv_splash.setOnClickListener(new SmButton.OnSmClickListener() {
            @Override
            public void onSmClick(View v) {
                Intent intent=new Intent(SplashActivity.this,MainActivity.class);
                SplashActivity.this.startActivity(intent);
                SplashActivity.this.finish();
            }
        });
    }

    @Override
    public void getDataHttp(String data) {
        Log.e("data_video","video=="+data);
    }

    @Override
    public void getDataHttpFail(String msg) {

    }
}
相關文章
相關標籤/搜索