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

Почему Canvas не выводит текст? - Android

Восстановить пароль Регистрация
 
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,005
12.05.2014, 15:05     Почему Canvas не выводит текст? #1
В коде, приведённом ниже вроде всё правильно, но не пойму, почему не выводится текст!
MainActivity.java
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
public class MainActivity extends Activity
{
    MySurface surface;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
 
        surface = new MySurface(this);
        setContentView(surface);
    }
 
    public class MySurface extends SurfaceView 
    implements SurfaceHolder.Callback
    {
        MyThread thread;
        SurfaceHolder holder;
 
        MySurface(Context context)
        {
            super(context);
 
            holder = getHolder();
            thread = new MyThread(holder);
 
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder p1)
        {
            // TODO: Implement this method
            thread.running = true;
            thread.start();
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4)
        {
            // TODO: Implement this method
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder p1)
        {
            // TODO: Implement this method
            boolean retry = true;
            thread.running = false;
            while (retry)
            {
                try
                {
                    thread.join();
                    retry = false;
                }
                catch (InterruptedException e) {}
            }
        }
 
    }
}
MyThread.java
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
public class MyThread extends Thread
{
           boolean running;
    Paint p;
    SurfaceHolder holder;
    
    MyThread(SurfaceHolder h){
        holder = h;
        p = new Paint();
    }
 
    
    public void setRunning(boolean r){
        running = r;
    }
 
    @Override
    public void run()
    {
        // TODO: Implement this method
        p.setColor(Color.RED);
        while (running)
        {
            Canvas canv = null;
            try
            {
                
                canv = holder.lockCanvas();
                synchronized(holder){
                canv.drawText("hello",100,400,p);
                }
            }
            catch (Exception e) {}
            finally{
                holder.unlockCanvasAndPost(canv);
            }
        }
    }
    
    
}
Добавлено через 8 минут
нашёл ошибку, забыл добавить addCallback

Теперь другой вопрос.
Почему надпись "hello" появляется не сразу, а через пару секунд?
И почему при закрытии появляется ошибка "Ошибка в приложении"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2014, 15:05     Почему Canvas не выводит текст?
Посмотрите здесь:

Масштабирование Canvas Android
Canvas Android
Canvas и Activity Android
Canvas и Button Android
Отрисовоку выводит за ошибку почему? Android
canvas.rotate Android
Android Intent в Canvas
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.05.2014, 15:15     Почему Canvas не выводит текст? #2
phpk, давайте стек трейс с ошибкой
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,005
12.05.2014, 16:06  [ТС]     Почему Canvas не выводит текст? #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
phpk, давайте стек трейс с ошибкой
не сочтите за наглость, но подскажите пожалуйста, как создать этот стек трейс?
В будущем буду пользоваться, если научите.
Я знаю про Log.d(имя лога, ошибка), но куда и как надо его вставить?

Добавлено через 3 минуты
тестирую на смартфоне с помощью AIDE
YuraAAA
 Аватар для YuraAAA
1563 / 1305 / 269
Регистрация: 25.10.2009
Сообщений: 3,424
Записей в блоге: 2
12.05.2014, 16:18     Почему Canvas не выводит текст? #4
phpk, в самой IDE. Когда приложение падает на телефоне(подключённом к ПК)/эмуляторе, то в логах появляется стек трейс с ошибкой.
KillAndEat
63 / 63 / 8
Регистрация: 17.05.2013
Сообщений: 286
13.05.2014, 14:17     Почему Canvas не выводит текст? #5
YuraAAA, у меня эклипс иногда глючит и не показывает логи. Я в таком случае нахожу примерное место ошибки и заключаю его вот в такую конструкцию

Java
1
2
3
4
5
try {
    
} catch (IOException e) {
   Log.d(LOG_TAG, "IOException");
   e.printStackTrace();}
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,005
14.05.2014, 19:21  [ТС]     Почему Canvas не выводит текст? #6
Вот код, который как я говорил выдаёт ошибку после закрытия! "В приложении "MyGame" произошла ошибка"
И надпись в самом приложении "hello" появляется через секунд 3-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
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package com.mycompany.game;
 
import android.app.*;
import android.os.*;
import android.view.*;
import android.widget.*;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.graphics.Paint.Style;
import android.util.Log;
import android.view.View;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.View.OnTouchListener;
import android.view.MotionEvent;
import android.nfc.*;
 
