几个月之前,接触Android recovery源代码的时候,看ScreenRecoveryUI类的时候,那时候C++基础还不是特别好,一直不明白以下的初始化方式:
下面这个是Recovery的一个构造函数,代码位于:screen_ui.cpp,它的类的实现在screen_ui.h。
如下这个ScreenRecoveryUI类,这个类是继承于RecoveryUI类的:
这个文件在screen_ui.h
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
|
class ScreenRecoveryUI : public RecoveryUI {
public :
ScreenRecoveryUI();
void Init();
void SetLocale( const char * locale);
// overall recovery state ("background image")
void SetBackground(Icon icon);
// progress indicator
void SetProgressType(ProgressType type);
void ShowProgress( float portion, float seconds);
void SetProgress( float fraction);
void SetStage( int current, int max);
// text log
void ShowText( bool visible);
bool IsTextVisible();
bool WasTextEverVisible();
// printing messages
void Print( const char * fmt, ...) __printflike(2, 3);
void ShowFile( const char * filename);
// menu display
void StartMenu( const char * const * headers, const char * const * items,
int initial_selection);
int SelectMenu( int sel);
void EndMenu();
void KeyLongPress( int );
void Redraw();
enum UIElement {
HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
};
void SetColor(UIElement e);
private :
Icon currentIcon;
int installingFrame;
const char * locale;
bool rtl_locale;
pthread_mutex_t updateMutex;
GRSurface* backgroundIcon[5];
GRSurface* backgroundText[5];
GRSurface** installation;
GRSurface* progressBarEmpty;
GRSurface* progressBarFill;
GRSurface* stageMarkerEmpty;
GRSurface* stageMarkerFill;
ProgressType progressBarType;
float progressScopeStart, progressScopeSize, progress;
double progressScopeTime, progressScopeDuration;
// true when both graphics pages are the same (except for the progress bar).
bool pagesIdentical;
size_t text_cols_, text_rows_;
// Log text overlay, displayed when a magic key is pressed.
char ** text_;
size_t text_col_, text_row_, text_top_;
bool show_text;
bool show_text_ever; // has show_text ever been true?
char ** menu_;
const char * const * menu_headers_;
bool show_menu;
int menu_items, menu_sel;
// An alternate text screen, swapped with 'text_' when we're viewing a log file.
char ** file_viewer_text_;
pthread_t progress_thread_;
int animation_fps;
int installing_frames;
int iconX, iconY;
int stage, max_stage;
void draw_background_locked(Icon icon);
void draw_progress_locked();
void draw_screen_locked();
void update_screen_locked();
void update_progress_locked();
static void * ProgressThreadStartRoutine( void * data);
void ProgressThreadLoop();
void ShowFile( FILE *);
void PutChar( char );
void ClearText();
void DrawHorizontalRule( int * y);
void DrawTextLine( int * y, const char * line, bool bold);
void DrawTextLines( int * y, const char * const * lines);
void LoadBitmap( const char * filename, GRSurface** surface);
void LoadBitmapArray( const char * filename, int * frames, GRSurface*** surface);
void LoadLocalizedBitmap( const char * filename, GRSurface** surface);
};
|
下面是这个类的构造函数的实现,其中构造函数就采用了初始化列表的方式来初始化字段,以下构造函数的实现在screen_ui.cpp文件中可以找到。
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
|
ScreenRecoveryUI::ScreenRecoveryUI() :
currentIcon(NONE),
installingFrame(0),
locale(nullptr),
rtl_locale( false ),
progressBarType(EMPTY),
progressScopeStart(0),
progressScopeSize(0),
progress(0),
pagesIdentical( false ),
text_cols_(0),
text_rows_(0),
text_(nullptr),
text_col_(0),
text_row_(0),
text_top_(0),
show_text( false ),
show_text_ever( false ),
menu_(nullptr),
show_menu( false ),
menu_items(0),
menu_sel(0),
file_viewer_text_(nullptr),
animation_fps(20),
installing_frames(-1),
stage(-1),
max_stage(-1) {
for ( int i = 0; i < 5; i++) {
backgroundIcon[i] = nullptr;
}
pthread_mutex_init(&updateMutex, nullptr);
}
|
可以来看看RecoveryUI类:
在ui.h中:
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
|
class RecoveryUI {
public :
RecoveryUI();
virtual ~RecoveryUI() { }
// Initialize the object; called before anything else.
virtual void Init();
// Show a stage indicator. Call immediately after Init().
virtual void SetStage( int current, int max) = 0;
// After calling Init(), you can tell the UI what locale it is operating in.
virtual void SetLocale( const char * locale) = 0;
// Set the overall recovery state ("background image").
enum Icon { NONE, INSTALLING_UPDATE, ERASING, NO_COMMAND, ERROR };
virtual void SetBackground(Icon icon) = 0;
// --- progress indicator ---
enum ProgressType { EMPTY, INDETERMINATE, DETERMINATE };
virtual void SetProgressType(ProgressType determinate) = 0;
// Show a progress bar and define the scope of the next operation:
// portion - fraction of the progress bar the next operation will use
// seconds - expected time interval (progress bar moves at this minimum rate)
virtual void ShowProgress( float portion, float seconds) = 0;
// Set progress bar position (0.0 - 1.0 within the scope defined
// by the last call to ShowProgress).
virtual void SetProgress( float fraction) = 0;
// --- text log ---
virtual void ShowText( bool visible) = 0;
virtual bool IsTextVisible() = 0;
virtual bool WasTextEverVisible() = 0;
// Write a message to the on-screen log (shown if the user has
// toggled on the text display).
virtual void Print( const char * fmt, ...) __printflike(2, 3) = 0;
virtual void ShowFile( const char * filename) = 0;
// --- key handling ---
// Wait for a key and return it. May return -1 after timeout.
virtual int WaitKey();
virtual bool IsKeyPressed( int key);
virtual bool IsLongPress();
// Returns true if you have the volume up/down and power trio typical
// of phones and tablets, false otherwise.
virtual bool HasThreeButtons();
// Erase any queued-up keys.
virtual void FlushKeys();
// Called on each key press, even while operations are in progress.
// Return value indicates whether an immediate operation should be
// triggered (toggling the display, rebooting the device), or if
// the key should be enqueued for use by the main thread.
enum KeyAction { ENQUEUE, TOGGLE, REBOOT, IGNORE };
virtual KeyAction CheckKey( int key, bool is_long_press);
// Called when a key is held down long enough to have been a
// long-press (but before the key is released). This means that
// if the key is eventually registered (released without any other
// keys being pressed in the meantime), CheckKey will be called with
// 'is_long_press' true.
virtual void KeyLongPress( int key);
// Normally in recovery there's a key sequence that triggers
// immediate reboot of the device, regardless of what recovery is
// doing (with the default CheckKey implementation, it's pressing
// the power button 7 times in row). Call this to enable or
// disable that feature. It is enabled by default.
virtual void SetEnableReboot( bool enabled);
// --- menu display ---
// Display some header text followed by a menu of items, which appears
// at the top of the screen (in place of any scrolling ui_print()
// output, if necessary).
virtual void StartMenu( const char * const * headers, const char * const * items,
int initial_selection) = 0;
// Set the menu highlight to the given index, wrapping if necessary.
// Returns the actual item selected.
virtual int SelectMenu( int sel) = 0;
// End menu mode, resetting the text overlay so that ui_print()
// statements will be displayed.
virtual void EndMenu() = 0;
protected :
void EnqueueKey( int key_code);
private :
// Key event input queue
pthread_mutex_t key_queue_mutex;
pthread_cond_t key_queue_cond;
int key_queue[256], key_queue_len;
char key_pressed[KEY_MAX + 1]; // under key_queue_mutex
int key_last_down; // under key_queue_mutex
bool key_long_press; // under key_queue_mutex
int key_down_count; // under key_queue_mutex
bool enable_reboot; // under key_queue_mutex
int rel_sum;
int consecutive_power_keys;
int last_key;
bool has_power_key;
bool has_up_key;
bool has_down_key;
struct key_timer_t {
RecoveryUI* ui;
int key_code;
int count;
};
pthread_t input_thread_;
void OnKeyDetected( int key_code);
static int InputCallback( int fd, uint32_t epevents, void * data);
int OnInputEvent( int fd, uint32_t epevents);
void ProcessKey( int key_code, int updown);
bool IsUsbConnected();
static void * time_key_helper( void * cookie);
void time_key( int key_code, int count);
};
ui.cpp中,也是采用字段初始化的方式来实现构造函数:
RecoveryUI::RecoveryUI()
: key_queue_len(0),
key_last_down(-1),
key_long_press( false ),
key_down_count(0),
enable_reboot( true ),
consecutive_power_keys(0),
last_key(-1),
has_power_key( false ),
has_up_key( false ),
has_down_key( false ) {
pthread_mutex_init(&key_queue_mutex, nullptr);
pthread_cond_init(&key_queue_cond, nullptr);
memset (key_pressed, 0, sizeof (key_pressed));
}
|
现在看明白了。
写一个测试案例看看就懂了,果然一例解千愁啊!
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
|
#include <iostream>
using namespace std ;
class ScreenRecoveryUI
{
private :
int r , g , b ;
char buffer[10] ;
char *p ;
public :
ScreenRecoveryUI();
void setvalue( int a , int b , int c);
void print();
};
//使用初始化列表的方式初始化构造函数里的私有环境变量
ScreenRecoveryUI::ScreenRecoveryUI():
r(0),
g(0),
b(0),
p(nullptr){
for ( int i = 0 ; i < 10 ; i++){
buffer[i] = 0 ;
}
}
void ScreenRecoveryUI::setvalue( int a , int b , int c)
{
this ->r = a ;
this ->g = b ;
this ->b = c ;
}
void ScreenRecoveryUI::print()
{
cout << "r:" << this ->r << endl << "g:" << this ->g << endl << "b:" << b << endl ;
}
int main( void )
{
ScreenRecoveryUI screen ;
screen.setvalue(255,255,0);
screen.print();
return 0 ;
}
|
运行结果:
r:255
g:255
b:0
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/morixinguan/article/details/74331335