基于HarmonyOS Java UI,实现一个可以定时刷新文字和图片的电影推荐卡片 - HarmonyOS技术社区 - 电子技术william hill官网 - 广受欢迎的专业电子william hill官网 - 威廉希尔官方网站
分享 收藏 返回

早知 关注 私信
[文章]

基于HarmonyOS Java UI,实现一个可以定时刷新文字和图片的电影推荐卡片

1. 介绍      
本篇codelab主要由2*2和2*4布局的电影卡片、主页(电影排行榜单)和电影详情页组成,功能包括卡片的定时刷新和相关卡片的创建,删除,主动刷新相关回调函数的使用以及事件的控制,还介绍了电影英国威廉希尔公司网站 的布局以及如何携带参数跳转电影详情页,最后介绍了电影详情页的布局以及电影剧情介绍的展开和收起。效果如下图:


最终效果预览
我们最终会构建一个基于Java代码的电影卡片手机客户端。效果如下图所示。本篇Codelab我们将会一起完成这个客户端,其中包括:
  • 页面未初始化布局
  • 页面初始化布局
  • 应用初始化
  • 卡片的刷新


   
2. 搭建HarmonyOS环境
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
  • 安装DevEco Studio,详情请参考下载和安装软件。
  • 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
  • 开发者可以参考以下链接,完成设备调试的相关配置:
    • 使用真机进行调试
    • 使用模拟器进行调试
   
3. 代码结构解读      
本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在9 参考中提供下载方式,接下来我们会用一小节来讲解整个工程的代码结构:
  • annotation包:Bind是一个自定义注解,用来初始化页面中的组件。
  • database包:存放对象关系数据库主要组件,具体使用方法可考官方文档,对象关系映射数据库
  • provider包: 主要作用为高效传递和使用相关数据。
  • slice包:MainAbilitySlice是主要代码逻辑实现的一个类,同时对应我们的电影英国威廉希尔公司网站 ,MoviesDetailAbilitySlice对应电影详情页。
  • util包:存放所有封装好的公共方法,如LogUtils等。
  • resources目录:存放工程使用到的资源文件,其中resourcesbaselayout下存放xml布局文件;resourcesbasemedia下存放图片资源,resources/rawfile存放电影说明文件资源。
  • config.json:工程相关配置文件。

  
4. 页面布局      
卡片布局
卡片布局分为2*2和2*4两种布局,由于2*4中包含2*2的元素,且包含更多的功能,下面将以2*4布局卡片来介绍。

2*4布局对应的xml文件名为form_list_pattern_form_card_2_4.xml,可分为上下两部分,其中上部分显示标题,下部分用于展示电影的图片及说明。当手机重启之后不点击应用和卡片,卡片为未初始化状态。效果图如下:


标题部分由两个Text组件组成,分别作为标题和完整榜单的点击事件,示例代码如下:
  1.         ohos:height="40vp"
  2.         ohos:width="match_parent"
  3.         ohos:orientation="horizontal"
  4.         >
  5.         
  6.                 ohos:id="$+id:title"
  7.                 ohos:height="match_parent"
  8.                 ohos:width="100vp"
  9.                 ohos:end_margin="12vp"
  10.                 ohos:start_margin="44vp"
  11.                 ohos:text="$string:title"
  12.                 ohos:text_color="#E5000000"
  13.                 ohos:text_size="16fp"
  14.                 ohos:text_weight="500"
  15.                 ohos:bottom_margin="5vp"
  16.                 ohos:top_margin="10vp"/>

  17.         
  18.                 ohos:id="$+id:rankings"
  19.                 ohos:height="match_parent"
  20.                 ohos:width="100vp"
  21.                 ohos:align_parent_end="true"
  22.                 ohos:right_margin="35vp"
  23.                 ohos:text="$string:all_rankings"
  24.                 ohos:text_color="#E5000000"
  25.                 ohos:text_size="16fp"
  26.                 ohos:text_alignment="center"
  27.                 ohos:background_element="$graphic:background_button"
  28.                 ohos:bottom_margin="5vp"
  29.                 ohos:text_weight="500"
  30.                 ohos:top_margin="10vp"/>
当手机重启,应用未启动时卡片给出提示用户点击卡片刷新数据,布局对应xml文件如下:
  1.         ohos:id="$+id:card4_hints"
  2.         ohos:height="match_content"
  3.         ohos:width="match_parent"
  4.         ohos:center_in_parent="true"
  5.         ohos:visibility="visible">
  6.         
  7.                 ohos:height="match_content"
  8.                 ohos:width="match_parent"
  9.                 ohos:text_alignment="center"
  10.                 ohos:text="$string:init_data">
  11.         
