Before playing a GIF on Android, I wrote an article about how to use a GIF file and play it back. You can learn about how to play GIF videos.
If you know something about it, you must know that the above practice is troublesome. You have to break down the image and write all kinds of troublesome XML files, which is a bit depressing, the direct consequence is that a GIF image with many actions may increase the size of the project, which is unacceptable to many friends. However, the advantage is that the running speed is faster than the decoding speed.
The following method requires decoding, but the speed cannot be guaranteed. It may not be handled during thread startup. The following picture is used as an example to decode and play the video:
First, write a help class for GIF Decoding. This class provides several methods for operating GIF images, such as initializing the image, switching the image, and obtaining the total number of GIF combinations, because there are too many codes, we will not list them here. The source code will be provided for your reference. You can find this help class in the source code.
Then, compile a component for displaying Gif, inherit from View and implement Runable. The Code is as follows:
Package com.terry.gif;
Import android. content. Context;
Import android. content. res. TypedArray;
Import android. graphics. Bitmap;
Import android. graphics. Canvas;
Import android. graphics. Paint;
Import android. util. AttributeSet;
Import android. view. View;
Public class TypegifView extends View implements Runnable {
GifOpenHelper gHelper;
Private boolean isStop = true;
Int delta;
String title;
Bitmap bmp;
// Construct-refer for java
Public TypegifView (Context context ){
This (context, null );
}
// Construct-refer for xml
Public TypegifView (Context context, AttributeSet attrs ){
Super (context, attrs );
// Add attributes
TypedArray ta = context. obtainStyledAttributes (attrs,
R.styleable.gif View );
Int n = ta. getIndexCount ();
For (int I = 0; I <n; I ++ ){
Int attr = ta. getIndex (I );
Switch (attr ){
Case R.styleable.gif View_src:
Int id = ta.getResourceId(R.styleable.gif View_src, 0 );
SetSrc (id );
Break;
Case R.styleable.gif View_delay:
Int idelta = ta.getInteger(R.styleable.gif View_delay, 1 );
SetDelta (idelta );
Break;
Case R.styleable.gif View_stop:
Boolean sp = ta.getBoolean(R.styleable.gif View_stop, false );
If (! Sp ){
SetStop ();
}
Break;
}
}
Ta. recycle ();
}
/**
* Set stop
*
* @ Param stop
*/
Public void setStop (){
IsStop = false;
}
/**
* Set startup
*/
Public void setStart (){
IsStop = true;
Thread updateTimer = new Thread (this );
UpdateTimer. start ();
}
/**
* Set the number of images to be displayed through the next ticket
* @ Param id
*/
Public void setSrc (int id ){
GHelper = new gifOpenHelper ();
GHelper. read (TypegifView. this. getResources (). openRawResource (id ));
Bmp = gHelper. getImage (); // obtain the first image
}
Public void setDelta (int is ){
Delta = is;
}
// To meaure its Width & Height
@ Override
Protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec ){
SetMeasuredDimension (measureWidth (widthMeasureSpec ),
MeasureHeight (heightMeasureSpec ));
}
Private int measureWidth (int measureSpec ){
Return gHelper. getWidth ();
}
Private int measureHeight (int measureSpec ){
Return gHelper. getHeigh ();
}
Protected void onDraw (Canvas canvas ){
// TODO Auto-generated method stub
Canvas. drawBitmap (bmp, 0, 0, new Paint ());
Bmp = gHelper. nextBitmap ();
}
Public void run (){
// TODO Auto-generated method stub
While (isStop ){
Try {
This. postInvalidate ();
Thread. sleep (gHelper. nextDelay ()/delta );
} Catch (Exception ex ){
}
}
}
}
After basic functions are implemented. You can enable GIF playback through view. start () or view. stop () to stop GIF playback. The Code is as follows:
SetContentView (R. layout. main );
Button btn = (Button) findViewById (R. id. Button01 );
Button btn2 = (Button) findViewById (R. id. Button02 );
Final TypegifView view = (TypegifView) findViewById(R.id.gif View1 );
Btn. setOnClickListener (new OnClickListener (){
@ Override
Public void onClick (View v ){
View. setStop ();
}
});
Btn2.setOnClickListener (new OnClickListener (){
@ Override
Public void onClick (View v ){
View. setStart ();
}
});
Display Effect: