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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
#1

Неуправляемый onDraw в отдельном View компоненте - Программирование Android

10.09.2012, 16:22. Просмотров 1494. Ответов 2
Метки нет (Все метки)

Здравствуйте, у меня такая проблема -> не контролируемый onDraw (я убрал invalidate со всех функций), везде читал об этом, уже потерял все надежды найти причину такого бесконечного вызова onDraw.
В активити создаю отдельный View компонент и в этом отдельном классе по завершению onCreate метода вызывается 4 раза invalidate а потом входит в бесконечный цикл вызов onDraw метода. Не было никаких касаний экрана или вызов функций перед этим. Возможно какой то метод библиотеки создает такую "рекурсию" ??

GameView - onCreate finish
invalidate
invalidate
invalidate
invalidate
GameView - ondDraw start
GameView - ondDraw finish
invalidate
GameView - ondDraw start
GameView - ondDraw finish
invalidate

..
..


В кратце опишу архитектуру.
в MainActivity идет прорисовка меню на канве в onDraw компонента view, с этого главного активити вызывается другой активити - GameActivity который так же реализует свой view компонент где идет прорисовка на канве.

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
165
public class GameActivity extends Activity {
    ........
    private GameView mGameView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
            ...........
        
        mGameView=new GameView(this, .........);
        setContentView(mGameView);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mGameView!=null) {
            mGameView.Destroy();
            mGameView=null;
        }
    }
}
 
/////////////////////////////////////////////////////
 
public class GameView extends View {
        ...
        public GameView(Context context, ........) {
                super(context);
                setFocusable(true);
                setFocusableInTouchMode(true);
 
                //get window size
                WindowManager wm=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
                Display display = wm.getDefaultDisplay();
                winHeight=display.getHeight();
                winWidth=display.getWidth();
 
                //load images
                bmpStar=BitmapFactory.decodeResource(getResources(), R.drawable.star);
                bmpSun=BitmapFactory.decodeResource(getResources(), R.drawable.sun);
                bmpWin=BitmapFactory.decodeResource(getResources(), R.drawable.marked_win);
 
        //score format
        scorePaint=new Paint();
        scorePaint.setTextSize(36);
        scorePaint.setTextAlign(Align.CENTER);
        scorePaint.setStyle(Style.FILL);
        scorePaint.setAntiAlias(true);
 
                Log.d(TAG2, "GameView - onCreate finish");
        }
 
    @Override
    public void onDraw(Canvas canvas) {
        Log.d(TAG2, "GameView - ondDraw start");
        this.setBackgroundDrawable(gameFont);
        
        //draw square cells
        for(byte i=0; i<3; i++) {
            for(byte j=0; j<3; j++) {
                if(gLogic.square[i][j]==gLogic.STAR) canvas.drawBitmap(bmpStar, null, cellRect[i][j], null);
                if(gLogic.square[i][j]==gLogic.SUN) canvas.drawBitmap(bmpSun, null, cellRect[i][j], null);
            }
        }
        
        drawMarkedWin(canvas);
        
        //draw bottom menu
        btnNewGame.SetPosition(0, (int)(winHeight-(winHeight*0.075)));
        btnNewGame.SetButtonBounds();
        btnNewGame.DrawButton(canvas);
        
        btnBack.SetPosition((int)(winWidth/3)*2, (int)(winHeight-(winHeight*0.075)));
        btnBack.SetButtonBounds();
        btnBack.DrawButton(canvas);
        
        btnStats.SetPosition((int)(winWidth/3)+15, (int)(winHeight-(winHeight*0.075)));
        btnStats.SetButtonBounds();
        btnStats.DrawButton(canvas);
        
        btnSound.SetPosition((int)(winWidth/3)+((winWidth/3)/2 + 10), (int)(winHeight-(winHeight*0.075)));
        btnSound.SetButtonBounds();
        btnSound.DrawButton(canvas);
        //finish bottom menu
        
        //print little icons of players' set images
        canvas.drawBitmap(getResizedBitmap(bmpStar, (int)(winHeight*0.05), (int)(winHeight*0.05)), (float)(winWidth/3-(winHeight*0.05625/2)), (float)(winHeight-(0.29375*winHeight)), null);
        canvas.drawBitmap(getResizedBitmap(bmpSun, (int)(winHeight*0.05625), (int)(winHeight*0.05625)), (float)(winWidth-(winWidth/3)-(winHeight*0.05625/2)), (float)(winHeight-(0.29375*winHeight)), null);
        
        //print scores
        scorePaint.setColor(getResources().getColor(R.color.light_green));
        canvas.drawText(gLogic.starScore + "", (float)0.20834*winWidth, (float)(winHeight-(0.26875*winHeight)), scorePaint);
        scorePaint.setColor(getResources().getColor(R.color.orange_medium));
        canvas.drawText(gLogic.sunScore + "", (float)(winWidth-(0.20834*winWidth)), (float)(winHeight-(0.26875*winHeight)), scorePaint);
        scorePaint.setColor(Color.LTGRAY);
        canvas.drawText(gLogic.tieScore + "", (float)winWidth/2, (float)(winHeight-(0.2125*winHeight)), scorePaint);
        
        Log.d(TAG2, "GameView - ondDraw finish");
    }
    