当卡片数据刷新后,布局对应xml文件如下:
  1.         ohos:id="$+id:card4_content"
  2.         ohos:height="match_content"
  3.         ohos:width="match_parent"
  4.         ohos:align_parent_bottom="true"
  5.         ohos:bottom_margin="12vp"
  6.         ohos:end_margin="12vp"
  7.         ohos:orientation="horizontal"
  8.         ohos:start_margin="24vp"
  9.         ohos:top_margin="12vp"
  10.         ohos:visibility="invisible">
  11.          
  12.         ...
  13.          
卡片内容区域分为左右两个布局,用于展示电影信息,其中包含电影的图片,电影名以及介绍,对应xml文件如下:
  1.         ohos:id="$+id:movie_bottom_2x4"
  2.         ohos:height="match_parent"
  3.         ohos:width="0vp"
  4.         ohos:left_margin="5vp"
  5.         ohos:orientation="vertical"
  6.         ohos:weight="4">
  7.          
  8.         
  9.                 ohos:height="70vp"
  10.                 ohos:width="130vp">
  11.                  
  12.                
  13.                         ohos:id="$+id:movie_bottom_img_2x4"
  14.                         ohos:height="match_parent"
  15.                         ohos:width="match_parent"
  16.                         ohos:scale_mode="stretch"
  17.                         />
  18.         

  19.         
  20.                 ohos:height="match_content"
  21.                 ohos:width="match_content"
  22.                 ohos:layout_alignment="vertical_center"
  23.                 ohos:left_margin="10vp"
  24.                 ohos:orientation="vertical">

  25.                
  26.                         ohos:id="$+id:movie_bottom_title_2x4"
  27.                         ohos:height="match_content"
  28.                         ohos:width="match_parent"
  29.                         ohos:text_color="#E5000000"
  30.                         ohos:text_size="14fp"
  31.                         ohos:text_weight="500"
  32.                         ohos:truncation_mode="ellipsis_at_end"/>

  33.                
  34.                         ohos:id="$+id:movie_bottom_introduction_2x4"
  35.                         ohos:height="match_content"
  36.                         ohos:width="match_parent"
  37.                         ohos:text_color="#99000000"
  38.                         ohos:text_size="10fp"
  39.                         ohos:text_weight="400"
  40.                         ohos:top_margin="2vp"
  41.                         ohos:truncation_mode="ellipsis_at_end"/>
  42.         
电影英国威廉希尔公司网站 布局

对应的xml文件名为ability_main.xml,可分为上下2大块,其中上半部分显示标题及说明,由DirectionalLayout布局和两个Text组件组成;下半部分展示电影排行榜由ScrollView和ListContainer组件组成。
效果图如下:

上半部分示例代码如下:
  1.         ohos:height="200vp"
  2.         ohos:width="match_parent"
  3.         ohos:background_element="$media:movies_bg"
  4.         ohos:scrollbar_background_color="#FF262525"
  5.         ohos:orientation="vertical">

  6.         
  7.                 ohos:height="50vp"
  8.                 ohos:width="match_content"
  9.                 ohos:text_size="25fp"
  10.                 ohos:layout_alignment="center"
  11.                 ohos:text_alignment="center"
  12.                 ohos:text_color="#FF7E7A7A"
  13.                 ohos:text="$string:movie_rank"/>  

  14.         
  15.                 ohos:height="match_content"
  16.                 ohos:width="match_content"
  17.                 ohos:text_size="15fp"
  18.                 ohos:layout_alignment="center"
  19.                 ohos:multiple_lines="true"
  20.                 ohos:max_text_lines="3"
  21.                 ohos:text_color="#FF0FE570"
  22.                 ohos:text="$string:movie_rank_detail"/>  
中部滑动区域对应的xml文件如下:

  1.         ohos:height="match_parent"
  2.         ohos:width="match_parent">
  3.         ohos:id="$+id:movies_container"
  4.         ohos:width="match_parent"
  5.         ohos:height="match_parent"/>
用于ListContainer的item(item_movies_layout.xml)示例代码如下:

  1.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  2.     ohos:height="110vp"
  3.     ohos:width="match_parent"
  4.     ohos:orientation="vertical">

  5.    
  6.         ohos:height="109.5vp"
  7.         ohos:width="match_parent"
  8.         ohos:orientation="horizontal"
  9.         ohos:padding="10vp">

  10.         
  11.         
  12.             ohos:id="$+id:item_movies_id"
  13.             ohos:height="match_content"
  14.             ohos:width="8vp"
  15.             ohos:layout_alignment="center"
  16.             ohos:left_margin="15vp"
  17.             ohos:right_margin="20vp"
  18.             ohos:text_alignment="center"
  19.             ohos:text_color="red"
  20.             ohos:text_size="18vp"
  21.             ohos:text_weight="30000"
  22.             />

  23.         

  24.         
  25.             ohos:id="$+id:item_movies_image"
  26.             ohos:height="110vp"
  27.             ohos:width="110vp"
  28.             ohos:clip_alignment="center"
  29.             ohos:layout_alignment="center"
  30.             ohos:scale_mode="stretch"
  31.             />
  32.         
  33.         
  34.             ohos:height="match_parent"
  35.             ohos:width="150vp"
  36.             ohos:orientation="vertical">

  37.             
  38.                 ohos:id="$+id:item_movies_title"
  39.                 ohos:height="match_content"
  40.                 ohos:width="match_content"
  41.                 ohos:left_margin="10vp"
  42.                 ohos:text_size="18vp"
  43.                 />

  44.             
  45.                 ohos:height="match_content"
  46.                 ohos:width="match_content"
  47.                 ohos:orientation="horizontal"
  48.                 ohos:top_margin="5vp">

  49.                
  50.                     ohos:height="12vp"
  51.                     ohos:width="12vp"
  52.                     ohos:background_element="$media:rating"
  53.                     ohos:left_margin="10vp"/>

  54.                
  55.                     ohos:height="12vp"
  56.                     ohos:width="12vp"
  57.                     ohos:background_element="$media:rating"/>

  58.                
  59.                     ohos:height="12vp"
  60.                     ohos:width="12vp"
  61.                     ohos:background_element="$media:rating"/>

  62.                
  63.                     ohos:height="12vp"
  64.                     ohos:width="12vp"
  65.                     ohos:background_element="$media:rating"/>

  66.                
  67.                     ohos:height="12vp"
  68.                     ohos:width="12vp"
  69.                     ohos:background_element="$media:rating1"/>

  70.                
  71.                     ohos:id="$+id:item_movies_rating"
  72.                     ohos:height="match_content"
  73.                     ohos:width="200vp"
  74.                     ohos:left_margin="10vp"
  75.                     ohos:text_color="#FF9800"
  76.                     ohos:text_size="12vp"
  77.                     ohos:weight="3"
  78.                     />
  79.             

  80.             
  81.                 ohos:id="$+id:item_movies_type"
  82.                 ohos:height="match_content"
  83.                 ohos:width="match_content"
  84.                 ohos:left_margin="10vp"
  85.                 ohos:text_color="#FF81807E"
  86.                 ohos:text_size="12vp"
  87.                 ohos:weight="3"
  88.                 />

  89.         

  90.         
  91.         
  92.             ohos:height="match_parent"
  93.             ohos:width="50vp"
  94.             ohos:left_margin="5vp"
  95.             ohos:orientation="vertical">

  96.             
  97.                 ohos:height="30vp"
  98.                 ohos:width="30vp"
  99.                 ohos:background_element="$media:like"/>

  100.             
  101.                 ohos:height="30vp"
  102.                 ohos:width="30vp"
  103.                 ohos:text="$string:want_see"
  104.                 ohos:text_color="#FFF88B06"
  105.                 ohos:text_size="13fp"/>
  106.         

  107.    

  108.    
  109.    
  110.         ohos:height="0.5vp"
  111.         ohos:width="match_parent"
  112.         ohos:background_element="#EAEAEC"
  113.         />

电影详情页布局

电影详情页主要展示电影的图片,演员表,剧照,介绍的信息效果图如下:

