1 2# Quick overview 3 4Here you can learn the most important things about LVGL. 5You should read this first to get a general impression and read the detailed [Porting](/porting/index) and [Overview](/overview/index) sections after that. 6 7## Get started in a simulator 8 9Instead of porting LVGL to embedded hardware straight away, it's highly recommended to get started in a simulator first. 10 11LVGL is ported to many IDEs to be sure you will find your favorite one. 12Go to the [Simulators](/get-started/pc-simulator) section to get ready-to-use projects that can be run on your PC. 13This way you can save the time of porting for now and get some experience with LVGL immediately. 14 15## Add LVGL into your project 16If you would rather try LVGL on your own project follow these steps: 17 18- [Download](https://github.com/lvgl/lvgl/archive/master.zip) or clone the library from GitHub with `git clone https://github.com/lvgl/lvgl.git`. 19- Copy the `lvgl` folder into your project. 20- Copy `lvgl/lv_conf_template.h` as `lv_conf.h` next to the `lvgl` folder, change the first `#if 0` to `1` to enable the file's content and set the `LV_COLOR_DEPTH` defines. 21- Include `lvgl/lvgl.h` in files where you need to use LVGL related functions. 22- Call `lv_tick_inc(x)` every `x` milliseconds in a Timer or Task (`x` should be between 1 and 10). It is required for the internal timing of LVGL. 23Alternatively, configure `LV_TICK_CUSTOM` (see `lv_conf.h`) so that LVGL can retrieve the current time directly. 24- Call `lv_init()` 25- Create a draw buffer: LVGL will render the graphics here first, and send the rendered image to the display. 26The buffer size can be set freely but 1/10 screen size is a good starting point. 27```c 28static lv_disp_draw_buf_t draw_buf; 29static lv_color_t buf1[DISP_HOR_RES * DISP_VER_RES / 10]; /*Declare a buffer for 1/10 screen size*/ 30lv_disp_draw_buf_init(&draw_buf, buf1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_SER / 10); /*Initialize the display buffer.*/ 31``` 32- Implement and register a function which can copy the rendered image to an area of your display: 33```c 34static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ 35lv_disp_drv_init(&disp_drv); /*Basic initialization*/ 36disp_drv.flush_cb = my_disp_flush; /*Set your driver function*/ 37disp_drv.draw_buf = &draw_buf; /*Assign the buffer to the display*/ 38disp_drv.hor_res = MY_DISP_HOR_RES; /*Set the horizontal resolution of the display*/ 39disp_drv.ver_res = MY_DISP_VER_RES; /*Set the vertical resolution of the display*/ 40lv_disp_drv_register(&disp_drv); /*Finally register the driver*/ 41 42void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p) 43{ 44 int32_t x, y; 45 /*It's a very slow but simple implementation. 46 *`set_pixel` needs to be written by you to a set pixel on the screen*/ 47 for(y = area->y1; y <= area->y2; y++) { 48 for(x = area->x1; x <= area->x2; x++) { 49 set_pixel(x, y, *color_p); 50 color_p++; 51 } 52 } 53 54 lv_disp_flush_ready(disp); /* Indicate you are ready with the flushing*/ 55} 56 57``` 58- Implement and register a function which can read an input device. E.g. for a touchpad: 59```c 60static lv_indev_drv_t indev_drv; /*Descriptor of a input device driver*/ 61lv_indev_drv_init(&indev_drv); /*Basic initialization*/ 62indev_drv.type = LV_INDEV_TYPE_POINTER; /*Touch pad is a pointer-like device*/ 63indev_drv.read_cb = my_touchpad_read; /*Set your driver function*/ 64lv_indev_drv_register(&indev_drv); /*Finally register the driver*/ 65 66void my_touchpad_read(lv_indev_t * indev, lv_indev_data_t * data) 67{ 68 /*`touchpad_is_pressed` and `touchpad_get_xy` needs to be implemented by you*/ 69 if(touchpad_is_pressed()) { 70 data->state = LV_INDEV_STATE_PRESSED; 71 touchpad_get_xy(&data->point.x, &data->point.y); 72 } else { 73 data->state = LV_INDEV_STATE_RELEASED; 74 } 75 76} 77``` 78- Call `lv_timer_handler()` periodically every few milliseconds in the main `while(1)` loop or in an operating system task. 79It will redraw the screen if required, handle input devices, animation etc. 80 81For a more detailed guide go to the [Porting](/porting/index) section. 82 83## Learn the basics 84 85### Widgets 86 87The graphical elements like Buttons, Labels, Sliders, Charts etc. are called objects or widgets. Go to [Widgets](/widgets/index) to see the full list of available widgets. 88 89Every object has a parent object where it is created. For example, if a label is created on a button, the button is the parent of label. 90 91The child object moves with the parent and if the parent is deleted the children will be deleted too. 92 93Children can be visible only within their parent's bounding area. In other words, the parts of the children outside the parent are clipped. 94 95A Screen is the "root" parent. You can have any number of screens. 96 97To get the current screen call `lv_scr_act()`, and to load a screen use `lv_scr_load(scr1)`. 98 99You can create a new object with `lv_<type>_create(parent)`. It will return an `lv_obj_t *` variable that can be used as a reference to the object to set its parameters. 100 101For example: 102```c 103lv_obj_t * slider1 = lv_slider_create(lv_scr_act()); 104``` 105 106To set some basic attributes `lv_obj_set_<parameter_name>(obj, <value>)` functions can be used. For example: 107```c 108lv_obj_set_x(btn1, 30); 109lv_obj_set_y(btn1, 10); 110lv_obj_set_size(btn1, 200, 50); 111``` 112 113Along with the basic attributes, widgets can have type specific parameters which are set by `lv_<widget_type>_set_<parameter_name>(obj, <value>)` functions. For example: 114```c 115lv_slider_set_value(slider1, 70, LV_ANIM_ON); 116``` 117 118To see the full API visit the documentation of the widgets or the related header file (e.g. [lvgl/src/widgets/lv_slider.h](https://github.com/lvgl/lvgl/blob/master/src/widgets/lv_slider.h)). 119 120 121 122### Events 123Events are used to inform the user that something has happened with an object. 124You can assign one or more callbacks to an object which will be called if the object is clicked, released, dragged, being deleted, etc. 125 126A callback is assigned like this: 127 128```c 129lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL); /*Assign a callback to the button*/ 130 131... 132 133void btn_event_cb(lv_event_t * e) 134{ 135 printf("Clicked\n"); 136} 137``` 138 139`LV_EVENT_ALL` can be used instead of `LV_EVENT_CLICKED` to invoke the callback for any event. 140 141From `lv_event_t * e` the current event code can be retrieved with: 142```c 143lv_event_code_t code = lv_event_get_code(e); 144``` 145 146The object that triggered the event can be retrieved with: 147```c 148lv_obj_t * obj = lv_event_get_target(e); 149``` 150 151To learn all features of the events go to the [Event overview](/overview/event) section. 152 153### Parts 154Widgets might be built from one or more *parts*. For example, a button has only one part called `LV_PART_MAIN`. 155However, a [Slider](/widgets/core/slider) has `LV_PART_MAIN`, `LV_PART_INDICATOR` and `LV_PART_KNOB`. 156 157By using parts you can apply different styles to sub-elements of a widget. (See below) 158 159Read the widgets' documentation to learn which parts each uses. 160 161### States 162LVGL objects can be in a combination of the following states: 163- `LV_STATE_DEFAULT` Normal, released state 164- `LV_STATE_CHECKED` Toggled or checked state 165- `LV_STATE_FOCUSED` Focused via keypad or encoder or clicked via touchpad/mouse 166- `LV_STATE_FOCUS_KEY` Focused via keypad or encoder but not via touchpad/mouse 167- `LV_STATE_EDITED` Edit by an encoder 168- `LV_STATE_HOVERED` Hovered by mouse (not supported now) 169- `LV_STATE_PRESSED` Being pressed 170- `LV_STATE_SCROLLED` Being scrolled 171- `LV_STATE_DISABLED` Disabled 172 173For example, if you press an object it will automatically go to the `LV_STATE_FOCUSED` and `LV_STATE_PRESSED` states and when you release it the `LV_STATE_PRESSED` state will be removed while focus remains active. 174 175To check if an object is in a given state use `lv_obj_has_state(obj, LV_STATE_...)`. It will return `true` if the object is currently in that state. 176 177To manually add or remove states use: 178```c 179lv_obj_add_state(obj, LV_STATE_...); 180lv_obj_clear_state(obj, LV_STATE_...); 181``` 182 183### Styles 184A style instance contains properties such as background color, border width, font, etc. that describe the appearance of objects. 185 186Styles are represented with `lv_style_t` variables. Only their pointer is saved in the objects so they need to be defined as static or global. 187Before using a style it needs to be initialized with `lv_style_init(&style1)`. After that, properties can be added to configure the style. For example: 188``` 189static lv_style_t style1; 190lv_style_init(&style1); 191lv_style_set_bg_color(&style1, lv_color_hex(0xa03080)) 192lv_style_set_border_width(&style1, 2)) 193``` 194See the full list of properties [here](/overview/style.html#properties). 195 196 197Styles are assigned using the ORed combination of an object's part and state. For example to use this style on the slider's indicator when the slider is pressed: 198```c 199lv_obj_add_style(slider1, &style1, LV_PART_INDICATOR | LV_STATE_PRESSED); 200``` 201 202If the *part* is `LV_PART_MAIN` it can be omitted: 203```c 204lv_obj_add_style(btn1, &style1, LV_STATE_PRESSED); /*Equal to LV_PART_MAIN | LV_STATE_PRESSED*/ 205``` 206 207Similarly, `LV_STATE_DEFAULT` can be omitted too: 208```c 209lv_obj_add_style(slider1, &style1, LV_PART_INDICATOR); /*Equal to LV_PART_INDICATOR | LV_STATE_DEFAULT*/ 210``` 211 212For `LV_STATE_DEFAULT` and `LV_PART_MAIN` simply write `0`: 213```c 214lv_obj_add_style(btn1, &style1, 0); /*Equal to LV_PART_MAIN | LV_STATE_DEFAULT*/ 215``` 216 217 218Styles can be cascaded (similarly to CSS). It means you can add more styles to a part of an object. 219For example `style_btn` can set a default button appearance, and `style_btn_red` can overwrite the background color to make the button red: 220```c 221lv_obj_add_style(btn1, &style_btn, 0); 222lv_obj_add_style(btn1, &style1_btn_red, 0); 223``` 224 225 226If a property is not set on for the current state, the style with `LV_STATE_DEFAULT` will be used. A default value is used if the property is not defined in the default state. 227 228Some properties (typically the text-related ones) can be inherited. This means if a property is not set in an object it will be searched for in its parents too. 229For example, you can set the font once in the screen's style and all text on that screen will inherit it by default. 230 231 232Local style properties also can be added to objects. This creates a style which resides inside the object and is used only by the object: 233```c 234lv_obj_set_style_bg_color(slider1, lv_color_hex(0x2080bb), LV_PART_INDICATOR | LV_STATE_PRESSED); 235``` 236 237To learn all the features of styles see the [Style overview](/overview/style) section. 238 239 240### Themes 241 242Themes are the default styles for objects. Styles from a theme are applied automatically when objects are created. 243 244The theme for your application is a compile time configuration set in `lv_conf.h`. 245 246## Examples 247 248```eval_rst 249 250.. include:: ../../examples/get_started/index.rst 251``` 252 253## Micropython 254Learn more about [Micropython](/get-started/micropython). 255```python 256# Create a Button and a Label 257scr = lv.obj() 258btn = lv.btn(scr) 259btn.align(lv.scr_act(), lv.ALIGN.CENTER, 0, 0) 260label = lv.label(btn) 261label.set_text("Button") 262 263# Load the screen 264lv.scr_load(scr) 265``` 266 267