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

阅读量0
0
1
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. <DependentLayout
  2.         ohos:height="40vp"
  3.         ohos:width="match_parent"
  4.         ohos:orientation="horizontal"
  5.         >
  6.         <Text
  7.                 ohos:id="$+id:title"
  8.                 ohos:height="match_parent"
  9.                 ohos:width="100vp"
  10.                 ohos:end_margin="12vp"
  11.                 ohos:start_margin="44vp"
  12.                 ohos:text="$string:title"
  13.                 ohos:text_color="#E5000000"
  14.                 ohos:text_size="16fp"
  15.                 ohos:text_weight="500"
  16.                 ohos:bottom_margin="5vp"
  17.                 ohos:top_margin="10vp"/>

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

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

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

  34.                 <Text
  35.                         ohos:id="$+id:movie_bottom_introduction_2x4"
  36.                         ohos:height="match_content"
  37.                         ohos:width="match_parent"
  38.                         ohos:text_color="#99000000"
  39.                         ohos:text_size="10fp"
  40.                         ohos:text_weight="400"
  41.                         ohos:top_margin="2vp"
  42.                         ohos:truncation_mode="ellipsis_at_end"/>
  43.         </DirectionalLayout>
  44. </DirectionalLayout>
复制代码
电影首页布局

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

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

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

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

  1. <ScrollView
  2.         ohos:height="match_parent"
  3.         ohos:width="match_parent">
  4. <ListContainer
  5.         ohos:id="$+id:movies_container"
  6.         ohos:width="match_parent"
  7.         ohos:height="match_parent"/>
  8. </ScrollView>
复制代码
用于ListContainer的item(item_movies_layout.xml)示例代码如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DirectionalLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:height="110vp"
  5.     ohos:width="match_parent"
  6.     ohos:orientation="vertical">

  7.     <DirectionalLayout
  8.         ohos:height="109.5vp"
  9.         ohos:width="match_parent"
  10.         ohos:orientation="horizontal"
  11.         ohos:padding="10vp">

  12.         <!--排名序号-->
  13.         <Text
  14.             ohos:id="$+id:item_movies_id"
  15.             ohos:height="match_content"
  16.             ohos:width="8vp"
  17.             ohos:layout_alignment="center"
  18.             ohos:left_margin="15vp"
  19.             ohos:right_margin="20vp"
  20.             ohos:text_alignment="center"
  21.             ohos:text_color="red"
  22.             ohos:text_size="18vp"
  23.             ohos:text_weight="30000"
  24.             />

  25.         <!--电影图片-->

  26.         <Image
  27.             ohos:id="$+id:item_movies_image"
  28.             ohos:height="110vp"
  29.             ohos:width="110vp"
  30.             ohos:clip_alignment="center"
  31.             ohos:layout_alignment="center"
  32.             ohos:scale_mode="stretch"
  33.             />
  34.         <!--中间的-->
  35.         <DirectionalLayout
  36.             ohos:height="match_parent"
  37.             ohos:width="150vp"
  38.             ohos:orientation="vertical">

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

  46.             <DirectionalLayout
  47.                 ohos:height="match_content"
  48.                 ohos:width="match_content"
  49.                 ohos:orientation="horizontal"
  50.                 ohos:top_margin="5vp">

  51.                 <Image
  52.                     ohos:height="12vp"
  53.                     ohos:width="12vp"
  54.                     ohos:background_element="$media:rating"
  55.                     ohos:left_margin="10vp"/>

  56.                 <Image
  57.                     ohos:height="12vp"
  58.                     ohos:width="12vp"
  59.                     ohos:background_element="$media:rating"/>

  60.                 <Image
  61.                     ohos:height="12vp"
  62.                     ohos:width="12vp"
  63.                     ohos:background_element="$media:rating"/>

  64.                 <Image
  65.                     ohos:height="12vp"
  66.                     ohos:width="12vp"
  67.                     ohos:background_element="$media:rating"/>

  68.                 <Image
  69.                     ohos:height="12vp"
  70.                     ohos:width="12vp"
  71.                     ohos:background_element="$media:rating1"/>

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

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

  91.         </DirectionalLayout>

  92.         <!--想看-->
  93.         <DirectionalLayout
  94.             ohos:height="match_parent"
  95.             ohos:width="50vp"
  96.             ohos:left_margin="5vp"
  97.             ohos:orientation="vertical">

  98.             <Image
  99.                 ohos:height="30vp"
  100.                 ohos:width="30vp"
  101.                 ohos:background_element="$media:like"/>

  102.             <Text
  103.                 ohos:height="30vp"
  104.                 ohos:width="30vp"
  105.                 ohos:text="$string:want_see"
  106.                 ohos:text_color="#FFF88B06"
  107.                 ohos:text_size="13fp"/>
  108.         </DirectionalLayout>

  109.     </DirectionalLayout>

  110.     <!--分割线-->
  111.     <Component
  112.         ohos:height="0.5vp"
  113.         ohos:width="match_parent"
  114.         ohos:background_element="#EAEAEC"
  115.         />
  116. </DirectionalLayout>
复制代码

电影详情页布局

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

对应的xml文件名为movies_detail_layout.xml,其中包含xml布局文件如下:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <DependentLayout
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos"
  4.     ohos:id="$+id:parent_layout"
  5.     ohos:height="match_parent"
  6.     ohos:width="match_parent"
  7.     ohos:background_element="#445164">

  8.     <ScrollView
  9.         ohos:height="match_parent"
  10.         ohos:width="match_parent">

  11.         <DirectionalLayout
  12.             ohos:height="match_content"
  13.             ohos:width="match_parent"
  14.             ohos:bottom_padding="70vp"
  15.             ohos:left_margin="20vp"
  16.             ohos:orientation="vertical"
  17.             ohos:right_margin="20vp">

  18.             <!--电影-->
  19.             <Text
  20.                 ohos:id="$+id:title_icon"
  21.                 ohos:height="match_content"
  22.                 ohos:width="match_content"
  23.                 ohos:left_margin="130vp"
  24.                 ohos:text="$string:movie"
  25.                 ohos:text_size="20fp"

  26.                 ohos:weight="1"/>

  27.             <!--电影下方-->
  28.             <DirectionalLayout
  29.                 ohos:height="match_content"
  30.                 ohos:width="match_parent"
  31.                 ohos:alignment="vertical_center"
  32.                 ohos:orientation="horizontal"
  33.                 ohos:top_padding="15vp">
  34.                 <!--电影图片-->
  35.                 <Image
  36.                     ohos:id="$+id:image_content"
  37.                     ohos:height="200vp"
  38.                     ohos:width="150vp"
  39.                     ohos:image_src="$media:movies_image11"
  40.                     ohos:scale_mode="stretch"
  41.                     />

  42.                 <!--电影图片右边-->
  43.                 <DirectionalLayout
  44.                     ohos:height="230vp"
  45.                     ohos:width="match_content"
  46.                     ohos:orientation="vertical"
  47.                     >

  48.                     <!--电影名字-->
  49.                     <Text
  50.                         ohos:id="$+id:title_text"
  51.                         ohos:height="match_content"
  52.                         ohos:width="140vp"
  53.                         ohos:left_margin="50vp"
  54.                         ohos:text_color="#000000"
  55.                         ohos:text_size="18fp"/>

  56.                     <!--电影类型-->
  57.                     <Text
  58.                         ohos:id="$+id:like_num"
  59.                         ohos:height="match_content"
  60.                         ohos:width="match_content"
  61.                         ohos:left_margin="20vp"
  62.                         ohos:text_color="#FFB4B7B3"
  63.                         ohos:text_size="15fp"
  64.                         ohos:top_margin="15vp"/>

  65.                     <!--主要演员-->
  66.                     <Text
  67.                         ohos:id="$+id:vip"
  68.                         ohos:height="match_content"
  69.                         ohos:width="match_content"
  70.                         ohos:left_margin="20vp"
  71.                         ohos:text="$string:starring"
  72.                         ohos:text_color="#FFB4B7B3"
  73.                         ohos:text_size="15fp"
  74.                         ohos:top_margin="5vp"/>

  75.                     <!--演员表-->
  76.                     <ScrollView
  77.                         ohos:height="match_content"
  78.                         ohos:width="match_parent"
  79.                         ohos:left_margin="20vp"
  80.                         ohos:top_margin="5vp">

  81.                         <DirectionalLayout
  82.                             ohos:height="match_content"
  83.                             ohos:width="match_content"
  84.                             ohos:orientation="horizontal">

  85.                             <Image
  86.                                 ohos:height="50vp"
  87.                                 ohos:width="50vp"
  88.                                 ohos:bottom_margin="5vp"
  89.                                 ohos:image_src="$media:movies_image11"
  90.                                 ohos:left_margin="1vp"
  91.                                 ohos:top_margin="5vp"
  92.                                 ohos:scale_mode="stretch"
  93.                                 />

  94.                             <Image
  95.                                 ohos:height="50vp"
  96.                                 ohos:width="50vp"
  97.                                 ohos:bottom_margin="5vp"
  98.                                 ohos:image_src="$media:movies_image3"
  99.                                 ohos:left_margin="1vp"
  100.                                 ohos:top_margin="5vp"
  101.                                 ohos:scale_mode="stretch"
  102.                                 />

  103.                             <Image
  104.                                 ohos:height="50vp"
  105.                                 ohos:width="50vp"
  106.                                 ohos:bottom_margin="5vp"
  107.                                 ohos:image_src="$media:movies_image5"
  108.                                 ohos:left_margin="1vp"
  109.                                 ohos:top_margin="5vp"
  110.                                 ohos:scale_mode="stretch"
  111.                                 />

  112.                             <Image
  113.                                 ohos:height="50vp"
  114.                                 ohos:width="50vp"
  115.                                 ohos:bottom_margin="5vp"
  116.                                 ohos:image_src="$media:movies_image6"
  117.                                 ohos:left_margin="1vp"
  118.                                 ohos:top_margin="5vp"
  119.                                 ohos:scale_mode="stretch"
  120.                                 />
  121.                         </DirectionalLayout>
  122.                     </ScrollView>

  123.                     <!--想看-->
  124.                     <DirectionalLayout
  125.                         ohos:height="30vp"
  126.                         ohos:width="30vp"
  127.                         ohos:left_margin="10vp"
  128.                         ohos:orientation="horizontal"
  129.                         ohos:top_margin="55vp">

  130.                         <Image
  131.                             ohos:height="30vp"
  132.                             ohos:width="30vp"
  133.                             ohos:background_element="$media:like"/>

  134.                     </DirectionalLayout>

  135.                 </DirectionalLayout>

  136.             </DirectionalLayout>

  137.             <!--评分-->
  138.             <DirectionalLayout
  139.                 ohos:height="match_content"
  140.                 ohos:width="match_content"
  141.                 ohos:orientation="horizontal"
  142.                 ohos:top_margin="5vp">

  143.                 <Image
  144.                     ohos:height="20vp"
  145.                     ohos:width="20vp"
  146.                     ohos:background_element="$media:rating"
  147.                     ohos:left_margin="10vp"/>

  148.                 <Image
  149.                     ohos:height="20vp"
  150.                     ohos:width="20vp"
  151.                     ohos:background_element="$media:rating"/>

  152.                 <Image
  153.                     ohos:height="20vp"
  154.                     ohos:width="20vp"
  155.                     ohos:background_element="$media:rating"/>

  156.                 <Image
  157.                     ohos:height="20vp"
  158.                     ohos:width="20vp"
  159.                     ohos:background_element="$media:rating"/>

  160.                 <Image
  161.                     ohos:height="20vp"
  162.                     ohos:width="20vp"
  163.                     ohos:background_element="$media:rating1"/>

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

  174.             <!--剧情简介-->
  175.             <Text
  176.                 ohos:id="$+id:title_content1"
  177.                 ohos:height="match_content"
  178.                 ohos:width="match_parent"
  179.                 ohos:left_margin="15vp"
  180.                 ohos:text="$string:introduction"
  181.                 ohos:text_alignment="horizontal_center"
  182.                 ohos:text_color="#000000"
  183.                 ohos:text_size="16vp"
  184.                 ohos:top_margin="25vp"/>

  185.             <!--简介内容-->
  186.             <Text
  187.                 ohos:id="$+id:title_content"
  188.                 ohos:height="match_content"
  189.                 ohos:width="match_parent"
  190.                 ohos:background_element="#415165"
  191.                 ohos:multiple_lines="true"
  192.                 ohos:text=""
  193.                 ohos:text_alignment="horizontal_center"
  194.                 ohos:text_color="white"
  195.                 ohos:text_size="16vp"
  196.                 ohos:top_margin="5vp"/>

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

  210.             <!--剧照-->
  211.             <Text
  212.                 ohos:id="$+id:movie_stills"
  213.                 ohos:height="match_content"
  214.                 ohos:width="match_parent"
  215.                 ohos:left_margin="15vp"
  216.                 ohos:text="$string:stills"
  217.                 ohos:text_alignment="horizontal_center"
  218.                 ohos:text_color="#000000"
  219.                 ohos:text_size="16vp"
  220.                 ohos:top_margin="25vp"/>

  221.             <ScrollView
  222.                 ohos:height="match_content"
  223.                 ohos:width="match_content">

  224.                 <DirectionalLayout
  225.                     ohos:height="match_content"
  226.                     ohos:width="match_content"
  227.                     ohos:orientation="horizontal">

  228.                     <Image
  229.                         ohos:height="100vp"
  230.                         ohos:width="100vp"
  231.                         ohos:bottom_margin="10vp"
  232.                         ohos:image_src="$media:movies_image6"
  233.                         ohos:left_margin="1vp"
  234.                         ohos:top_margin="10vp"
  235.                         ohos:scale_mode="stretch"
  236.                         />

  237.                     <Image
  238.                         ohos:height="100vp"
  239.                         ohos:width="100vp"
  240.                         ohos:bottom_margin="10vp"
  241.                         ohos:image_src="$media:movies_image10"
  242.                         ohos:left_margin="1vp"
  243.                         ohos:top_margin="10vp"
  244.                         ohos:scale_mode="stretch"
  245.                         />

  246.                     <Image
  247.                         ohos:height="100vp"
  248.                         ohos:width="100vp"
  249.                         ohos:bottom_margin="10vp"
  250.                         ohos:image_src="$media:movies_image3"
  251.                         ohos:left_margin="1vp"
  252.                         ohos:top_margin="10vp"
  253.                         ohos:scale_mode="stretch"
  254.                         />

  255.                     <Image
  256.                         ohos:height="100vp"
  257.                         ohos:width="100vp"
  258.                         ohos:bottom_margin="10vp"
  259.                         ohos:image_src="$media:movies_image5"
  260.                         ohos:left_margin="1vp"
  261.                         ohos:top_margin="10vp"
  262.                         ohos:scale_mode="stretch"
  263.                         />
  264.                 </DirectionalLayout>
  265.             </ScrollView>

  266.         </DirectionalLayout>

  267.     </ScrollView>

  268. </DependentLayout>
复制代码

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<MovieInfo> 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<FormInfo> formList = DatabaseUtils.queryForms(this, null);
  4.     // 查询电影集合
  5.     List<MovieInfo> 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<MovieInfo> 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<MovieInfo> 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<Intent> 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. 参考         

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友