对应的xml文件名为movies_detail_layout.xml,其中包含xml布局文件如下:

  1.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  2.     ohos:id="$+id:parent_layout"
  3.     ohos:height="match_parent"
  4.     ohos:width="match_parent"
  5.     ohos:background_element="#445164">

  6.    
  7.         ohos:height="match_parent"
  8.         ohos:width="match_parent">

  9.         
  10.             ohos:height="match_content"
  11.             ohos:width="match_parent"
  12.             ohos:bottom_padding="70vp"
  13.             ohos:left_margin="20vp"
  14.             ohos:orientation="vertical"
  15.             ohos:right_margin="20vp">

  16.             
  17.             
  18.                 ohos:id="$+id:title_icon"
  19.                 ohos:height="match_content"
  20.                 ohos:width="match_content"
  21.                 ohos:left_margin="130vp"
  22.                 ohos:text="$string:movie"
  23.                 ohos:text_size="20fp"

  24.                 ohos:weight="1"/>

  25.             
  26.             
  27.                 ohos:height="match_content"
  28.                 ohos:width="match_parent"
  29.                 ohos:alignment="vertical_center"
  30.                 ohos:orientation="horizontal"
  31.                 ohos:top_padding="15vp">
  32.                
  33.                
  34.                     ohos:id="$+id:image_content"
  35.                     ohos:height="200vp"
  36.                     ohos:width="150vp"
  37.                     ohos:image_src="//m.obk20.com/bbs/$media:movies_image11"
  38.                     ohos:scale_mode="stretch"
  39.                     />

  40.                
  41.                
  42.                     ohos:height="230vp"
  43.                     ohos:width="match_content"
  44.                     ohos:orientation="vertical"
  45.                     >

  46.                     
  47.                     
  48.                         ohos:id="$+id:title_text"
  49.                         ohos:height="match_content"
  50.                         ohos:width="140vp"
  51.                         ohos:left_margin="50vp"
  52.                         ohos:text_color="#000000"
  53.                         ohos:text_size="18fp"/>

  54.                     
  55.                     
  56.                         ohos:id="$+id:like_num"
  57.                         ohos:height="match_content"
  58.                         ohos:width="match_content"
  59.                         ohos:left_margin="20vp"
  60.                         ohos:text_color="#FFB4B7B3"
  61.                         ohos:text_size="15fp"
  62.                         ohos:top_margin="15vp"/>

  63.                     
  64.                     
  65.                         ohos:id="$+id:vip"
  66.                         ohos:height="match_content"
  67.                         ohos:width="match_content"
  68.                         ohos:left_margin="20vp"
  69.                         ohos:text="$string:starring"
  70.                         ohos:text_color="#FFB4B7B3"
  71.                         ohos:text_size="15fp"
  72.                         ohos:top_margin="5vp"/>

  73.                     
  74.                     
  75.                         ohos:height="match_content"
  76.                         ohos:width="match_parent"
  77.                         ohos:left_margin="20vp"
  78.                         ohos:top_margin="5vp">

  79.                         
  80.                             ohos:height="match_content"
  81.                             ohos:width="match_content"
  82.                             ohos:orientation="horizontal">

  83.                            
  84.                                 ohos:height="50vp"
  85.                                 ohos:width="50vp"
  86.                                 ohos:bottom_margin="5vp"
  87.                                 ohos:image_src="//m.obk20.com/bbs/$media:movies_image11"
  88.                                 ohos:left_margin="1vp"
  89.                                 ohos:top_margin="5vp"
  90.                                 ohos:scale_mode="stretch"
  91.                                 />

  92.                            
  93.                                 ohos:height="50vp"
  94.                                 ohos:width="50vp"
  95.                                 ohos:bottom_margin="5vp"
  96.                                 ohos:image_src="//m.obk20.com/bbs/$media:movies_image3"
  97.                                 ohos:left_margin="1vp"
  98.                                 ohos:top_margin="5vp"
  99.                                 ohos:scale_mode="stretch"
  100.                                 />

  101.                            
  102.                                 ohos:height="50vp"
  103.                                 ohos:width="50vp"
  104.                                 ohos:bottom_margin="5vp"
  105.                                 ohos:image_src="//m.obk20.com/bbs/$media:movies_image5"
  106.                                 ohos:left_margin="1vp"
  107.                                 ohos:top_margin="5vp"
  108.                                 ohos:scale_mode="stretch"
  109.                                 />

  110.                            
  111.                                 ohos:height="50vp"
  112.                                 ohos:width="50vp"
  113.                                 ohos:bottom_margin="5vp"
  114.                                 ohos:image_src="//m.obk20.com/bbs/$media:movies_image6"
  115.                                 ohos:left_margin="1vp"
  116.                                 ohos:top_margin="5vp"
  117.                                 ohos:scale_mode="stretch"
  118.                                 />
  119.                         
  120.                     

  121.                     
  122.                     
  123.                         ohos:height="30vp"
  124.                         ohos:width="30vp"
  125.                         ohos:left_margin="10vp"
  126.                         ohos:orientation="horizontal"
  127.                         ohos:top_margin="55vp">

  128.                         
  129.                             ohos:height="30vp"
  130.                             ohos:width="30vp"
  131.                             ohos:background_element="$media:like"/>

  132.                     

  133.                

  134.             

  135.             
  136.             
  137.                 ohos:height="match_content"
  138.                 ohos:width="match_content"
  139.                 ohos:orientation="horizontal"
  140.                 ohos:top_margin="5vp">

  141.                
  142.                     ohos:height="20vp"
  143.                     ohos:width="20vp"
  144.                     ohos:background_element="$media:rating"
  145.                     ohos:left_margin="10vp"/>

  146.                
  147.                     ohos:height="20vp"
  148.                     ohos:width="20vp"
  149.                     ohos:background_element="$media:rating"/>

  150.                
  151.                     ohos:height="20vp"
  152.                     ohos:width="20vp"
  153.                     ohos:background_element="$media:rating"/>

  154.                
  155.                     ohos:height="20vp"
  156.                     ohos:width="20vp"
  157.                     ohos:background_element="$media:rating"/>

  158.                
  159.                     ohos:height="20vp"
  160.                     ohos:width="20vp"
  161.                     ohos:background_element="$media:rating1"/>

  162.                
  163.                     ohos:id="$+id:read_num"
  164.                     ohos:height="match_content"
  165.                     ohos:width="200vp"
  166.                     ohos:left_margin="10vp"
  167.                     ohos:text_color="#FF9800"
  168.                     ohos:text_size="20vp"
  169.                     ohos:weight="3"
  170.                     />
  171.             

  172.             
  173.             
  174.                 ohos:id="$+id:title_content1"
  175.                 ohos:height="match_content"
  176.                 ohos:width="match_parent"
  177.                 ohos:left_margin="15vp"
  178.                 ohos:text="$string:introduction"
  179.                 ohos:text_alignment="horizontal_center"
  180.                 ohos:text_color="#000000"
  181.                 ohos:text_size="16vp"
  182.                 ohos:top_margin="25vp"/>

  183.             
  184.             
  185.                 ohos:id="$+id:title_content"
  186.                 ohos:height="match_content"
  187.                 ohos:width="match_parent"
  188.                 ohos:background_element="#415165"
  189.                 ohos:multiple_lines="true"
  190.                 ohos:text=""
  191.                 ohos:text_alignment="horizontal_center"
  192.                 ohos:text_color="white"
  193.                 ohos:text_size="16vp"
  194.                 ohos:top_margin="5vp"/>

  195.             
  196.                 ohos:id="$+id:v_expansion"
  197.                 ohos:height="match_content"
  198.                 ohos:width="match_content"
  199.                 ohos:background_element="$graphic:sel_text_touch"
  200.                 ohos:text="$string:full_text"
  201.                 ohos:top_margin="5vp"
  202.                 ohos:padding="5vp"
  203.                 ohos:left_margin="280vp"
  204.                 ohos:text_color="#000000"
  205.                 ohos:text_size="16vp"
  206.                 ohos:element_end="$+id:title_content"
  207.                 />

  208.             
  209.             
  210.                 ohos:id="$+id:movie_stills"
  211.                 ohos:height="match_content"
  212.                 ohos:width="match_parent"
  213.                 ohos:left_margin="15vp"
  214.                 ohos:text="$string:stills"
  215.                 ohos:text_alignment="horizontal_center"
  216.                 ohos:text_color="#000000"
  217.                 ohos:text_size="16vp"
  218.                 ohos:top_margin="25vp"/>

  219.             
  220.                 ohos:height="match_content"
  221.                 ohos:width="match_content">

  222.                
  223.                     ohos:height="match_content"
  224.                     ohos:width="match_content"
  225.                     ohos:orientation="horizontal">

  226.                     
  227.                         ohos:height="100vp"
  228.                         ohos:width="100vp"
  229.                         ohos:bottom_margin="10vp"
  230.                         ohos:image_src="//m.obk20.com/bbs/$media:movies_image6"
  231.                         ohos:left_margin="1vp"
  232.                         ohos:top_margin="10vp"
  233.                         ohos:scale_mode="stretch"
  234.                         />

  235.                     
  236.                         ohos:height="100vp"
  237.                         ohos:width="100vp"
  238.                         ohos:bottom_margin="10vp"
  239.                         ohos:image_src="//m.obk20.com/bbs/$media:movies_image10"
  240.                         ohos:left_margin="1vp"
  241.                         ohos:top_margin="10vp"
  242.                         ohos:scale_mode="stretch"
  243.                         />

  244.                     
  245.                         ohos:height="100vp"
  246.                         ohos:width="100vp"
  247.                         ohos:bottom_margin="10vp"
  248.                         ohos:image_src="//m.obk20.com/bbs/$media:movies_image3"
  249.                         ohos:left_margin="1vp"
  250.                         ohos:top_margin="10vp"
  251.                         ohos:scale_mode="stretch"
  252.                         />

  253.                     
  254.                         ohos:height="100vp"
  255.                         ohos:width="100vp"
  256.                         ohos:bottom_margin="10vp"
  257.                         ohos:image_src="//m.obk20.com/bbs/$media:movies_image5"
  258.                         ohos:left_margin="1vp"
  259.                         ohos:top_margin="10vp"
  260.                         ohos:scale_mode="stretch"
  261.                         />
  262.                
  263.             

  264.         

  265.    



