Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
1

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

30.07.2013, 00:33. Просмотров 932. Ответов 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);
   }
  }
 }
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 00:33
Ответы с готовыми решениями:

OnTouch MotionEvent в андроид выполняется только один раз
Так вот сам вопрос: MotionEvent.ACTION_UP выполняется только первый раз, что при использовании if,...

Цикл выполняется один раз
Здравствуйте! Помогите, пожалуйста с задачей. Пусть а=а=1. а = а + а/2к-1 где...

Цикл выполняется только один раз
var a, b, s :integer; begin read (a); s:=0; repeat begin if (a mod 10 mod 2)&lt;&gt;0 then s:=s + a...

Цикл выполняется только один раз.
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; struct kvartira { int...

Цикл выполняется лишь один раз
Вот мой код, который за никнеймом пользователя должен создавать по простому циклу ему пароль - 1...

12
V0v1k
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
30.07.2013, 00:47 2
10 раз подряд прорисовываете одни и те же картинки в одном и том же месте, не представляю как у вас здесь должны были слайды получиться.
0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
30.07.2013, 00:51  [ТС] 3
почему одни и те же? картинки разные, если поменять их координаты, они так же прорисуются один раз и цикл остановится
0
name?
201 / 172 / 52
Регистрация: 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;
}
1
30.07.2013, 01:20
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
31.07.2013, 00:32  [ТС] 5
подскажите, пожалуйста, для уменьшения кода как pic1, pic2 и т.д. взять в цикл?
Просто переменную типа char Bitmap не рассматривает
0
name?
201 / 172 / 52
Регистрация: 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()); 
}
1
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
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);
          }
         }
        }
       }
0
name?
201 / 172 / 52
Регистрация: 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);
          }
         }
        }
       }
где-то так
1
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
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)
в чем может быть дело?
0
V0v1k
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.08.2013, 02:19 10
NullPointerException вылетает при обращении к неинициализированной перемене.
0
name?
201 / 172 / 52
Регистрация: 01.06.2010
Сообщений: 371
Завершенные тесты: 1
07.08.2013, 11:29 11
там просто не был инициализирован таймер, вот рабочий пример
1
Вложения
Тип файла: rar changePicture.rar (917.2 Кб, 4 просмотров)
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
09.08.2013, 00:46  [ТС] 12
Цитата Сообщение от name? Посмотреть сообщение
там просто не был инициализирован таймер
а как в моем примере инициализировать таймер?
0
geometria
1 / 1 / 0
Регистрация: 13.01.2013
Сообщений: 116
09.08.2013, 01:37  [ТС] 13
Прикрепляю
0
Вложения
Тип файла: zip Shadows.zip (8.46 Мб, 2 просмотров)
09.08.2013, 01:37
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 01:37

Цикл выполняется один раз из трех нужных
$x = 20; do { $howmuchhave = db_select('groups_lords', 'v') -&gt;fields('v', array('howmuch'))...

Цикл выполняется один раз вместо нескольких
Есть папка из 354 файлов,нужно,чтобы осталось 299 void Data::renewFiles() { QDir dir; ...

Цикл выполняется один раз вместо нескольких
Есть папка с 354 файлами Нужно,чтобы стало 299 void Data::renewFiles() { QDir dir; ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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