电子烂人 发表于 2025-1-14 17:20

【STM32H7S78-DK测评】3.转轮动效菜单的实现

<div class='showpostmsg'> 本帖最后由 电子烂人 于 2025-1-15 14:06 编辑

<p><span style="font-size:18px;"><strong>1.前言</strong></span></p>

<p>之前的帖子已经实现了基础的TOUCHGFX效果,我们要在这个基础上加上菜单的动效</p>

<p>ST提供了很多小控件,不过还不足以实现我们的效果,这篇文章在原有的基础上试着添加一些定制的转轮控件</p>

<p><span style="font-size:18px;"><strong>2.工程建立</strong></span></p>

<p><span style="font-size:16px;">打开之前的TOUCHGFX工程:</span></p>

<p>在CONTAINERS里添加一个小控件,同时摆放好图标和文字的样式,记录下各个元素的坐标</p>

<p>&nbsp;另外,放一些要用的元素进工程</p>

<p> &nbsp;&nbsp;</p>

<p>记得设置下要用到的字体,这边屏幕比较大,选用宋体,45磅:</p>

<p> &nbsp;</p>

<p>把控件里的文字也设置好:</p>

<p> &nbsp;</p>

<p>回到我们的菜单页面,放置一个scrollwheel转动菜单控件</p>

<p></p>

<p>并在Item Template选择做好的Container,这边设置元素多少,列表外观,以及选择循环模式</p>

<p> &nbsp;&nbsp;</p>

<p>在转盘的中央放置一个透明按钮,表示我们按下这个区域</p>

<p> &nbsp;&nbsp;到这里就基本设置完成,生成工程,开始代码端的操作。</p>

<p><span style="font-size:18px;"><strong>3.代码修改</strong></span></p>

<p>主要流程为:显示转轮效果---&gt;绑定图标和文字---&gt;确认转轮当前所选---&gt;按键进入对应函数---&gt;跳转屏幕</p>

<p>全部代码为C++编译,只展示部分核心内容,.HPP自行修改。这部分代码有参考@NATHAN_XI&nbsp;同学的代码,在此表示感谢。</p>

<p>mainMenuView.CPP</p>

<pre>
<code class="language-cpp">#include &lt;gui/mainmenu_screen/mainMenuView.hpp&gt;
#include &lt;texts/TextKeysAndLanguages.hpp&gt;
#include &lt;BitmapDatabase.hpp&gt;

mainMenuView::mainMenuView():
scrollWheel1_ItemSelectedCallback(this, &amp;mainMenuView::scrollWheel1_ItemSelectedHandler)
{

}

void mainMenuView::setupScreen()
{
        scrollWheel1.setItemSelectedCallback(scrollWheel1_ItemSelectedCallback);
    mainMenuViewBase::setupScreen();
}

void mainMenuView::tearDownScreen()
{
    mainMenuViewBase::tearDownScreen();
}

void mainMenuView::scrollWheel1UpdateItem(CustomContainer1&amp; item, int16_t itemIndex)
{
        item.setListElements(itemIndex);
}

void mainMenuView::scrollWheel1_ItemSelectedHandler(int16_t itemSelected)
{
        presenter-&gt;menuSelected(itemSelected);
}
</code></pre>

<p>model.cpp</p>

<pre>
<code class="language-cpp">#include &lt;gui/model/Model.hpp&gt;
#include &lt;gui/model/ModelListener.hpp&gt;

Model::Model() : modelListener(0)
{

}

void Model::tick()
{

}

void Model::SetmenuSelected(int itemSelected)
{
        Screen1Scroll1WheelItemSele = itemSelected;
}

int Model::GetScreenMainMenuScroll1WheelItem(void)
{
        return Screen1Scroll1WheelItemSele;
}
</code></pre>

<p>CustomContainer1.CPP</p>

<pre>
<code class="language-cpp">#include &lt;gui/containers/CustomContainer1.hpp&gt;
#include &lt;texts/TextKeysAndLanguages.hpp&gt;
#include &lt;BitmapDatabase.hpp&gt;
#include &lt;gui_generated/containers/CustomContainer1Base.hpp&gt;
#include &lt;math.h&gt;

CustomContainer1::CustomContainer1()
{

}

void CustomContainer1::initialize()
{
    CustomContainer1Base::initialize();
}

void CustomContainer1::offset(int16_t x)
{
    image1.setX(10 + x);
    textArea1.setX(110 + x);
}

void CustomContainer1::alphaAdjust(int16_t a)
{
        image1.setAlpha(a);
        textArea1.setAlpha(a);
}</code></pre>

<p><span style="font-size:18px;"><strong>4.成果展示</strong></span></p>

<p>4fcdc66405589a79953dbf4bbe61fafb<br />
&nbsp;</p>

<p><span style="font-size:18px;"><strong>后记</strong></span></p>

<p>部分参考来源:</p>

<p><a href="https://www.jianshu.com/p/7c9a0533c600">使用TouchGFX开发STM32界面应用之入门篇(四)-- 定制控件-1 - 简书</a></p>

<p><a href="https://www.jianshu.com/p/d7a0d4b2ba63">使用TouchGFX开发STM32界面应用之入门篇(四)-- 定制控件-2 - 简书</a></p>

<p>WIKI:<a href="https://support.touchgfx.com/academy/tutorials/tutorial-04" target="_blank">https://support.touchgfx.com/academy/tutorials/tutorial-04</a></p>

<p>再次感谢@NATHAN_XI同学的讲解,这部分自己摸索真的很痛苦</p>

<p><a href="https://www.bilibili.com/opus/1021525625956990998?spm_id_from=333.1387.0.0">NATHAN_XI的动态 - 哔哩哔哩</a></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

qzc飘曳 发表于 2025-1-14 22:15

<p>这个生成后能看到才需要的资源是多少吗?&nbsp;&nbsp;</p>

御坂10032号 发表于 2025-1-14 22:39

<p>真流畅啊</p>

电子烂人 发表于 2025-1-15 09:16

qzc飘曳 发表于 2025-1-14 22:15
这个生成后能看到才需要的资源是多少吗?&nbsp;&nbsp;

<p>是说占用多少FLASH存储吗?要生成之后编译才能看到</p>

<p>不过我感觉用的不多,图片和视频才是最占存储的,可以看这个<a href="https://www.bilibili.com/video/BV1TEcyeYEsL/?spm_id_from=333.337.search-card.all.click">TouchGFX_01. 节省Flash存储器内存_哔哩哔哩_bilibili</a></p>

yangjiaxu 发表于 2025-1-15 11:00

<p>TGFX真的是高端,但是比较占用内存,和芯片资源,不过还不错,至少画面是好看</p>

chrisrh 发表于 2025-1-15 11:29

电子烂人 发表于 2025-1-15 09:16
是说占用多少FLASH存储吗?要生成之后编译才能看到

不过我感觉用的不多,图片和视频才是最占存储的, ...

<p>是的,还是TouchGFX的动画和界面看着舒服~</p>

wangerxian 发表于 2025-1-16 16:51

<p>之前我们就跑过这个例程,后面改成了圆形菜单,那会可有成就感了。</p>
页: [1]
查看完整版本: 【STM32H7S78-DK测评】3.转轮动效菜单的实现