5. 应用初始化      
当我们首次安装应用打开时会进入到类MainAbility的onStart(Intent intent)方法,进入电影英国威廉希尔公司网站 会调用MainAbilitySlice类的onStart()方法,进入电影详情页会进入MoviesDetailAbilitySlice类的onStart()方法,依次进行了如下流程:

MainAbility

初始化数据,从json文件中读取电影信息并写入对象关系映射数据库,示例代码如下:
  1. /**
  2. * initData
  3. */
  4. private void initData() {
  5.         // 查询数据库是否有数据
  6.         Long movieCount = DatabaseUtils.queryMovieCount(this, null);
  7.         if (movieCount == 0) {
  8.                 saveMovieInfo(CommonUtils.getMoviesData(this));
  9.         }
  10. }

  11. /**
  12. * insert movies
  13. * [url=home.php?mod=space&uid=3142012]@param[/url] movieInfoList movie list
  14. */
  15. private void saveMovieInfo(List movieInfoList) {
  16.         if (movieInfoList.size() < 1 || movieInfoList == null) {
  17.                 return;
  18.         }
  19.         DatabaseUtils.deletMovie(this, null);
  20.         for (int index = 0; index < movieInfoList.size(); index++) {
  21.                 MovieInfo movieInfo = movieInfoList.get(index);
  22.                 DatabaseUtils.insertMovieInfo(this, movieInfo);
  23.         }
  24. }