public class MainActivity extends Activity
{
    MySurface surface = null;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        
         
        surface = new MySurface(this);
        setContentView(surface);
    }
    
////////////////////
////////////////////
    public class MySurface extends SurfaceView 
    implements SurfaceHolder.Callback, OnTouchListener
    {
        MyThread thread = null;
        SurfaceHolder holder;
        private static final String TAG = "test";
 
        MySurface(Context context)
        {
            super(context);
            
            holder = getHolder();
            holder.addCallback(this);
            
            thread = new MyThread(holder);
            
            setOnTouchListener(this);
            
        }
 
        @Override
        public void surfaceCreated(SurfaceHolder p1)
        {
            // TODO: Implement this method
            
            try{
                thread.running = true;
                thread.start();
            }catch(Exception e){
            //  e.printStackTrace();
            }
            //Log.d(TAG,"create");
        }
 
        @Override
        public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4)
        {
            // TODO: Implement this method
        }
 
        @Override
        public void surfaceDestroyed(SurfaceHolder p1)
        {
            // TODO: Implement this method
            boolean retry = true;
            
            thread.running = false;
            
            while (retry)
            {
                try
                {
                    thread.join();
                    retry = false;
                    Log.d(TAG,"surfacedelete");
                }
                catch (InterruptedException e)  {
                    //Log.d(TAG, e.getMessage());
                    //e.printStackTrace();
                    
                }
            }
        }
 
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            
            return false;
        }
    }
    
    /////////////////
    /////////////////
    public class MyThread extends Thread
    {
        boolean running = false;
        Paint p;
        SurfaceHolder holder;
 
        MyThread(SurfaceHolder h){
            holder = h;
            p = new Paint();
            //running = true;
            //Log.d("thread","constr");
        }
 
 
        public void setRunning(boolean r){
            running = r;
        }
 
        @Override
        public void run()
        {
            // TODO: Implement this method
            p.setColor(Color.RED);
            
            while (running)
            {
                Canvas canv = null;
                try
                {
 
                    canv = holder.lockCanvas();
                    synchronized(holder){
                        canv.drawText("hello",260,500, p);
                        
                    }
                    //  Thread.sleep(100);
                
                }catch (Exception e){}
                finally{
                    //if(canv != null)
                        holder.unlockCanvasAndPost(canv);}
                //}catch(Exception e){}
                
            }
        }
 
 
    }
    
}
а вот логи:
...
... D dalvikvm com.mycompany.game threadid=13: exiting
... W dalvikvm com.mycompany.game threadid=13: thread exiting with uncaught exception (group=0x41fb39a8)
... E AndroidRuntime dalvikvm com.mycompany.game FATAL EXCEPTION: Thread-3725
... E AndroidRuntime dalvikvm com.mycompany.game java.lang.IllegalArgumentException
... E AndroidRuntime dalvikvm com.mycompany.game at android.view.Surface.nativeUnlockCanvasAndPost(Native Method)
... E AndroidRuntime dalvikvm com.mycompany.game at android.view.Surface.unlockCanvasAndPost(Surface.java:459)
... E AndroidRuntime dalvikvm com.mycompany.game at android.view.SurfaceView$4.unlockCanvasAndPost(SurfaceView.java:859)
... E AndroidRuntime dalvikvm com.mycompany.game at com.mycompany.game.MainActivity$MyThread.run(MainActivity.java:155)


кстати, если в коде раскомментировать строку 154 , то ошибку не выдаёт!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 19:59     Почему Canvas не выводит текст?
Еще ссылки по теме:

Android Столкновения на canvas
Android Как рисовать текст на Canvas во View?
Android Как сделать так, чтобы вводимый текст сразу же рисовался в canvas?
Потоки. Canvas Android
Почему не обнавляются preferences без перезапуска Activity (Canvas) Android

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

Или воспользуйтесь поиском по форуму:
phpk
25 / 25 / 6
Регистрация: 15.05.2013
Сообщений: 1,005
15.05.2014, 19:59  [ТС]     Почему Canvas не выводит текст? #7
так подскажите почему надпись появляется не сразу, а через секунды 3-4?
Это даже если 154 строка раскомментирована!
Yandex
Объявления
15.05.2014, 19:59     Почему Canvas не выводит текст?
Ответ Создать тему
Опции темы

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