Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,075
#1

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

12.05.2014, 15:05. Просмотров 648. Ответов 6
Метки нет (Все метки)

В коде, приведённом ниже вроде всё правильно, но не пойму, почему не выводится текст!
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" появляется не сразу, а через пару секунд?
И почему при закрытии появляется ошибка "Ошибка в приложении"?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2014, 15:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему Canvas не выводит текст? (Программирование Android):

Как рисовать текст на Canvas во View? - Программирование Android
Есть ImageView. Я делаю так: Canvas canvas; canvas = new Canvas(); canvas.drawText("Текст", 0, 0, null); А потом уже: ...

Почему не обнавляются preferences без перезапуска Activity (Canvas) - Программирование Android
Подскажите где я что пропустила? Вот мой canvas. В самом низу переменная "Значение списка - " + prefs не хочет обнавляться сразу после...

Как сделать так, чтобы вводимый текст сразу же рисовался в canvas? - Программирование Android
Допустим, у меня в верхней части экрана EditText, а внизу область рисования. Я хочу, чтобы текст, введенный в EditText, одновременно...

Отрисовоку выводит за ошибку почему? - Программирование Android
проблема, должно выводится кол-во попаданий и процент и т .д но почему то пейнт выводит за ошибку в чем может быть причина?

Подскажите почему не выводит данные в textview из sqlite - Программирование Android
У меня есть две активности helper и helperRec На первой есть глобальная переменная public static String namerec, в нее при вводе данных в...

выводит число как текст почему-то - MS Access
Связываю текстовые файлы с аксес, в предъимпорте поля указываю формат "двойное с плавающей точкой". В запросах проблем нет, обрабатывает и...

6
YuraAAA
1577 / 1318 / 271
Регистрация: 25.10.2009
Сообщений: 3,438
Записей в блоге: 2
12.05.2014, 15:15 #2
phpk, давайте стек трейс с ошибкой
0
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,075
12.05.2014, 16:06  [ТС] #3
Цитата Сообщение от YuraAAA Посмотреть сообщение
phpk, давайте стек трейс с ошибкой
не сочтите за наглость, но подскажите пожалуйста, как создать этот стек трейс?
В будущем буду пользоваться, если научите.
Я знаю про Log.d(имя лога, ошибка), но куда и как надо его вставить?

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

Java
1
2
3
4
5
try {
    
} catch (IOException e) {
   Log.d(LOG_TAG, "IOException");
   e.printStackTrace();}
1
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,075
14.05.2014, 19:21  [ТС] #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 , то ошибку не выдаёт!
0
phpk
26 / 26 / 6
Регистрация: 15.05.2013
Сообщений: 1,075
15.05.2014, 19:59  [ТС] #7
так подскажите почему надпись появляется не сразу, а через секунды 3-4?
Это даже если 154 строка раскомментирована!
0
15.05.2014, 19:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 19:59
Привет! Вот еще темы с ответами:

Почему не выводит текст из файла (CP1251)? - C++
#include <iostream> #include <fstream> #include <string> #include <locale> using namespace std; int main() { ...

Почему не выводит текст из файла (CP1251)? - C++ Linux
Почему не выводит текст из файла (CP1251)? #include <iostream> #include <fstream> #include <string> #include <locale> using...

Почему не выводит текст в textarea при шифровке? - JavaScript
Здраствуйте! Помогите пожалуйста, в чем ошибка? При шифровке текста на англ языке все выводится и шифрует нормально - del При...

Почему echo не выводит текст "-n" - Bash
Здрасти, пытаюсь разобрать параметры скрипта, но по какой-то причине параметр -n игнорируется, хотя echo "n" выпишет n, есть у кого идеи...


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

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

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