初始化InnerEvent对象用于定时刷新卡片,示例代码如下:
  1. private void initMyHandler() {
  2.         myHandler = new MyEventHandler(EventRunner.current());
  3.         long param = 0L;
  4.         Object object = null;
  5.         InnerEvent normalInnerEvent = InnerEvent.get(EVENT_MESSAGE_NORMAL, param, object);
  6.         myHandler.sendEvent(normalInnerEvent, 0, EventHandler.Priority.IMMEDIATE);
  7. }
  8. /**
  9. * MyEventHandler
  10. */
  11. class MyEventHandler extends EventHandler {
  12.         MyEventHandler(EventRunner runner) throws IllegalArgumentException {
  13.                 super(runner);
  14.         }

  15.         [url=home.php?mod=space&uid=2735960]@Override[/url]
  16.         protected void processEvent(InnerEvent event) {
  17.                 super.processEvent(event);
  18.                 if (event == null) {
  19.                         return;
  20.                 }
  21.                 int eventId = event.eventId;
  22.                 switch (eventId) {
  23.                         case EVENT_MESSAGE_NORMAL:
  24.                                 invokeScheduleMethod();
  25.                                 break;
  26.                         default:
  27.                                 break;
  28.                 }
  29.         }
  30. }
启动更新卡片的定时任务,示例代码如下:
  1. private void invokeScheduleMethod() {
  2.     Timer timer = new Timer();
  3.     timer.schedule(
  4.             new TimerTask() {
  5.                 /**
  6.                  * 定时更新卡片
  7.                  */
  8.                 public void run() {
  9.                     getUITaskDispatcher().syncDispatch(() -> {
  10.                         refeshData();
  11.                     });
  12.                 }
  13.             },
  14.             0, PERIOD
  15.     );
  16. }
更新卡片信息,示例代码如下:
  1. private void refeshData() {
  2.     // 获取卡片集合
  3.     List formList = DatabaseUtils.queryForms(this, null);
  4.     // 查询电影集合
  5.     List movieInfoList = DatabaseUtils.queryMovieList(this, null);
  6.     if (formList == null && formList.size() < 1) {
  7.         return;
  8.     }
  9.     for (FormInfo formInfo : formList) {
  10.         ComponentProvider componentProvider = getComponentProvider(movieInfoList, formInfo.getDimension());
  11.         try {
  12.             initCardContent(componentProvider); // 隐藏提示信息 显示卡片内容
  13.             updateForm(formInfo.getFormId(), componentProvider);
  14.         } catch (FormException e) {
  15.             LogUtils.error("FormException", "FormException");
  16.         }
  17.     }
  18. }
