Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
#1

Почему этот цикл выполняется один раз? - Android

30.07.2013, 00:33. Просмотров 828. Ответов 12
Метки нет (Все метки)

Canvas, прорисовав один раз все изображения, останавливается, а задача в том чтобы изображения менялись как слайды. Подскажите, что не так?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
private void draw() {
            SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                   if (c != null) 
                   {
                    Paint p = new Paint();
                    p.setAntiAlias(true);
                  
 
                           
for (int slide = 0; slide < 10; slide++) {      
c.drawBitmap(pic1, 100, 100, p);  
c.drawBitmap(pic2, 100, 100, p);
c.drawBitmap(pic3, 100, 100, p);
c.drawBitmap(pic4, 100, 100, p);
c.drawBitmap(pic5, 100, 100, p);
c.drawBitmap(pic6, 100, 100, p);
c.drawBitmap(pic7, 100, 100, p);
System.out.print(slide);
}
 
                }
            
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
                
               
            }
            mHandler.removeCallbacks(mUpdateDisplay);
            if (mVisible) {
                mHandler.postDelayed(mUpdateDisplay, 20);
   }
  }
 }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 00:33     Почему этот цикл выполняется один раз?
Посмотрите здесь:

Не выполняется задание таймера Android
Android Показать только один раз
Android Не выполняется поиск в ListView
Android OnTouch MotionEvent в андроид выполняется только один раз
Загрузить данные один раз с MySQL таблицы в память приложения, и в дальнейшем использовать ее Android
Как создать layout, который запускается один раз, при первом запуске приложения? Android
Почему месяц получается на один больше? Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.07.2013, 00:47     Почему этот цикл выполняется один раз? #2
10 раз подряд прорисовываете одни и те же картинки в одном и том же месте, не представляю как у вас здесь должны были слайды получиться.
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
30.07.2013, 00:51  [ТС]     Почему этот цикл выполняется один раз? #3
почему одни и те же? картинки разные, если поменять их координаты, они так же прорисуются один раз и цикл остановится
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
30.07.2013, 01:20     Почему этот цикл выполняется один раз? #4
У вас картинка зарисовываеться картинкой по этому нужно сделать примерно так
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int countPicture = 0;
private void draw() {
            SurfaceHolder holder = getSurfaceHolder();
            Canvas c = null;
            try {
                c = holder.lockCanvas();
                   if (c != null) 
                   {
                    Paint p = new Paint();
                    p.setAntiAlias(true);
                  
 
switch(countPicture){
case 0 : c.drawBitmap(pic1, 100, 100, p);  break;
case 10 : c.drawBitmap(pic2, 100, 100, p);  break;
case 20 : c.drawBitmap(pic3, 100, 100, p);  break;
case 30 : c.drawBitmap(pic4, 100, 100, p);  break;
case 40 : c.drawBitmap(pic5, 100, 100, p);  break;
case 50 : c.drawBitmap(pic6, 100, 100, p);  break;
case 60 : c.drawBitmap(pic7, 100, 100, p);  break;
}                           
                }
            
            } finally {
                if (c != null)
                    holder.unlockCanvasAndPost(c);
                
               
            }
            mHandler.removeCallbacks(mUpdateDisplay);
            if (mVisible) {
                mHandler.postDelayed(mUpdateDisplay, 20);
   }
  }
 }
countPicture++;
if(countPicture == 70) countPicture =0;
}
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
31.07.2013, 00:32  [ТС]     Почему этот цикл выполняется один раз? #5
подскажите, пожалуйста, для уменьшения кода как pic1, pic2 и т.д. взять в цикл?
Просто переменную типа char Bitmap не рассматривает
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
01.08.2013, 05:33     Почему этот цикл выполняется один раз? #6
не знаю может есть удобнее вариант, но можно так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
Bitmap picture;
int count = 0;
final int MAX_COUNT = 100;
 
public void myTimer(){
if(count == MAX_COUNT ) count = 0;
picture= BitmapFactory.decodeResource(getResources(), R.drawable.picture1 + count); 
count++;
}
 
public void draw(Canvas canvas) {
canvas.drawBitmap(picture, 100, 100, new Paint()); 
}
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
06.08.2013, 01:16  [ТС]     Почему этот цикл выполняется один раз? #7
Не работает у меня этот цикл, хоть убейте
Я так понимаю, переменная Bitmap picture, должна быть не переменной а массивом, подскажите как это здесь сделать?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
public class MainActivity extends WallpaperService {
 
    @Override
    public Engine onCreateEngine() {
        return new DemoWallpaperEngine();
    }
    private class DemoWallpaperEngine extends Engine {
               
        Bitmap picture;
        int count = 0;
        final int MAX_COUNT = 50;
              
        {   if(count == MAX_COUNT ) count = 0;
            
                picture= BitmapFactory.decodeResource(getResources(), R.drawable.p01 + count); 
            count++;
            }
        private boolean mVisible = false;
        private final Handler mHandler = new Handler();
        private final Runnable mUpdateDisplay = new Runnable() {
            public void run() {
                draw();
            }
        };
                
