android的gif,android gif动画

packagecom.bamasoso.user.view;

importandroid.annotation.SuppressLint;

importandroid.content.Context;

importandroid.content.res.TypedArray;

importandroid.graphics.Canvas;

importandroid.graphics.Movie;

importandroid.os.Build;

importandroid.util.AttributeSet;

importandroid.view.View;

importcom.bamasoso.user.R;

public classGifView extendsView {

/*** 默认为1秒*/private static final intDEFAULT_MOVIE_DURATION= 1000;

private intmMovieResourceId;

privateMovie mMovie;

private longmMovieStart;

private intmCurrentAnimationTime= 0;

private floatmLeft;

private floatmTop;

private floatmScale;

private intmMeasuredMovieWidth;

private intmMeasuredMovieHeight;

private booleanmVisible= true;

private volatile booleanmPaused= false;

publicGifView(Context context) {

this(context, null);

}

publicGifView(Context context, AttributeSet attrs) {

this(context, attrs, R.styleable.CustomTheme_gifViewStyle);

}

publicGifView(Context context, AttributeSet attrs, intdefStyle) {

super(context, attrs, defStyle);

setViewAttributes(context, attrs, defStyle);

}

@SuppressLint("NewApi")

private voidsetViewAttributes(Context context, AttributeSet attrs,

intdefStyle) {

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.HONEYCOMB) {

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

}

// 从描述文件中读出gif的值,创建出Movie实例finalTypedArray array = context.obtainStyledAttributes(attrs,

R.styleable.GifView, defStyle, R.style.Widget_GifView);

mMovieResourceId= array.getResourceId(R.styleable.GifView_gif, -1);

mPaused= array.getBoolean(R.styleable.GifView_paused, false);

array.recycle();

if(mMovieResourceId!= -1) {

mMovie= Movie.decodeStream(getResources().openRawResource(

mMovieResourceId));

}

}

/*** 设置gif图资源**@parammovieResId*/public voidsetMovieResource(intmovieResId) {

this.mMovieResourceId= movieResId;

mMovie= Movie.decodeStream(getResources().openRawResource(

mMovieResourceId));

requestLayout();

}

public voidsetMovie(Movie movie) {

this.mMovie= movie;

requestLayout();

}

publicMovie getMovie() {

returnmMovie;

}

public voidsetMovieTime(inttime) {

mCurrentAnimationTime= time;

invalidate();

}

/*** 设置暂停**@parampaused*/public voidsetPaused(booleanpaused) {

this.mPaused= paused;

if(!paused) {

mMovieStart= android.os.SystemClock.uptimeMillis()

- mCurrentAnimationTime;

}

invalidate();

}

/*** 判断gif图是否停止了**@return*/public booleanisPaused() {

return this.mPaused;

}

@Overrideprotected voidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {

if(mMovie!= null) {

intmovieWidth = mMovie.width();

intmovieHeight = mMovie.height();

intmaximumWidth = MeasureSpec.getSize(widthMeasureSpec);

floatscaleW = (float) movieWidth / (float) maximumWidth;

mScale= 1f/ scaleW;

mMeasuredMovieWidth= maximumWidth;

mMeasuredMovieHeight= (int) (movieHeight * mScale);

setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieHeight);

} else{

setMeasuredDimension(getSuggestedMinimumWidth(),

getSuggestedMinimumHeight());

}

}

@Overrideprotected voidonLayout(booleanchanged, intl, intt, intr, intb) {

super.onLayout(changed, l, t, r, b);

mLeft= (getWidth() - mMeasuredMovieWidth) / 2f;

mTop= (getHeight() - mMeasuredMovieHeight) / 2f;

mVisible= getVisibility() == View.VISIBLE;

}

@Overrideprotected voidonDraw(Canvas canvas) {

if(mMovie!= null) {

if(!mPaused) {

updateAnimationTime();

drawMovieFrame(canvas);

invalidateView();

} else{

drawMovieFrame(canvas);

}

}

}

@SuppressLint("NewApi")

private voidinvalidateView() {

if(mVisible) {

if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.JELLY_BEAN) {

postInvalidateOnAnimation();

} else{

invalidate();

}

}

}

private voidupdateAnimationTime() {

longnow = android.os.SystemClock.uptimeMillis();

// 如果第一帧,记录起始时间if(mMovieStart== 0) {

mMovieStart= now;

}

// 取出动画的时长intdur = mMovie.duration();

if(dur == 0) {

dur = DEFAULT_MOVIE_DURATION;

}

// 算出需要显示第几帧mCurrentAnimationTime= (int) ((now - mMovieStart) % dur);

}

private voiddrawMovieFrame(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")

@Overridepublic voidonScreenStateChanged(intscreenState) {

super.onScreenStateChanged(screenState);

mVisible= screenState == SCREEN_STATE_ON;

invalidateView();

}

@SuppressLint("NewApi")

@Overrideprotected voidonVisibilityChanged(View changedView, intvisibility) {

super.onVisibilityChanged(changedView, visibility);

mVisible= visibility == View.VISIBLE;

invalidateView();

}

@Overrideprotected voidonWindowVisibilityChanged(intvisibility) {

super.onWindowVisibilityChanged(visibility);

mVisible= visibility == View.VISIBLE;

invalidateView();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值