隐藏提示信息,显示卡片内容,示例代码如下:
  1. private void initCardContent (ComponentProvider componentProvider) {
  2.         // 设置2*2卡片
  3.         componentProvider.setVisibility(ResourceTable.Id_card2_hints, Component.INVISIBLE);
  4.         componentProvider.setVisibility(ResourceTable.Id_card2_content, Component.VISIBLE);
  5.         // 设置2*4卡片
  6.         componentProvider.setVisibility(ResourceTable.Id_card4_hints, Component.INVISIBLE);
  7.         componentProvider.setVisibility(ResourceTable.Id_card4_content, Component.VISIBLE);
  8. }

MainAbilitySlice

主页面,主要展示电影排行榜(电影列表),其中电影列表的显示的示例代码如下:
  1. private void initMoviesContainer() {
  2.     // 获取数据库连接
  3.     helper = new DatabaseHelper(this);
  4.     connect = helper.getOrmContext("MovieDatabase", "MovieDatabase.db", MovieDatabase.class);
  5.     // 查询电影列表
  6.     movieInfoList = DatabaseUtils.queryMovieList(this, null);
  7.     // 创建MoviesListProvider对象,用于列表的展示
  8.     moviesListProvider = new MoviesListProvider(movieInfoList, this);
  9.     moviesListContainer.setItemProvider(moviesListProvider);
  10. }
给列表item设置点击事件,即点击跳转到对应电影的详情页,示例代码如下:
  1. private void initListener() {
  2.     moviesListContainer.setItemClickedListener((listContainer, component, position, id) -> {
  3.         getUITaskDispatcher().asyncDispatch(new Runnable() {
  4.             @Override
  5.             public void run() {
  6.                 // 跳转到电影详情页,携带参数,电影id
  7.                 toAnotherPage(position);
  8.             }
  9.         });
  10.     });
  11. }

MoviesDetailAbilitySlice

电影详情页,用于显示电影的详细信息,如电影介绍,演员表,剧照等。获取进入页面携带的参数并查询电影信息,示例代码如下:
  1. public void initParam(Intent intent) {
  2.     // 获取携带的电影id参数
  3.     if (intent.hasParameter("movieId")) {
  4.         Long movieId = intent.getLongParam("movieId", 0);
  5.         if (movieId == 0) {
  6.             return;
  7.         }
  8.         // 根据电影id查询电影信息
  9.         List movies = DatabaseUtils.queryMovieList(this, movieId);
  10.         if (movies.size() <= 0) {
  11.             return;
  12.         }
  13.         // 给各组件赋值
  14.         MovieInfo movieInfo = movies.get(0);
  15.         title = movieInfo.getTitle();
  16.         image = movieInfo.getImgUrl();
  17.         rating = movieInfo.getRating();
  18.         type = movieInfo.getType();
  19.         introduction = movieInfo.getIntroduction();
  20.         commentCount = movieInfo.getCommentcount();
  21.     }
  22. }
给各组件赋值,示例代码如下:
  1. private void initView() {
  2.     initViewAnnotation();
  3.     moviesRating.setText(rating);
  4.     moviesCommentCount.setText("电影类型: " + type);
  5.     moviesTitle.setText(title);
  6.     moviesImage.setPixelMap(CommonUtils.getPixelMapFromPath(this, image, WIDTH, HIGHT).get());
  7.     moviesImage.setCornerRadius(RADIUS);
  8.     setText(introduction);
  9.     mExpansionButton.setVisibility(VISIBLE);
  10.     mExpansionButton.setClickedListener(va -> {
  11.         toggleExpansionStatus();
  12.     });
  13. }
电影介绍的展开与收起,示例代码如下:

  1. private void toggleExpansionStatus() {
  2.     mIsExpansion = !mIsExpansion;
  3.     if (mIsExpansion) {
  4.         mExpansionButton.setText("收起");
  5.         moviesIntroduction.setMaxTextLines(Integer.MAX_VALUE);
  6.     } else {
  7.         mExpansionButton.setText("全文");
  8.         moviesIntroduction.setMaxTextLines(MMAXLINE);
  9.     }
  10. }

6. 卡片的相关回调      
创建卡片事件的回调,示例代码如下:
  1. @Override
  2. protected ProviderFormInfo onCreateForm(Intent intent) {
  3.     // 卡片名称
  4.     String formName = intent.getStringParam(AbilitySlice.PARAM_FORM_NAME_KEY);
  5.     // 卡片id
  6.     Long formId = intent.getLongParam(AbilitySlice.PARAM_FORM_IDENTITY_KEY, 0);
  7.     // 卡片规格
  8.     int dimension = intent.getIntParam(AbilitySlice.PARAM_FORM_DIMENSION_KEY, DEFAULT_DIMENSION_2X2);
  9.     // 将卡片信息存入数据库
  10.     saveFormInfo(formId, formName, dimension);
  11.     // 创建卡片展示信息
  12.     ProviderFormInfo formInfo = null;
  13.     int layoutId = ResourceTable.Layout_form_list_pattern_form_card_2_2;
  14.     if (dimension == DIMENSION_2X4) {
  15.         layoutId = ResourceTable.Layout_form_list_pattern_form_card_2_4;
  16.     }
  17.     formInfo = new ProviderFormInfo(layoutId, this);
  18.     List movieInfoList = DatabaseUtils.queryMovieList(this, null);
  19.     ComponentProvider componentProvider = getComponentProvider(movieInfoList, dimension);
  20.     initCardContent(componentProvider); // 隐藏提示信息 显示卡片内容
  21.     formInfo.mergeActions(componentProvider);
  22.     return formInfo;
  23. }
