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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
Android Нужна Программа! http://www.cyberforum.ru/android-dev/thread649328.html
Всем привет. Нужна программа сервер-клиент. Клиент должен работать на Android и желательно Symbian OS. Нужно получать GPS координаты от клиента. Хорошее вознаграждение! Предложения в личку. Спасибо
Android Сохранение изменений в xml файл Задача. Допустим, имеется xml файл расположенный в "res\xml\shop_items.xml". С парсингом файла проблем не возникает. Изучил работу с XmlPullParser (но могу переделать все и под DOM парсер). Да, данные извлекает, все отлично. Но, встал вопрос о том, КАК ВНЕСТИ ИЗМЕНЕНИЯ В ФАЙЛ? (Капсом написал ибо уже до истерики дошел, честно :( ). Я уже курил мануалы и от ibm и на stackoverflow и что-то... http://www.cyberforum.ru/android-dev/thread649250.html
Приложение собирающее показания с акселерометра в SQlite базу Android
Помогите пожалуйста найти ошибку в коде. Когда работаю с проектом вроде всё нормально компилируется, а запускаю .apk файл пишется ошибка "При синтаксическом анализе пакета возникли неполадки". package com.dimond.acc; import java.io.File; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import...
Создание приложения для просмотра видео в интернете Android
Всем привет!) С каждым днем операционная система Android становится все популярнее у большого числа людей) Я бы хотел разработать программу для просмотра видео с сайтов через телефон, смартфон, которая бы встраивалась в браузер Opera Mini в виде дополнения) При переходе с мобильного телефона на сайт, в котором находятся ролики, при нажатии на них, программа-плагин активизировалась и...
Android ScrollView с динамическими представлениями http://www.cyberforum.ru/android-dev/thread648937.html
Доброго времени суток! Есть scrollview, создаю его в xml. Нужно в нем разместить динамически несколько textview и button. Располагаться они должны в виде текста: tv, bt, tv, bt.... При создании не происходит перевода на новую строку, объекты создаются дальше, уходя за экран. Как решить данную проблему? Спасибо)
Android библиотека Проблема следующая: создал библиотеку, которая содержит в себе некоторую логику и собственные элементы интерфейса. В частности, для одного из графических элементов использовался ViewPager, для чего к библиотеке была подключена библиотека support-v4. К моим до этого написанным проектом моя библиотека подключилась нормально. Потом я решил создать тестовый проект и поэксперементировать. Однако при... подробнее

Показать сообщение отдельно
Ataman
 Аватар для Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33

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

10.09.2012, 16:22. Просмотров 1412. Ответов 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;
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 12:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru