Cómo mostrar animación gif en Canvas SWT
paquete net.loonggg.gif.view
importar net.loonggg. gif.annotation.SuppressLint;
importar android.content.Context;
importar android.content.res.TypedArray
importar android.graphics.GifView;
importar android.content.res.TypedArray;
importar android.graphics.GifView;
p>
2. personalice un GifView para mostrar imágenes gif. El código es el siguiente
import android.content.Context
import android.content.TypedArray; importar android.graphics.Canvas;
importar android.graphics.Movie;
importar android.os.Build
importar android.util. view.View;
clase pública GifView extiende Vista {
/**
* El valor predeterminado es 1 segundo
*/
int final estático privado DEFAULT_ MOVIE_DURATION = 1000;
int privado mMovieResourceId
película privada mMovie
p>
mMovieStart largo privado
mTop flotante privado
mScale flotante privado;
privado int mMeasuredMovieWidth;
privado int mMeasuredMovieHeight;
privado booleano mVisible = verdadero
privado volátil mPaused = falso; /p>
public GifView (contexto de contexto) {
this(context, null
}
public GifView (contexto de contexto, atributos AttributeSet); ) {
this(context, attrs, R.styleable.CustomTheme_gifViewStyle);
}
public GifView(Contexto c).
ontext, AttributeSet attrs. int defStyle) {
super(contexto, atributos, defStyle);
setViewAttributes(contexto, atributos, defStyle); /p>
@Styleable.
@SuppressLint("NewApi")
setViewAttributes privado vacío (contexto contexto, atributos AttributeSet,
int defStyle) {
if (Build.VERSION.SDK_INT gt; = Build.VERSION_CODES.HONEYCOMB) {
setLayerType(View.LAYER_TYPE_SOFTWARE, null); /p>
// Lee View.VERSION.SDK_INT gt; = Build.VERSION_CODES.HONEYCOMB.
// Lee el valor gif del archivo de descripción para crear una instancia de película
final TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.GifView, defStyle, R.style.Widget_GifView
mMovieResourceId = array.getResourceId(R. styleable.GifView_GifView);
R.styleable.GifView_Style = R.style.Widget_GifView
R.styleable.GifView_Style = R.style.Widget_GifView
mMovieResourceId = array.getResourceId(R.styleable.GifView_gif, -1);
mPaused = array.getBoolean(R.styleable.GifView_paused,
array.recycle()recycle); ();
if (mMovieResourceId ! = -1) {
mMovie = Movie.decodeStream(getResources().openRawResource(
mMovieResourceId)); /p>
}
}.
}
/**
* Establecer recurso gif
*
* @param movieResId
*/
public void setMovieResource(int movieResId) {
this.mMovieResourceId = mov
es decir,
mMovie = Movie.decodeStream(getResources().openRawResource(
mMovieResourceId));
requestLayout(); }
public void setMovieResource(int movieResId) {
this.
public void setMovie(Película) {
this.mMovie = película;
requestLayout();
}
película pública getMovie() {
this.mMovie = película
p>p>
this.mMovie = película;
this.mMovie = película;
this.}
public void setMovieTime( int tiempo) {
mCurrentAnimationTime = tiempo
invalidar();
}
/**
* setPaused
p>
*
* @param pausado
*/
public void setPaused(booleano pausado) {
this. mPaused = pausado
if (!paused) {
mMovieStart = android.os.SystemClock.uptimeMillis()
- mCurrentAnimationTime;
}
No válido.
invalidate();
}
/**
* Determinar si el gif se ha detenido
*
* @return
*/
public boolean isPaused() {
return this.mPaused
<; p > }@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (mMovie ! = null) {
int movieWidth = mMovie.width();
int movieHeight = mMovie.height();
int maxWidth = MeasureSpec.getSize( widthMeasureSpec
flotante escalaW = (flotante) movieWidth / (flotante) máximoAncho;
mScale = 1f / escalaW;
mMeasuredMovieWidth = máximoAncho
mMeasuredMovieHeight = (int) ( movieHeight * mScale);
setMeasuredDimension(mMeasuredMovieWidth, mMeasuredMovieWidth, mMeasuredMovieHeight * mScale
mMeasuredMovieHeight = (int) mMeasuredMovieHeight); /p>
p>
setMeasuredDimension(getSuggestedMinimumWidth(),
getSuggestedMinimumHeight()
}
}
<); p> @Overridep>
protected void onLayout(booleano cambiado, int l, int t, int r, int b) {
super.onLayout(cambiado, l , t, r, b);
mLeft = (getWidth() - mMeasuredMovieWidth) / 2f
mTop = (getHeight() - mMeasuredMovieHeight) / 2f;
mVisible = getVisibility () == Ver .VISIBLE
}
@Override
protected void onDraw(Canvas canvas) {
if (mMovie ! = null) {
if(!mPaused) {
> updateAnimationTime();
drawMovieFrame(lienzo);
invalidateView();
} else {
drawMovieFrame(lienzo);
}
}
}
@SuppressLint("NewApi")
private void invalidateView() {
if (mVisible ) {
if (Build.VERSION.SDK_INT gt; = Build.VERSION_CODES.JELLY_BEAN) {
postInvalidateOnAnimation()
postInvalidateOnAnimation(); p> p>
} else {
invalidar();
}
}
}
}
}
private void updateAnimationTime() {
long now = android.os.SystemClock.uptimeMillis(); > // Si es el primer fotograma, la hora de inicio de la grabación
if (mMovieStart == 0) {
mMovieStart = now
} p>
// Obtener la duración de la animación
int dur = mMovie.duration()
if (dur == 0) {
dur = DEFAULT_MOVIE_DURATION ;
}
// Calcula cuántos fotogramas se deben mostrar
mCurrentAnimationTime = (int) ((ahora - mMovieStart) dur ) ;
}
private void drawMovieFrame(Canvas canvas) {
// Establece el marco que se mostrará y lo dibuja directamente
mMovie.setTime(mCurrentAnimationTime)
lienzo.save(Canvas.MATRIEM);
mMovie.setTime(mCurrentAnimationTime);
lienzo.save(Canvas. MATRIX_SAVE_FLAG);
lienzo.scale(mScale, mScale);
mMovie.draw(lienzo, mLeft/mScale, mTop/mScale); restaurar();
p>}
@SuppressLint("NewApi")
@Override
public void onScreenStateChanged(int screenState ) {
super.onScreenS
tateChanged(screenState);
mVisible = screenState == SCREEN_STATE_ON;
invalidateView()
}
@Override
@SuppressLint("NewApi")
@Override
protected void onVisibilityChanged(Ver cambiadoView, int visibilidad) {
super.onVisibilityChanged(changedView) , visibilidad);
mVisible = visibilidad == View.VISIBLE;
invalidateView()
}
@ Anular p>
p>
@SuppressLint("NewApi")
@Override
protected void onVisibilityChanged(Ver vista cambiada, int visibilidad) {
super.
p>@ Anular
protected void onWindowVisibilityChanged(int visibilidad) {
super.onWindowVisibilityChanged(visibilidad); mVisible = visibilidad == Ver.
invalidateView();
}
}
}
En segundo lugar, defina la vista en el archivo de diseño xml, el código es el siguiente:
[html] ver copia simple
lt;?xml version= "1.0" codificación ="utf-8"?GifView
android:id="@ id/gif1"
android:layout_width="100dp"
android:layout_height= "100dp"
android: layout_gravity="center_horizontal"
android.enabled="false" /gt
lt; .gif.view .GifView
lt;net.loonggg.gif.view.GifView
android: layout_height="100dp"
android: layout_gravity=" center_horizontal" p>
android.
android:id="@ id/gif2"
android:layout_width="200dp"
android :layout_height=" 200dp"
android: layout_gravity="center_horizontal"
android: enable="false" /gt
lt; /p>
2.os.Bundle;
Gif de clase pública extiende Actividad {
GifView privado gif1, gif2
@Override
public void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); = (GifView) findViewById(R.id.gif1);
// Establecer recurso de imagen gif de fondo
gif1.
gif1.setMovieResource(R.raw .kitty);
gif2 = (GifView) findViewById(R.id.gif2);
gif2.setMovieResource(R.raw.b); // setPaused
// gif2.setPaused(true);
}
// Establece el recurso de imagen gif de fondo
/ / Establecer el recurso de imagen gif de fondo.
}