Last posts show how to "
Display animated GIF using ImageDecoder " and "
Apply PostProcess for ImageDecoder ". This example I try to mix using of ImageDecoder and ObjectAnimator, to apply animation on animated GIF.
VIDEO
Modify MainActivity.java
package com.blogspot.android_er.androidimagedecoder;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ImageDecoder;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.PostProcessor;
import android.graphics.drawable.AnimatedImageDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.IOException;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView1 = findViewById(R.id.gifimage1);
ImageView imageView2 = findViewById(R.id.gifimage2);
loadGif(imageView1);
loadRoundGif(imageView2);
imageView1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
prepareObjectAnimatorRotate((ImageView)v);
}
});
imageView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
prepareObjectAnimatorAlpha((ImageView)v);
}
});
}
PostProcessor myPostProcessor =
new PostProcessor(){
@Override
public int onPostProcess(
Canvas canvas) {
// This will create rounded corners.
Path path = new Path();
path.setFillType(Path.FillType.INVERSE_EVEN_ODD);
int width = canvas.getWidth();
int height = canvas.getHeight();
path.addRoundRect(0, 0,
width, height, 150, 150,
Path.Direction.CW);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.TRANSPARENT);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
canvas.drawPath(path, paint);
return PixelFormat.TRANSLUCENT;
}
};
ImageDecoder.OnHeaderDecodedListener myOnHeaderDecodedListener =
new ImageDecoder.OnHeaderDecodedListener(){
@Override
public void onHeaderDecoded
(ImageDecoder decoder,
ImageDecoder.ImageInfo info,
ImageDecoder.Source source) {
decoder.setPostProcessor(myPostProcessor);
}
};
private void loadGif(ImageView iv){
try {
ImageDecoder.Source source =
ImageDecoder.createSource(getResources(), R.drawable.android_er);
Drawable drawable = ImageDecoder.decodeDrawable(source);
iv.setImageDrawable(drawable);
if (drawable instanceof AnimatedImageDrawable) {
((AnimatedImageDrawable) drawable).start();
Toast.makeText(getApplicationContext(),
"loadGif: Animation started",
Toast.LENGTH_LONG).show();
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"loadGif: IOException: \n" + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
private void loadRoundGif(ImageView iv){
try {
ImageDecoder.Source source =
ImageDecoder.createSource(getResources(), R.drawable.android_er);
//Drawable drawable = ImageDecoder.decodeDrawable(source);
Drawable drawable = ImageDecoder.decodeDrawable(source,
myOnHeaderDecodedListener);
iv.setImageDrawable(drawable);
if (drawable instanceof AnimatedImageDrawable) {
((AnimatedImageDrawable) drawable).start();
Toast.makeText(getApplicationContext(),
"loadRoundGif: Animation started",
Toast.LENGTH_LONG).show();
}
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(),
"loadRoundGif: IOException: \n" + e.getMessage(),
Toast.LENGTH_LONG).show();
}
}
private void prepareObjectAnimatorRotate(ImageView image){
TimeInterpolator timeInterpolator =
new AccelerateDecelerateInterpolator();
float propertyStart = 0f;
float propertyEnd = 360f;
String propertyName = "rotation";
ObjectAnimator objectAnimator
= ObjectAnimator.ofFloat(
image, propertyName, propertyStart, propertyEnd);
objectAnimator.setDuration(5000);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
objectAnimator.setInterpolator(timeInterpolator);
objectAnimator.start();
}
private void prepareObjectAnimatorAlpha(ImageView image){
TimeInterpolator timeInterpolator =
new AccelerateDecelerateInterpolator();
float propertyStart = 1f;
float propertyEnd = 0f;
String propertyName = "alpha";
ObjectAnimator objectAnimator
= ObjectAnimator.ofFloat(
image, propertyName, propertyStart, propertyEnd);
objectAnimator.setDuration(5000);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
objectAnimator.setInterpolator(timeInterpolator);
objectAnimator.start();
}
}
Keep using the layout in last post "
Apply PostProcess for ImageDecoder ".
If you target to animated GIF and it cannot shown, try to disable hardwareAccelerated, refer to "
Display animated GIF using ImageDecoder ".
Related old post:
-
Interpolator effect on ObjectAnimator
VIDEO