Skipped 108 frames! The application may be doing too much work on its main thread
現在ボタンを押すとアニメーションが表示されるようなプログラムを組んでいるのですが、ボタンを押してからアニメーションが表示されるまでの間に時間があり、スムーズにアニメーションが表示されません。ログを見てみると、Skipped 108 frames! The application may be doing too much work on its main thread.
や、GC_FOR_ALLOC freed <1K, 1% free 23795K/23900K, paused 10ms, total 10ms
などと表示されています。アニメーションの際の各画像サイズが大きすぎるのだと思うのですが、色々と調べて画像サイズを減らそうとしてみても、画像が荒くなったりと中々思うようにいきません。解決策としてはどういった選択肢をとればよいでしょうか?下記にコードを記します。すみませんが、宜しくお願いします。
public class AnimationActivity extends Activity {
private Activity mActivity = this;
ImageView animationImageView;
AnimationConfig animationConfig;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_animation);
animationImageView = (ImageView) findViewById(R.id.animation_imageview);
animationConfig = new AnimationConfig(mActivity, animationImageView, 2000, 2000, 50);
animationConfig.setAnimationFrame(R.drawable.slot_01);
animationConfig.setAnimationFrame(R.drawable.slot_02);
animationConfig.setAnimationFrame(R.drawable.slot_03);
animationConfig.setAnimationFrame(R.drawable.slot_04);
animationConfig.setAnimationFrame(R.drawable.slot_05);
animationConfig.setAnimationFrame(R.drawable.slot_06);
animationConfig.setAnimationFrame(R.drawable.slot_07);
animationConfig.setAnimationFrame(R.drawable.slot_08);
animationConfig.setAnimationFrame(R.drawable.slot_09);
animationConfig.setAnimationFrame(R.drawable.slot_10);
animationConfig.setAnimationFrame(R.drawable.slot_11);
animationConfig.setAnimationFrame(R.drawable.slot_12);
animationConfig.setAnimationFrame(R.drawable.slot_13);
animationConfig.setAnimationFrame(R.drawable.slot_14);
animationConfig.setAnimationFrame(R.drawable.slot_15);
animationConfig.setAnimationFrame(R.drawable.slot_16);
animationConfig.setAnimationFrame(R.drawable.slot_17);
animationConfig.setAnimationFrame(R.drawable.slot_18);
animationConfig.startAnimation();
}
}
public class AnimationConfig {
private Activity mActivity;
private int mDuration;
private int mOffset;
private int mEachImageShowTime;
private AnimationSet mAnimationSet;
private ImageView mAnimationImageView;
private AnimationDrawable anim;
private List<Drawable> mFrameList = new ArrayList<Drawable>();
public AnimationConfig(Activity activity, ImageView imageView, int duration, int offset, int eachImageShowTime) {
mActivity = activity;
mAnimationImageView = imageView;
mDuration = duration;
mOffset = offset;
mEachImageShowTime = eachImageShowTime;
}
public void setAnimationFrame(int image) {
mFrameList.add(mActivity.getResources().getDrawable(image));
}
public void startAnimation() {
setFrameAnimation(mAnimationImageView, mEachImageShowTime);
mAnimationImageView.post(new Runnable() {
@Override
public void run() {
anim.start();
}
});
mAnimationImageView.startAnimation(setFadeAnimation(mDuration, mOffset));
}
public void setFrameAnimation(ImageView imageView, int sec) {
mAnimationImageView = imageView;
anim = new AnimationDrawable();
for (Drawable frame:mFrameList) { anim.addFrame(frame, sec); }
anim.setOneShot(false);
imageView.setImageDrawable(anim);
}
public AnimationSet setFadeAnimation(int duration, final int offset){
AlphaAnimation fadeIn = new AlphaAnimation(0, 1);
final AlphaAnimation fadeOut = new AlphaAnimation(1, 0);
fadeIn.setDuration(duration);
fadeIn.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
fadeOut.setStartOffset(offset);
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
fadeOut.setDuration(duration);
fadeOut.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mAnimationImageView.setVisibility(View.GONE);
mAnimationSet.setFillAfter(true);
mActivity.finish();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mAnimationSet = new android.view.animation.AnimationSet(false); {
mAnimationSet.addAnimation(fadeIn);
mAnimationSet.addAnimation(fadeOut);
}
return mAnimationSet;
}
}