    private void drawMarkedWin(Canvas canvas) {
        if(gLogic.roundOver && gLogic.markWinID!=0) {
            Bitmap bmp=Bitmap.createBitmap(bmpWin, 0, 0, bmpWin.getWidth(), bmpWin.getHeight(), null, true);
                        ...........
            
            canvas.drawBitmap(bmp, rotateOptions(degree, (int)x, (int)y), null);
            bmp.recycle();
        }
    }
 
    public void Destroy() {
        if(gLogic!=null) gLogic=null;
        if(bmpStar!=null) bmpStar=null;
        if(bmpSun!=null) bmpSun=null;
        if(bmpWin!=null) bmpWin=null;
    }
    
    public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);
 
        // RECREATE THE NEW BITMAP
        Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
        return resizedBitmap;
    }
 
    @Override
    public void invalidate() {
        Log.d(TAG2, "invalidate");
    }
 
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        if(e.getAction()==MotionEvent.ACTION_DOWN) {
            Log.d(TAG, "onTouchEvent");
            touchX=e.getX();
            touchY=e.getY();
            if(touchY > stBoardY && touchY < finBoardY && !gLogic.roundOver) {
                Log.d(TAG, "onTouchEvent - kasanie v pole");
                doTurn();
            }
        }
        if(btnNewGame.OnTouchButton((int)e.getX(), (int)e.getY())) {
            gLogic.newGame();
            if(!multiplayer && !user1Turn) doTurn();
        }
        if(btnBack.OnTouchButton((int)e.getX(), (int)e.getY())) {
            setFocusable(false);
            clearFocus();
            ((GameActivity)getContext()).finish();
        }
            
        return true;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 16:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неуправляемый onDraw в отдельном View компоненте (Программирование Android):

Создание view элементов в отдельном потоке - Программирование Android
Беру данные из интернета и делаю блоки. Если информации довольно много то при запуске активности(где создаются эти блоки) сначала...

В чем разница (View view) и (View v) - Программирование Android
Я только начинаю изучать программирование под андроид (до этого вобще программированием не занимался), по гуглу удалось найти только...

Не получается вызвать метод onDraw(); - Программирование Android
Здравствуйте! Я новичок в разработке приложений под android и сегодня безрезультатно провел день, т.к. не знаю решения моей проблемы....

Как толкнуть одной фигурой другую в методе onDraw - Программирование Android
Здравствуйте.Я на этом форуме новенький.Это мое первое сообщение,так что если формат формулировки не совсем правильный,попрошу меня...

Public void onClick(View view) - Программирование Android
Не работает public void onClick(View view) :wall: public class MainActivity extends AppCompatActivity implements View.OnClickListener...

View вытесняет другое view из activity - Программирование Android
После второго EditText должна располагаться кнопка. Но почему-то этот второй EditText выпихивает ее из activity. Что не так?

2
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
10.09.2012, 21:42 #2
Цитата Сообщение от Ataman Посмотреть сообщение
public void onDraw(Canvas canvas) {
this.setBackgroundDrawable(gameFont);
В методе setBackgroundDrawable вполне может вызываться invalidate после которого происходит onDraw который вызывает setBackgroundDrawable который вызывает invalidate .... рекурсия)
аналогично с setText в onDraw.

Добавлено через 6 минут
таки да, setBackgroundDrawable вызывает invalidate.
1
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
11.09.2012, 16:40  [ТС] #3
спасибо огромное .
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 16:40
Привет! Вот еще темы с ответами:

Посоветуйте пожалуйста! Как мне в компоненте ComboBox2 Организовать смену шрифтов в компоненте Memo1? - C++ Builder
Всем заранее спасибо!!!!!!! void __fastcall TForm1::ComboBox2Change(TObject *Sender) { }

ListView OnDraw + OnPaint - C#
Как сделать что б работали оба переопредиления? protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e); ...

MFC. OnDraw. Brush и Pen - Visual C++
Здравствуйте! Разбираюсь в MFC по книге Microsoft Visual C++ Windows Applications by Example, автор Stefan Björnander. Использую...

Круги в OnDraw без заливки - C++ WinAPI
Доброго дня всем. Подскажите, пожалуйста, как рисовать эллипсы, чтоб они не зарисовывали ничего внутри? Получается так А нужно чтобы...


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

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

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