「App:Library:LVGL:docs:Overview:Positions, sizes, and layouts」の版間の差分
18行目: | 18行目: | ||
* width/height means the full size, the "content area" is smaller with padding and border width | * width/height means the full size, the "content area" is smaller with padding and border width | ||
* a subset of flexbox and grid layouts are supported | * a subset of flexbox and grid layouts are supported | ||
− | | | + | |LVGLの他の多くの部分と同様に、座標の設定のコンセプトはCSSからヒントを得たものです。LVGLは決してCSSを完全に実装しているわけではありませんが、同等のサブセットを実装しています(時には細かい調整を加えています)。 |
+ | |||
+ | 要するにこれは | ||
+ | * 明示的に設定された座標はスタイル(サイズ、位置、レイアウトなど)に保存される | ||
+ | * min-width、max-width、min-height、max-heightをサポートする。 | ||
+ | * ピクセル単位、パーセント単位、コンテンツ単位がある。 | ||
+ | * x=0; y=0の座標は、親の左上隅、左/上パディング、ボーダー幅を意味します。 | ||
+ | * width/height はフルサイズを意味し、「コンテンツ領域」はパディングとボーダー幅で小さくなります。 | ||
+ | * フレックスボックスとグリッドレイアウトのサブセットをサポートしています。 | ||
|} | |} | ||
:[[App:Library:LVGL#Overview|戻る : Previous]] | :[[App:Library:LVGL#Overview|戻る : Previous]] | ||
33行目: | 41行目: | ||
* <code style="color: #bb0000;">LV_SIZE_CONTENT</code>: Special value to set the width/height of an object to involve all the children. It's similar to <code style="color: #bb0000;">auto</code> in CSS. E.g. <code style="color: #bb0000;">lv_obj_set_width(btn, LV_SIZE_CONTENT)</code>. | * <code style="color: #bb0000;">LV_SIZE_CONTENT</code>: Special value to set the width/height of an object to involve all the children. It's similar to <code style="color: #bb0000;">auto</code> in CSS. E.g. <code style="color: #bb0000;">lv_obj_set_width(btn, LV_SIZE_CONTENT)</code>. | ||
| | | | ||
+ | * ピクセル。単純にピクセル単位での位置。整数は常にピクセル単位を意味する。例:<code style="color: #bb0000;">lv_obj_set_x(btn, 10)</code> | ||
+ | * パーセンテージ。オブジェクトまたはその親(プロパティに依存)のサイズのパーセンテージ。<code style="color: #bb0000;">lv_pct(value)</code> は、値をパーセンテージに変換します。例:<code style="color: #bb0000;">lv_obj_set_width(btn, lv_pct(50))</code> | ||
+ | *<code style="color: #bb0000;">LV_SIZE_CONTENT</code>: オブジェクトの幅/高さを設定するための特別な値で、すべての子オブジェクトを巻き込みます。CSSのautoに似ている。例: <code style="color: #bb0000;">lv_obj_set_width(btn, LV_SIZE_CONTENT)</code>. | ||
|} | |} | ||
:[[App:Library:LVGL#Overview|戻る : Previous]] | :[[App:Library:LVGL#Overview|戻る : Previous]] | ||
56行目: | 67行目: | ||
The outline is drawn outside the bounding box. | The outline is drawn outside the bounding box. | ||
− | | | + | |LVGLはCSSのborder-boxモデルに従っています。オブジェクトの "box "は、以下のパーツから構成されます。 |
+ | |||
+ | * bounding box: 要素の幅/高さ。 | ||
+ | * border width: ボーダーの幅。 | ||
+ | * padding: オブジェクトの側面とその子の間のスペース。 | ||
+ | * content: バウンディングボックスをボーダーの幅とパディングで減らした大きさのコンテンツ領域。 | ||
+ | |||
+ | (絵) | ||
+ | |||
+ | |||
+ | ボーダーはバウンディングボックスの内側に描かれる。境界線の内側では、LVGLはオブジェクトの子を配置する際に「パディングマージン」を維持します。 | ||
+ | |||
+ | アウトラインはバウンディングボックスの外側に描画されます。 | ||
|} | |} | ||
:[[App:Library:LVGL#Overview|戻る : Previous]] | :[[App:Library:LVGL#Overview|戻る : Previous]] |
2022年6月30日 (木) 20:27時点における版
https://docs.lvgl.io/8.2/overview/coords.html
Positions, sizes, and layouts
Overview
英文 | 自動翻訳 |
---|---|
Similarly to many other parts of LVGL, the concept of setting the coordinates was inspired by CSS. LVGL has by no means a complete implementation of CSS but a comparable subset is implemented (sometimes with minor adjustments). In short this means:
|
LVGLの他の多くの部分と同様に、座標の設定のコンセプトはCSSからヒントを得たものです。LVGLは決してCSSを完全に実装しているわけではありませんが、同等のサブセットを実装しています(時には細かい調整を加えています)。
要するにこれは
|
Units
英文 | 自動翻訳 |
---|---|
|
|
Boxing model
英文 | 自動翻訳 |
---|---|
LVGL follows CSS's border-box model. An object's "box" is built from the following parts:
The outline is drawn outside the bounding box. |
LVGLはCSSのborder-boxモデルに従っています。オブジェクトの "box "は、以下のパーツから構成されます。
(絵)
アウトラインはバウンディングボックスの外側に描画されます。 |
Important notes
英文 | 自動翻訳 |
---|---|
This section describes special cases in which LVGL's behavior might be unexpected. |
Postponed coordinate calculation
英文 | 自動翻訳 |
---|---|
LVGL doesn't recalculate all the coordinate changes immediately. This is done to improve performance. Instead, the objects are marked as "dirty" and before redrawing the screen LVGL checks if there are any "dirty" objects. If so it refreshes their position, size and layout. In other words, if you need to get the coordinate of an object and the coordinates were just changed, LVGL needs to be forced to recalculate the coordinates. To do this call The size and position might depend on the parent or layout. Therefore |
Removing styles
英文 | 自動翻訳 |
---|---|
As it's described in the Using styles section, coordinates can also be set via style properties. To be more precise, under the hood every style coordinate related property is stored as a style property. If you use removed by
lv_obj_remove_style_all(obj)
or lv_obj_remove_style(obj, NULL, LV_PART_MAIN);
the earlier set coordinates will be removed as well. For example: /*The size of obj1 will be set back to the default in the end*/
lv_obj_set_size(obj1, 200, 100); /*Now obj1 has 200;100 size*/
lv_obj_remove_style_all(obj1); /*It removes the set sizes*/
/*obj2 will have 200;100 size in the end */
lv_obj_remove_style_all(obj2);
lv_obj_set_size(obj2, 200, 100);
|
Position
Simple way
英文 | 自動翻訳 |
---|---|
To simply set the x and y coordinates of an object use: lv_obj_set_x(obj, 10); //Separate...
lv_obj_set_y(obj, 20);
lv_obj_set_pos(obj, 10, 20); //Or in one function
By default, the x and y coordinates are measured from the top left corner of the parent's content area. For example if the parent has five pixels of padding on every side the above code will place Percentage values are calculated from the parent's content area size. lv_obj_set_x(btn, lv_pct(10)); //x = 10 % of parent content area width
|
Align
英文 | 自動翻訳 |
---|---|
In some cases it's convenient to change the origin of the positioning from the default top left. If the origin is changed e.g. to bottom-right, the (0,0) position means: align to the bottom-right corner. To change the origin use: lv_obj_set_align(obj, align);
To change the alignment and set new coordinates: lv_obj_align(obj, align, x, y);
The following alignment options can be used:
It's quite common to align a child to the center of its parent, therefore a dedicated function exists: lv_obj_center(obj);
//Has the same effect
lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);
If the parent's size changes, the set alignment and position of the children is updated automatically. The functions introduced above align the object to its parent. However, it's also possible to align an object to an arbitrary reference object. lv_obj_align_to(obj_to_align, reference_obj, align, x, y); Besides the alignments options above, the following can be used to align an object outside the reference object:
For example to align a label above a button and center the label horizontally: lv_obj_align_to(label, btn, LV_ALIGN_OUT_TOP_MID, 0, -10);
lv_obj_align() , lv_obj_align_to() can not realign the object if its coordinates or the reference object's coordinates change.
|
Size
Simple way
英文 | 自動翻訳 |
---|---|
The width and the height of an object can be set easily as well: lv_obj_set_width(obj, 200); //Separate...
lv_obj_set_height(obj, 100);
lv_obj_set_size(obj, 200, 100); //Or in one function
Percentage values are calculated based on the parent's content area size. For example to set the object's height to the screen height: lv_obj_set_height(obj, lv_pct(100));
The size settings support a special value: Objects with The above functions set the size of an object's bounding box but the size of the content area can be set as well. This means an object's bounding box will be enlarged with the addition of padding. lv_obj_set_content_width(obj, 50); //The actual width: padding left + 50 + padding right
lv_obj_set_content_height(obj, 30); //The actual width: padding top + 30 + padding bottom
The size of the bounding box and the content area can be retrieved with the following functions: lv_coord_t w = lv_obj_get_width(obj);
lv_coord_t h = lv_obj_get_height(obj);
lv_coord_t content_w = lv_obj_get_content_width(obj);
lv_coord_t content_h = lv_obj_get_content_height(obj);
|
Using styles
英文 | 自動翻訳 |
---|---|
Under the hood the position, size and alignment properties are style properties. The above described "simple functions" hide the style related code for the sake of simplicity and set the position, size, and alignment properties in the local styles of the object. However, using styles to set the coordinates has some great advantages:
Here are some examples to set an object's size using a style: static lv_style_t style;
lv_style_init(&style);
lv_style_set_width(&style, 100);
lv_obj_t * btn = lv_btn_create(lv_scr_act());
lv_obj_add_style(btn, &style, LV_PART_MAIN);
As you will see below there are some other great features of size and position setting. However, to keep the LVGL API lean, only the most common coordinate setting features have a "simple" version and the more complex features can be used via styles. |
Translation
英文 | 自動翻訳 |
---|---|
Let's say the there are 3 buttons next to each other. Their position is set as described above. Now you want to move a button up a little when it's pressed. One way to achieve this is by setting a new Y coordinate for the pressed state: static lv_style_t style_normal;
lv_style_init(&style_normal);
lv_style_set_y(&style_normal, 100);
static lv_style_t style_pressed;
lv_style_init(&style_pressed);
lv_style_set_y(&style_pressed, 80);
lv_obj_add_style(btn1, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn1, &style_pressed, LV_STATE_PRESSED);
lv_obj_add_style(btn2, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn2, &style_pressed, LV_STATE_PRESSED);
lv_obj_add_style(btn3, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn3, &style_pressed, LV_STATE_PRESSED);
This works, but it's not really flexible because the pressed coordinate is hard-coded. If the buttons are not at y=100, static lv_style_t style_normal;
lv_style_init(&style_normal);
lv_style_set_y(&style_normal, 100);
static lv_style_t style_pressed;
lv_style_init(&style_pressed);
lv_style_set_translate_y(&style_pressed, -20);
lv_obj_add_style(btn1, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn1, &style_pressed, LV_STATE_PRESSED);
lv_obj_add_style(btn2, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn2, &style_pressed, LV_STATE_PRESSED);
lv_obj_add_style(btn3, &style_normal, LV_STATE_DEFAULT);
lv_obj_add_style(btn3, &style_pressed, LV_STATE_PRESSED);
Translation is applied from the current position of the object. Percentage values can be used in translations as well. The percentage is relative to the size of the object (and not to the size of the parent). For example The translation is applied after the layouts are calculated. Therefore, even laid out objects' position can be translated. The translation actually moves the object. That means it makes the scrollbars and TransformationSimilarly to position, an object's size can be changed relative to the current size as well. The transformed width and height are added on both sides of the object. This means a 10 px transformed width makes the object 2x10 pixels wider. Unlike position translation, the size transformation doesn't make the object "really" larger. In other words scrollbars, layouts, and This code enlarges a button when it's pressed: static lv_style_t style_pressed;
lv_style_init(&style_pressed);
lv_style_set_transform_width(&style_pressed, 10);
lv_style_set_transform_height(&style_pressed, 10);
lv_obj_add_style(btn, &style_pressed, LV_STATE_PRESSED);
|
Min and Max size
英文 | 自動翻訳 |
---|---|
Similarly to CSS, LVGL also supports static lv_style_t style_max_height;
lv_style_init(&style_max_height);
lv_style_set_y(&style_max_height, 200);
lv_obj_set_height(obj, lv_pct(100));
lv_obj_add_style(obj, &style_max_height, LV_STATE_DEFAULT); //Limit the height to 200 px
Percentage values can be used as well which are relative to the size of the parent's content area. static lv_style_t style_max_height;
lv_style_init(&style_max_height);
lv_style_set_y(&style_max_height, lv_pct(50));
lv_obj_set_height(obj, lv_pct(100));
lv_obj_add_style(obj, &style_max_height, LV_STATE_DEFAULT); //Limit the height to half parent height
|
Layout
Overview
英文 | 自動翻訳 |
---|---|
Layouts can update the position and size of an object's children. They can be used to automatically arrange the children into a line or column, or in much more complicated forms. The position and size set by the layout overwrites the "normal" x, y, width, and height settings. There is only one function that is the same for every layout: |
Built-in layout
英文 | 自動翻訳 |
---|---|
LVGL comes with two very powerful layouts:
Both are heavily inspired by the CSS layouts with the same name. |
Flags
英文 | 自動翻訳 |
---|---|
There are some flags that can be used on objects to affect how they behave with layouts:
These flags can be added/removed with |
Adding new layouts
英文 | 自動翻訳 |
---|---|
LVGL can be freely extended by a custom layout like this: uint32_t MY_LAYOUT;
...
MY_LAYOUT = lv_layout_register(my_layout_update, &user_data);
...
void my_layout_update(lv_obj_t * obj, void * user_data)
{
/*Will be called automatically if it's required to reposition/resize the children of "obj" */
}
Custom style properties can be added which can be retrieved and used in the update callback. For example: uint32_t MY_PROP;
...
LV_STYLE_MY_PROP = lv_style_register_prop();
...
static inline void lv_style_set_my_prop(lv_style_t * style, uint32_t value)
{
lv_style_value_t v = {
.num = (int32_t)value
};
lv_style_set_prop(style, LV_STYLE_MY_PROP, v);
}
|