Я пишу базовое приложение для Android. Я создал объект AnimationDrawable для отображения нескольких изображений в моем макете и установил его. После этого мое приложение начало тормозить. И я даже пытался работать с этим блоком кода в новом потоке, но это не сработало, как я себе представлял. Что я сделал не так? или есть какое-то решение? Заранее спасибо.
Я вызываю этот метод в моем методе onCreate ();
/*
* This method configures the background animation
* */
private void configureAnimation(){
animation = new AnimationDrawable();
for (int i = 0; i < bgImage.length; i++) {
animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
}
animation.setEnterFadeDuration(1000);
animation.setOneShot(false);
linearLayout = (LinearLayout) findViewById(R.id.mLayout);
linearLayout.setBackground(animation);
animation.start();
}
Целый класс;
package com.example.yekta.loginapp;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private LinearLayout linearLayout;
private AnimationDrawable animation;
private int []bgImage = {R.drawable.wallpaper00, R.drawable.wallpaper01};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.add(R.id.placeholder_fragment, new LoginFragment());
ft.commit();
hideActionBar();
changeStatusBarColor(R.color.black);
// First Approach
//configureAnimation();
// Second Approach with using Thread
//startProgress();
// Third Approach
animation = new AnimationDrawable();
handleAnimation(100,animation);
animation.start();
}
/*
* This is simple method that changes the color of status bar.
* @param colorCode is the color code that given in value file
* */
private void changeStatusBarColor(final int colorCode) {
if (Build.VERSION.SDK_INT >= 21) {
Window window = this.getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(ContextCompat.getColor(this, colorCode));
}
}
/*
* This is simple method that hides the Action bar.
* */
private void hideActionBar(){
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
/*
* This method configures the background animation
* */
private void configureAnimation(){
animation = new AnimationDrawable();
for (int i = 0; i < bgImage.length; i++) {
animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
}
animation.setEnterFadeDuration(1000);
animation.setOneShot(false);
linearLayout = (LinearLayout) findViewById(R.id.mLayout);
linearLayout.setBackground(animation);
animation.start();
}
public void startProgress() {
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
configureAnimation();
}
});
}
private void handleAnimation(final int time, final AnimationDrawable animation) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < bgImage.length; i++) {
animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
}
animation.setEnterFadeDuration(1000);
animation.setOneShot(false);
linearLayout = (LinearLayout) findViewById(R.id.mLayout);
linearLayout.setBackground(animation);
}
}, time);
}
}
@Lino В данный момент в этом массиве только два изображения, так что сейчас их 2.
Позвольте мне видеть, вы хотите сделать анимацию заставки перед экраном входа в систему? Пожалуйста, удалите animation.start () из OnCreate




Я думаю, что безопаснее называть его onResume (), если вы запустите анимацию в OnCreate (), вы, вероятно, получите ANR, и вы можете попробовать этот подход:
animation = new AnimationDrawable();
animation.start();
handleAnimation(100,animation);
private void handleAnimation(final int time, final AnimationDrawable animationDrawable) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
for (int i = 0; i < bgImage.length; i++) {
animation.addFrame(getResources().getDrawable(bgImage[i]), 5000);
}
animation.setEnterFadeDuration(1000);
animation.setOneShot(false)
linearLayout = (LinearLayout) findViewById(R.id.mLayout);
linearLayout.setBackground(animation);
}
}, time);
}
Все тот же. Я даже попытался переключить между ними строку animation.start () и строку реализации handleAnimation (). Но пользовательский интерфейс по-прежнему работает значительно медленнее.
Вы можете опубликовать полный курс?
Я нахожу свою проблему: D. И это была глупая проблема, основанная на плагине ресурсов, который я установил в Android Studio, Android Drawable Importer. Проблема в том, что изображение было настолько огромным, что загружалось в эмулятор экрана HD, поэтому оно естественным образом замедляло работу приложения. Когда я настроил его на нормальные размеры, которые должны быть, это решило мою проблему. Мне очень жаль, что я не тороплюсь: D. Спасибо всем, кто пытался мне помочь. Всем удачного кодирования.
в чем ценность
bgImage.length? а также насколько велики фоновые изображения