其中可通过componentProvider 的setIntentAgent方法给卡片上的组件设置点击事件,第一个参数为组件的资源id,第二个参数为IntentAgent对象,示例代码如下:
  1. componentProvider.setIntentAgent(resourceIds.get(RESOUECE_AGENT_ID),
  2.         
  3.         getIntentAgent(movieInfo));
获取IntentAgent对象,示例代码如下:
  1. private IntentAgent getIntentAgent(MovieInfo movie) {
  2.     // 设置点击的跳转页面
  3.     Intent intent = new Intent();
  4.     Operation operation = new Intent.OperationBuilder()
  5.             .withDeviceId("")
  6.             .withBundleName(getBundleName())
  7.             .withAbilityName(MoviesDetailAbility.class.getName())
  8.             .build();
  9.     // 携带参数,电影id
  10.     intent.setParam("movieId", movie.getId());
  11.     intent.setOperation(operation);
  12.     List intentList = new ArrayList<>();
  13.     intentList.add(intent);
  14.     // 对于不同的响应事件,第一个参数requestCode需要不同,此处用电影id设为requestCode
  15.     IntentAgentInfo paramsInfo = new IntentAgentInfo(Math.toIntExact(movie.getId()),
  16.             IntentAgentConstant.OperationType.START_ABILITY,
  17.             IntentAgentConstant.Flags.UPDATE_PRESENT_FLAG, intentList, null);
  18.     IntentAgent intentAgent = IntentAgentHelper.getIntentAgent(this, paramsInfo);
  19.     return intentAgent;
  20. }
删除卡片事件的回调,示例代码如下:
  1. @Override
  2. protected void onDeleteForm(long formId) {
  3.     super.onDeleteForm(formId);
  4.     // 删除数据库中的卡片信息
  5.     DatabaseUtils.deleteForm(this, formId);
  6. }
系统桌面使用方主动定时定点更新卡片的回调,由于本篇Codelab未在此回调中做其他操作,因此不做介绍。此回调需要配合config.json中的配置,config.json配置示例代码如下:
  1. "forms": [
  2.           {
  3.             "landscapeLayouts": [
  4.               "$layout:form_list_pattern_form_card_2_2"
  5.             ],
  6.             "isDefault": true,
  7.             "scheduledUpdateTime": "10:40",
  8.             "defaultDimension": "2*2",
  9.             "name": "form_card",
  10.             "description": "This is a form card",
  11.             "colorMode": "auto",
  12.             "type": "Java",
  13.             "supportDimensions": [
  14.               "2*2"
  15.             ],
  16.             "portraitLayouts": [
  17.               "$layout:form_list_pattern_form_card_2_2"
  18.             ],
  19.             "updateEnabled": true,
  20.             "updateDuration": 1
  21.           }
  22.         ]

说明
上述的"scheduledUpdateTime": "10:40","updateDuration": 1分别为桌面使用方主动更新卡片的时间和间隔(1表示30分钟更新一次),详细说明可参考Java卡片开发指导

7. 回顾和总结      本篇Codelab我们介绍了Java电影卡片的页面布局开发和卡片几个重要的回调函数的处理,在主页面可以通过向上滑动app图标进行卡片的创建,点击卡片或者app图标进入电影英国威廉希尔公司网站 ,点击英国威廉希尔公司网站 中的每个电影进入电影详情页,在详情页中点击全部展开功能进行电影剧情内容的收缩。
   

8. 恭喜你      
目前你已经成功完成了Codelab并且学到了:
  • 如何进行卡片的创建
  • 如何进行卡片的刷新
  • 卡片的事件控制
  • 如何进行电影英国威廉希尔公司网站 和详情页的布局
  • 如何开发电影剧情展开收起功能
   

9. 参考         

回帖(1)

挽你何用

2021-9-15 10:08:20
这教程太详细了吧

更多回帖

×
发帖