Wednesday, 14 September 2016

Animated GIF ImageView in android

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
   android:layout_width="match_parent"   
 android:layout_height="match_parent"    
android:orientation="vertical">
        <LinearLayout        
android:orientation="horizontal"        
android:layout_width="match_parent"        
android:layout_height="wrap_content">
        <com.krishnakant.imageanimation.Activity.PlayGifView 
           android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
           android:id="@+id/imageBachao"            
             />
        
    </LinearLayout>

  </LinearLayout>



MainActivity Class
public class MainActivity extends  AppCompatActivity {
@Overrideprotected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
   PlayGifView imageBachao = (PlayGifView) findViewById(R.id.imageBachao);
    imageBachao.setImageResource(R.drawable.bachao);
  }
}


PlayGifView.java Class

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;

/** * Created by Krishnakant.Kumar on 13-09-2016. */
public class PlayGifView extends View {

    private static final int DEFAULT_MOVIEW_DURATION = 500;
    private int mMovieResourceId;
    private Movie mMovie;
    private long mMovieStart = 0;
    private int mCurrentAnimationTime = 0;
    @SuppressLint("NewApi")
    public PlayGifView(Context context, AttributeSet attrs) {
        super(context, attrs);

        /**         * Starting from HONEYCOMB have to turn off HardWare acceleration to draw         * Movie on Canvas.         */        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
    }

    public void setImageResource(int mvId){
        this.mMovieResourceId = mvId;
        mMovie = Movie.decodeStream(getResources().openRawResource(mMovieResourceId));
        requestLayout();
    }

    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if(mMovie != null){
            setMeasuredDimension(mMovie.width(), mMovie.height());
        }else{
            setMeasuredDimension(getSuggestedMinimumWidth(), getSuggestedMinimumHeight());
        }
    }

    @Override    protected void onDraw(Canvas canvas) {
        if (mMovie != null){
            updateAnimtionTime();
            drawGif(canvas);
            invalidate();
        }else{
            drawGif(canvas);
        }
    }

    private void updateAnimtionTime() {
        long now = android.os.SystemClock.uptimeMillis();

        if (mMovieStart == 0) {
            mMovieStart = now;
        }
        int dur = mMovie.duration();
        if (dur == 0) {
            dur = DEFAULT_MOVIEW_DURATION;
        }
        mCurrentAnimationTime = (int) ((now - mMovieStart) % dur);
    }

    private void drawGif(Canvas canvas) {
        mMovie.setTime(mCurrentAnimationTime);
        mMovie.draw(canvas, 0, 0);
        canvas.restore();
    }

}

No comments:

Post a Comment