Red de conocimiento informático - Material del sitio web - Cómo mostrar animación gif en Canvas SWT

Cómo mostrar animación gif en Canvas SWT

1. Primero, reescriba el control Ver y personalice un GifView para mostrar imágenes gif. El código es el siguiente:

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> @Override

p>

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

}

// 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>

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

}

}

}

La película en realidad administra el GIF con varios fotogramas en una animación, solo requiere que setTime() dibuje el fotograma correspondiente cuando se dibuja(). A través de la relación de conversión entre la hora actual y la duración, el efecto del movimiento GIF se puede lograr muy fácilmente.

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"

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.

}