Che dimensioni hanno queste immagini? (Larghezza x Altezza, il peso in KB ce l'hai già detto prima, 20 KB mi pare)
Quante ne carichi contemporaneamente?
Che dimensioni hanno queste immagini? (Larghezza x Altezza, il peso in KB ce l'hai già detto prima, 20 KB mi pare)
Quante ne carichi contemporaneamente?
Ok hai sbagliato un bel po' di roba, ho riorganizzato un po' il tutto, ecco i files:
x1public class Game extends Activity {
2private static final String TAG = "AndroidBomb";
3private ImageView imgCtr;
4private Button startButton;
5private Handler handler = new Handler();
6private Bitmap [] bitmapArrays;
7private int n = 0;
8private Resources res;
9
10public static final String KEY_NPLAYERS = "org.FMsolution.menu.nplayers";
11
12protected void onCreate(Bundle savedInstanceState) {
13super.onCreate(savedInstanceState);
14setContentView(R.layout.main);
15
16
17//le findViewById vanno messe sempre DOPO la setContentView
18imgCtr=(ImageView) findViewById(R.id.animatedImage); //IMPORTANTISSIMO! altrimenti imgCtr e' null
19startButton=(Button) findViewById(R.id.startAnimationButton); //idem
20
21
22
23startButton.setOnClickListener(buttonListener); //imposto il listener che viene attivato al click sul bottone
24
25res=getResources();
26
27bitmapArrays = new Bitmap []{
28BitmapFactory.decodeResource(res,R.drawable.finale_0001),
29BitmapFactory.decodeResource(res,R.drawable.finale_0002),
30BitmapFactory.decodeResource(res,R.drawable.finale_0003),
31BitmapFactory.decodeResource(res,R.drawable.finale_0004),
32BitmapFactory.decodeResource(res,R.drawable.finale_0005),
33BitmapFactory.decodeResource(res,R.drawable.finale_0006),
34BitmapFactory.decodeResource(res,R.drawable.finale_0007),
35BitmapFactory.decodeResource(res,R.drawable.finale_0008),};
36
37startAnimation();
38}
39
40//callback attivato quando clicchi sul bottone
41private View.OnClickListener buttonListener=new View.OnClickListener() {
42
43public void onClick(View v) {
44
45switch(v.getId()){ //in questo caso la switch e' inutile ma a scopo didattico :D
46
47case R.id.startAnimationButton:
48n=0;
49imgCtr.setImageBitmap(bitmapArrays[n++]);
50startAnimation();
51break;
52}
53
54}
55};
56
57private Runnable mUpdateTask = new Runnable() {
58
59
60public void run() {
61imgCtr.setImageBitmap(bitmapArrays[n++]);
62
63
64if(n<bitmapArrays.length-1)
65handler.postDelayed(mUpdateTask, 200);
66
67}
68};
69
70private void startAnimation(){
71handler.removeCallbacks(mUpdateTask);
72handler.postDelayed(mUpdateTask, 200);
73}
74
75}
Il layout (res/layout/main.xml):
191
2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3android:orientation="vertical"
4android:layout_width="fill_parent"
5android:layout_height="fill_parent"
6>
7<ImageView
8android:id="@+id/animatedImage"
9android:layout_width="wrap_content"
10android:layout_height="wrap_content"
11android:layout_centerHorizontal="true"
12/>
13
14<Button android:layout_width="wrap_content"
15android:layout_height="wrap_content"
16android:layout_centerInParent="true"
17android:text="@string/startText"
18android:id="@+id/startAnimationButton"/>
19</RelativeLayout>
e il file res/values/strings.xml:
61
2<resources>
3<string name="hello">Hello World, Game!</string>
4<string name="app_name">game</string>
5<string name="startText">Restart animation!</string>
6</resources>
Così almeno sul mio acer liquid funziona senza problemi
Ovviamente nella cartella res/drawable ci devi mettere i files finale_0001.png, finale_0002.png eccetera!
FMsolution (19-08-10)
Grazie mille eafkuor, testato e funziona perfettamente effettivamete c'erano un pò di errori ero andato in panne con l'array di bitmap che non mi ero accorto degli errori, grazie ancora.
Le immagini sono 205x180 pixel profondità 32 bit, non mi sembrano molto grandi.
Significa che ogni immagine, decodificata, occupa 145 KB (205*180*4). 25 immagini sono 3.5 MB.
Su Android un'applicazione può occupare al massimo 16 MB (su dispositivi "vecchi") o 24 MB (sui "nuovi").
E` un po' strano che ti dia OutOfMemory così presto, a meno che tu non abbia veramente poca RAM sul dispositivo o che il resto del tuo programma non ne occupi molta.
In ogni caso ti converrebbe studiare qualche sistema di double o triple buffering, e quindi di usare solo 2 o 3 bitmap contemporaneamente in memoria, caricando le altre quando servono.
Bye.
Rieccomi, il problema si è ripresentato, ho provato a non fermare l'animazione ma ha creare un loop però al secondo ciclo si blocca e mi da outofmemory ecc.., non capisco ho ridotto anche le immagini sono 25 e di dimensione 11 kb mi sembra molto strano che non riesco ad eseguire una semplice animazione.
C'è un modo per monitorare le risorse e controllare quanta memoria viene utilizzata in un certo periodo.
Grazie,ciao.
Ma scusa il loop come lo fai? Non rimetti semplicemente n=0?
si ho risolto il questa maniera:
151
2private Runnable mUpdateTask = new Runnable() {
3
4//@Override
5public void run() {
6imgCtr.setImageBitmap(bitmapArrays[n++]);
7
8if(n<bitmapArrays.length -1){
9handler.postDelayed(mUpdateTask, 250);
10}else if (n >= bitmapArrays.length - 1) {
11n = 0;
12startAnimation();
13}
14}
15};
adesso funziona.
Credo che potresti eliminare il secondo if:
141private Runnable mUpdateTask = new Runnable() {
2
3//@Override
4public void run() {
5imgCtr.setImageBitmap(bitmapArrays[n++]);
6
7if(n<bitmapArrays.length -1){
8handler.postDelayed(mUpdateTask, 250);
9}else {
10n = 0;
11startAnimation();
12}
13}
14};
E magari potresti salvarti bitmapArrays.length -1 in modo da non doverlo far ricalcolare al processore ogni voltaMa sono solo finezze, di certo non gli ci vuole molto a fare una sottrazione o un if.