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();
}
}