代码很简单一看就明白怎么回事。直接打码,主要是记录以备不时之需;


布局文件

            


activity:

public class MainActivity extends FragmentActivity implements OnClickListener {private AnimatedGifImageView animatedGifImageView;boolean switchMe = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_gif_main);animatedGifImageView = ((AnimatedGifImageView)findViewById(R.id.animatedGifImageView));animatedGifImageView.setAnimatedGif(R.raw.animated_gif,TYPE.FIT_CENTER);((Button) findViewById(R.id.button1)).setOnClickListener(this);switchMe = true;}@Overridepublic void onClick(View v) {if (!switchMe)animatedGifImageView.setAnimatedGif(R.raw.test,TYPE.FIT_CENTER);elseanimatedGifImageView.setImageResource(R.drawable.ic_launcher);switchMe = !switchMe;}}
public class AnimatedGifImageView extends ImageView {public static enum TYPE {FIT_CENTER, STREACH_TO_FIT, AS_IS};public AnimatedGifImageView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);}public AnimatedGifImageView(Context context, AttributeSet attrs) {super(context, attrs);}public AnimatedGifImageView(Context context) {super(context);}boolean animatedGifImage = false;private InputStream is = null;private Movie mMovie = null;private long mMovieStart = 0;private TYPE mType = TYPE.FIT_CENTER;public void setAnimatedGif(int rawResourceId, TYPE streachType) {setImageBitmap(null);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {setLayerType(View.LAYER_TYPE_SOFTWARE, null);}mType = streachType;animatedGifImage = true;is = getContext().getResources().openRawResource(rawResourceId);try {mMovie = Movie.decodeStream(is);} catch (Exception e) {e.printStackTrace();byte[] array = streamToBytes(is);mMovie = Movie.decodeByteArray(array, 0, array.length);}p = new Paint();}public void setAnimatedGif(String filePath, TYPE streachType) throws FileNotFoundException {setImageBitmap(null);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {setLayerType(View.LAYER_TYPE_SOFTWARE, null);}mType = streachType;animatedGifImage = true;InputStream is;try {mMovie = Movie.decodeFile(filePath);} catch (Exception e) {e.printStackTrace();is = new FileInputStream(filePath);byte[] array = streamToBytes(is);mMovie = Movie.decodeByteArray(array, 0, array.length);}p = new Paint();}public void setAnimatedGif(byte[] byteArray, TYPE streachType) throws FileNotFoundException {setImageBitmap(null);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {setLayerType(View.LAYER_TYPE_SOFTWARE, null);}mType = streachType;animatedGifImage = true;try {mMovie = Movie.decodeByteArray(byteArray, 0, byteArray.length);} catch (Exception e) {e.printStackTrace();}p = new Paint();}@Overridepublic void setImageResource(int resId) {animatedGifImage = false;super.setImageResource(resId);}@Overridepublic void setImageURI(Uri uri) {animatedGifImage = false;super.setImageURI(uri);}@Overridepublic void setImageDrawable(Drawable drawable) {animatedGifImage = false;super.setImageDrawable(drawable);}Paint p;private float mScaleH = 1f, mScaleW = 1f;private int mMeasuredMovieWidth;private int mMeasuredMovieHeight;private float mLeft;private float mTop;private static byte[] streamToBytes(InputStream is) {ByteArrayOutputStream os = new ByteArrayOutputStream(1024);byte[] buffer = new byte[1024];int len;try {while ((len = is.read(buffer)) >= 0) {os.write(buffer, 0, len);}} catch (java.io.IOException e) {}return os.toByteArray();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mMovie != null) {int movieWidth = mMovie.width();int movieHeight = mMovie.height();/* * Calculate horizontal scaling */int measureModeWidth = MeasureSpec.getMode(widthMeasureSpec);float scaleW = 1f, scaleH = 1f;if (measureModeWidth != MeasureSpec.UNSPECIFIED) {int maximumWidth = MeasureSpec.getSize(widthMeasureSpec);if (movieWidth > maximumWidth) {scaleW = (float) movieWidth / (float) maximumWidth;} else {scaleW = (float) maximumWidth / (float) movieWidth;}}/* * calculate vertical scaling */int measureModeHeight = MeasureSpec.getMode(heightMeasureSpec);if (measureModeHeight != MeasureSpec.UNSPECIFIED) {int maximumHeight = MeasureSpec.getSize(heightMeasureSpec);if (movieHeight > maximumHeight) {scaleH = (float) movieHeight / (float) maximumHeight;} else {scaleH = (float) maximumHeight / (float) movieHeight;}}/* * calculate overall scale */switch (mType) {case FIT_CENTER:mScaleH = mScaleW = Math.min(scaleH, scaleW);break;case AS_IS:mScaleH = mScaleW = 1f;break;case STREACH_TO_FIT:mScaleH = scaleH;mScaleW = scaleW;break;}mMeasuredMovieWidth = (int) (movieWidth * mScaleW);mMeasuredMovieHeight = (int) (movieHeight * mScaleH);setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);} else {setMeasuredDimension(getSuggestedMinimumWidth(),getSuggestedMinimumHeight());}}@Overrideprotected 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;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if (animatedGifImage) {long now = android.os.SystemClock.uptimeMillis();if (mMovieStart == 0) { // first timemMovieStart = now;}if (mMovie != null) {p.setAntiAlias(true);int dur = mMovie.duration();if (dur == 0) {dur = 1000;}int relTime = (int) ((now - mMovieStart) % dur);mMovie.setTime(relTime);canvas.save(Canvas.MATRIX_SAVE_FLAG);canvas.scale(mScaleW, mScaleH);mMovie.draw(canvas, mLeft / mScaleW, mTop / mScaleH);canvas.restore();invalidate();}}}}


更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. Android(安卓)Timer 更好方法
  4. Android(安卓)Studio NDK开发浅谈
  5. Android(安卓)编译环境搭建
  6. Android(安卓)制定的ROM包(文件系统根目录结构分析)
  7. googleMap----放大,缩小,东南西北,四种视图切换代码
  8. android wav 去头信息转化成pcm 格式数据
  9. Android(安卓)ListView 最后一行分割线不显示

随机推荐

  1. Android(安卓)你的OnTouchEvent() 触屏事
  2. android 为TextView的部分文字设置超链接
  3. Android(安卓)AES 文件加密解密
  4. android 计时器,倒计时
  5. osg for android 学习之三:老外的步骤,包括
  6. 封装Android(安卓)Volley请求工具
  7. android activity半透明
  8. 【Android】Toast显示乱码解决办法
  9. Android连接远程服务器
  10. android kernel 初始化 2