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

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

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

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

10.09.2012, 16:22. Просмотров 1426. Ответов 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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 16:22     Неуправляемый onDraw в отдельном View компоненте
Посмотрите здесь:

Android Как из Thread в отдельном классе получить context приложения?
Как толкнуть одной фигурой другую в методе onDraw Android
Android Рисование в отдельном Layout
Android Создание view элементов в отдельном потоке
Android Выполнение кода в отдельном потоке
Не получается вызвать метод onDraw(); Android
Android В чем разница (View view) и (View v)
Android Сервис в отдельном процессе
Android Тип view
Public void onClick(View view) Android
Android Не получается открыть диалоговое окно, созданное в отдельном классе
Отрисовка данных в отдельном потоке Android

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

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

Добавлено через 6 минут
таки да, setBackgroundDrawable вызывает invalidate.
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
11.09.2012, 16:40  [ТС]     Неуправляемый onDraw в отдельном View компоненте #3
спасибо огромное .
Yandex
Объявления
11.09.2012, 16:40     Неуправляемый onDraw в отдельном View компоненте
Ответ Создать тему
Опции темы

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