        private void draw() {
                    SurfaceHolder holder = getSurfaceHolder();
                    Canvas c = null;
                    int count = 0;
                    final int MAX_COUNT = 50;
                    try {
                        c = holder.lockCanvas();
                           if (c != null) 
                           {
                            Paint p = new Paint();
                            p.setAntiAlias(true);
         {if(count == MAX_COUNT ) count = 0;                                   
         c.drawBitmap(picture, 0, 0, p);
         count++;
         }                 
       }
                } finally {
                        if (c != null)
                            holder.unlockCanvasAndPost(c);
                          
                       
                    }
                    mHandler.removeCallbacks(mUpdateDisplay);
                    if (mVisible) {
                        mHandler.postDelayed(mUpdateDisplay, 20);
          }
         }
        }
       }
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
06.08.2013, 08:51     Почему этот цикл выполняется один раз? #8
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class MainActivity extends WallpaperService {
 
    @Override
    public Engine onCreateEngine() {
        return new DemoWallpaperEngine();
    }
    
    
    private class DemoWallpaperEngine extends Engine {
               
        Timer timer = new Timer();     
        Bitmap picture;
        int count = 0;
        final int MAX_COUNT = 50;
              
        public DemoWallpaperEngine(){
        timer.schedule(new TimerTask() {
            
            @Override
            public void run() {
                if(count == MAX_COUNT ) count = 0;
           
                    picture= BitmapFactory.decodeResource(getResources(), R.drawable.p01 + count); 
                    count++;
            }
        }, 0,80);
        
        }     
        
            
        private boolean mVisible = false;
        private final Handler mHandler = new Handler();
        private final Runnable mUpdateDisplay = new Runnable() {
            public void run() {
                draw();
            }
        };
                
        private void draw() {
                    SurfaceHolder holder = getSurfaceHolder();
                    Canvas c = null;
 
 
                    try {
                        c = holder.lockCanvas();
                           if (c != null) 
                           {
                            Paint p = new Paint();
                            p.setAntiAlias(true);                              
         c.drawBitmap(picture, 0, 0, p);
                          
       }
                } finally {
                        if (c != null)
                            holder.unlockCanvasAndPost(c);
                          
                       
                    }
                    mHandler.removeCallbacks(mUpdateDisplay);
                    if (mVisible) {
                        mHandler.postDelayed(mUpdateDisplay, 20);
          }
         }
        }
       }
где-то так
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
07.08.2013, 02:02  [ТС]     Почему этот цикл выполняется один раз? #9
Теперь вылетает приложение и пишет такие логи.
Кстати, когда я вручную прописывала все 50 картинок в коде, то приложение также закрывалось с этими же ошибками. если в коде было 5 картинок - приложение работало если шесть - вылетало.
С последним кодом - уменьшала final int MAX_COUNT = 4; и все равно приложение при запуске вылетает с ошибкой.
Тестировала на разных эмуляторах и на обычном телефоне.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
08-07 01:49:52.249: E/AndroidRuntime(1392): FATAL EXCEPTION: main
08-07 01:49:52.249: E/AndroidRuntime(1392): java.lang.NullPointerException
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.graphics.Canvas.throwIfRecycled(Canvas.java:1025)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.graphics.Canvas.drawBitmap(Canvas.java:1065)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at com.krasnodar.shadowstheatre.MainActivity$DemoWallpaperEngine.draw(MainActivity.java:97)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at com.krasnodar.shadowstheatre.MainActivity$DemoWallpaperEngine.onSurfaceChanged(MainActivity.java:61)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:693)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:781)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1037)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:40)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.os.Looper.loop(Looper.java:137)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at java.lang.reflect.Method.invokeNative(Native Method)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at java.lang.reflect.Method.invoke(Method.java:511)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-07 01:49:52.249: E/AndroidRuntime(1392):     at dalvik.system.NativeStart.main(Native Method)
в чем может быть дело?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.08.2013, 02:19     Почему этот цикл выполняется один раз? #10
NullPointerException вылетает при обращении к неинициализированной перемене.
name?
198 / 169 / 18
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
07.08.2013, 11:29     Почему этот цикл выполняется один раз? #11
там просто не был инициализирован таймер, вот рабочий пример
Вложения
Тип файла: rar changePicture.rar (917.2 Кб, 3 просмотров)
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
09.08.2013, 00:46  [ТС]     Почему этот цикл выполняется один раз? #12
Цитата Сообщение от name? Посмотреть сообщение
там просто не был инициализирован таймер
а как в моем примере инициализировать таймер?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 01:37     Почему этот цикл выполняется один раз?
Еще ссылки по теме:

Android Некорректно выполняется запрос к SQLite
Android Обновление данных один раз в сутки
Android Не выполняется условие if
Android Как определить, платил ли пользователь хоть один раз?
Не выполняется сервис android Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 96
09.08.2013, 01:37  [ТС]     Почему этот цикл выполняется один раз? #13
Прикрепляю
Вложения
Тип файла: zip Shadows.zip (8.46 Мб, 1 просмотров)
Yandex
Объявления
09.08.2013, 01:37     Почему этот цикл выполняется один раз?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru