自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HarmonyOS開發(fā),從listContainer談容器類控件的使用

開發(fā) 前端 OpenHarmony
容器類控件在生活中還是比較常見的,比如文件列表,圖片輪播等等,容器類控件主要就是負(fù)責(zé)容納真正的內(nèi)容,在界面上一般沒有自己真正的"形象",屬于內(nèi)容后面的綠葉,在后面默默的撐起控件的光彩。

[[441284]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

1.什么叫容器類控件

容器類控件在生活中還是比較常見的,比如文件列表,圖片輪播等等。

2.容器類控件有什么特點(diǎn)

容器類控件主要就是負(fù)責(zé)容納真正的內(nèi)容,在界面上一般沒有自己真正的"形象",屬于內(nèi)容后面的綠葉,在后面默默的撐起控件的光彩。

以listContainer的示意圖:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

假設(shè)我們有一個(gè)下載列表,要做這樣一個(gè)列表,有兩種方法,一種就是硬編碼,把東西一個(gè)一個(gè)寫在layout上面,但那顯然是最低級(jí)最無(wú)腦的做法,咱們程序員都自詡高智商人才,不能做那蠢事是不。

另一種高級(jí)的做法就是搞一個(gè)列表容器,把要顯示的內(nèi)容抽象成一個(gè)小的layout,然后按順序排列出來塞到listContainer就行.

3.怎么學(xué)

3.1 準(zhǔn)備好你的layout內(nèi)容

首先是官方的教程:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-listcontainer-0000001060007847

這篇教程很基礎(chǔ),介紹了一個(gè)最基本的列表容器,但是也僅限基礎(chǔ),如果是app開發(fā)新手比如我這樣的就很容易搞蒙,一眼看去不知所以,所以我覺得還是按我的方式去解釋這個(gè)東西。

4.準(zhǔn)備工作

首先設(shè)計(jì)好你要展示的內(nèi)容,比如下載列表,我們?cè)O(shè)計(jì)成左邊放一張圖片,右邊分兩個(gè)控件,一個(gè)Text,下方放一個(gè)進(jìn)度條,大概就這意思:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū) 

先把這個(gè)layout設(shè)計(jì)出來:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:orientation="horizontal"
  7.  
  8.     <Image 
  9.         ohos:id="$+id:movie_img" 
  10.         ohos:height="100vp" 
  11.         ohos:width="100vp" 
  12.         ohos:layout_alignment="left" 
  13.         ohos:image_src="$media:setting" 
  14.         ohos:scale_mode="clip_center" 
  15.         /> 
  16.     <DirectionalLayout 
  17.         ohos:id="$+id:movie_info" 
  18.         ohos:height="match_parent" 
  19.         ohos:width="match_parent" 
  20.         ohos:orientation="vertical" 
  21.         > 
  22.         <Text 
  23.             ohos:id="$+id:movie_name" 
  24.             ohos:width="match_parent" 
  25.             ohos:height="30vp" 
  26.             ohos:left_margin="3vp" 
  27.             ohos:text_size="30fp" 
  28.             ohos:text="亮劍-18" 
  29.             /> 
  30.         <ProgressBar 
  31.             ohos:id="$+id:progressbar" 
  32.             ohos:progress_width="10vp" 
  33.             ohos:height="60vp" 
  34.             ohos:width="600vp" 
  35.             ohos:max="100" 
  36.             ohos:min="0" 
  37.             ohos:progress="60"/> 
  38.     </DirectionalLayout> 
  39.  
  40. </DirectionalLayout> 

預(yù)覽窗口看見到是這樣:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

3.2 準(zhǔn)備listContainer

有了layout,還要有容器把他裝起來,就跟果樹長(zhǎng)果子一樣,有了果子,還得有樹。

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <DirectionalLayout 
  3.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  4.     ohos:height="match_parent" 
  5.     ohos:width="match_parent" 
  6.     ohos:orientation="vertical"
  7.     <Text 
  8.         ohos:width="match_parent" 
  9.         ohos:height="30vp" 
  10.         ohos:text="下載列表" 
  11.         ohos:text_size="30vp" 
  12.         ohos:top_margin="10vp" 
  13.         ohos:text_alignment="center" 
  14.         /> 
  15.     <ListContainer 
  16.         ohos:id="$+id:download_list" 
  17.         ohos:height="match_content" 
  18.         ohos:width="match_parent" 
  19.         ohos:scrollbar_background_color="#d2a456" 
  20.         > 
  21.  
  22.     </ListContainer> 
  23.  
  24. </DirectionalLayout> 

但是這東西沒有界面,目前還沒法預(yù)覽,實(shí)在要預(yù)覽的話是這個(gè)界面。

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

4.初始化

在下載列表的abilitySlice的onStart里面假如初始化函數(shù):

  1. @Override 
  2.  protected void onStart(Intent intent) { 
  3.      super.onStart(intent); 
  4.      setUIContent(ResourceTable.Layout_movie_containerlist); 
  5.  
  6.      initDownloadListContainer(); 
  7.  } 
  8.  
  9.  private void initDownloadContainerList(){ 
  10.      ListContainer listContainer=(ListContainer) findComponentById(ResourceTable.Id_download_list); 
  11.      if(listContainer != null){ 
  12.          ArrayList<downloadItem> list=getData(); 
  13.          downloadItemProvider itemPro=new downloadItemProvider(list,this); 
  14.          listContainer.setItemProvider(itemPro); 
  15.      } 
  16.  } 

 看第10行,首先咱們把listContainer獲取到,為什么要獲取到呢,因?yàn)榻酉聛砦覀兙鸵锶麞|西了。

那怎么塞呢,看第15行,我們往這個(gè)listContainer里面設(shè)置了一叫itemPro的東西,這里引入了一個(gè)Provider,這個(gè)provider負(fù)責(zé)幫我們提供數(shù)據(jù),對(duì)于這個(gè)provider官方的文檔有簡(jiǎn)單的幾個(gè)接口介紹:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

其他的都還好懂,感覺最后一個(gè)有些費(fèi)解,什么意思呢:

你那個(gè)listContainer嘛,里面肯定是有很多項(xiàng),像一個(gè)數(shù)組一樣,我們想拿到每一個(gè)列表項(xiàng)里面的圖形控件,就得用這個(gè)接口,不然大家都長(zhǎng)一樣,你怎么知道你的數(shù)據(jù)結(jié)構(gòu)對(duì)應(yīng)哪個(gè)圖形控件。

這里我們看到itemPro的創(chuàng)建需要一個(gè)list做參數(shù),那在java里面就用ArrayList了,我們就來實(shí)現(xiàn)一下這個(gè)獲取列表的接口:

  1. private ArrayList<downloadItem> getData(){ 
  2.       ArrayList<downloadItem> list=new ArrayList<>(); 
  3.  
  4.       for (int i=0;i<8;i++) 
  5.       { 
  6.           downloadItem item = new downloadItem("亮劍-"+i+1); 
  7.           DirectionalLayout layout = (DirectionalLayout) LayoutScatter.getInstance(getContext()).parse(ResourceTable.Layout_movie_item,null,false); 
  8.           item.setLayout(layout); 
  9.           item.setProgress(i*10); 
  10.           list.add(item); 
  11.  
  12.       } 
  13.  
  14.       return list; 
  15.   } 

 這個(gè)很好理解了,就是創(chuàng)建一個(gè)list,然后把數(shù)據(jù)填充進(jìn)去,這里的示例,我讓每一個(gè)列表顯示不一樣的文字,然后再把每個(gè)進(jìn)度條顯示不一樣的值,返回過去就行了。

這里面又涉及到一個(gè)東西,就是我們的downloadItem,這個(gè)item其實(shí)就是對(duì)應(yīng)的我們那個(gè)下載信息展示的具體信息,就是java里面的一個(gè)類,先創(chuàng)造出一個(gè)結(jié)構(gòu)類出來:

  1. public class downloadItem { 
  2.  
  3.     private static final String TAG = imageScannerSlice.class.getSimpleName(); 
  4.  
  5.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0x00201, TAG); 
  6.  
  7.  
  8.     String name
  9.     Image image; 
  10.     int progress;//[0-100]% 
  11.  
  12.     DirectionalLayout layout; 
  13.  
  14.     public downloadItem(String name){ 
  15.         this.name = name
  16.  
  17.     } 
  18.  
  19.     public void downloadItem(String name, Image img) { 
  20.         this.name = name
  21.         this.image = image; 
  22.     } 
  23.  
  24.     public void setLayout(DirectionalLayout layout){ 
  25.         if(layout == null){ 
  26.             HiLog.error(LABEL_LOG,"setLayout is NULL"); 
  27.             return
  28.         } 
  29.         this.layout =layout; 
  30.  
  31.         Text text =(Text) layout.findComponentById(ResourceTable.Id_movie_name); 
  32.         text.setText(name); 
  33.     } 
  34.  
  35.     public void setProgress(int progress) { 
  36.         if(progress<0) progress=0; 
  37.         if (progress>100) progress=100; 
  38.  
  39.         this.progress = progress; 
  40.         if(layout == null){ 
  41.             return
  42.         } 
  43.         ProgressBar progressBar =(ProgressBar) layout.findComponentById(ResourceTable.Id_progressbar); 
  44.         progressBar.setProgressValue(progress); 
  45.     } 

可以看到,我們?cè)谶@個(gè)結(jié)構(gòu)里面做了一個(gè)setLayout的動(dòng)作,這個(gè)就是為了把我們每個(gè)結(jié)構(gòu)對(duì)應(yīng)的圖形控件對(duì)應(yīng)起來,有了這東西,在Provider里面的getComponent接口里面就好填充數(shù)據(jù)了,整個(gè)provider長(zhǎng)這樣:

  1. public class downloadItemProvider extends BaseItemProvider { 
  2.  
  3.     private List<downloadItem> list; 
  4.     private AbilitySlice slice; 
  5.  
  6.     public downloadItemProvider(List<downloadItem> list, AbilitySlice slice){ 
  7.         this.list = list; 
  8.         this.slice = slice; 
  9.  
  10.     } 
  11.  
  12.     @Override 
  13.     public int getCount() { 
  14.         return this.list!=null ? this.list.size() : 0; 
  15.     } 
  16.  
  17.     @Override 
  18.     public Object getItem(int i) { 
  19.         if(this.list != null && i>0 && i <list.size()) 
  20.         { 
  21.             return this.list.get(i); 
  22.         } 
  23.         return null
  24.     } 
  25.  
  26.     @Override 
  27.     public long getItemId(int i) { 
  28.  
  29.         return i; 
  30.     } 
  31.  
  32.  
  33.     @Override 
  34.     public Component getComponent(int i, Component component, ComponentContainer componentContainer) { 
  35.  
  36.          if(component != null){ 
  37.             return component; 
  38.         } 
  39.          
  40.         downloadItem item = (downloadItem)this.getItem(i); 
  41.         return item.layout; 
  42.  
  43.     } 
  44.  
  45.  

可以看到我們的getComponent就是把我們的downloadItem找到,然后直接返回我們事先用setlayout接口傳進(jìn)去的layout控件。

5.效果展示

把上面的代碼片段進(jìn)行整合,放進(jìn)工程里面,最后的效果就是這樣:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

到這里,我們的listContainer,列表容器控件就完成了,如果感覺沒看懂的,可以先去看一下官方的教程:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-listcontainer-0000001060007847

然后再來看本教程,應(yīng)該就能理清了。

6.pageSlider控件

所謂的pageSlider能夠?qū)崿F(xiàn)一個(gè)大圖輪播的效果,官方文檔在這:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-pageslider-0000001091933258

效果在官方手冊(cè)上也有

從編程邏輯上來說,跟listContainer的邏輯是一樣的,首先準(zhǔn)備好你的展示頁(yè)面,然后創(chuàng)建一個(gè)容器:pageSlide,再給pageSlider一個(gè)Provider用來提供數(shù)據(jù),再初始化一下就好了。

如果讀懂了上面listContainer的邏輯,這個(gè)pagesiler簡(jiǎn)直就太小兒科了,基于這樣的邏輯,我們能很快把我們的下載列表改造成pagesilde形式:

相關(guān)的xml文件我就不貼了,參照官方代碼就可以做到

  1. public class downloadItemPageProvider extends PageSliderProvider { 
  2.     //數(shù)據(jù)實(shí)體類 
  3. //    public static class DataItem{ 
  4. //        String mText; 
  5. //        public DataItem(String txt) { 
  6. //            mText = txt; 
  7. //        } 
  8. //    } 
  9.     // 數(shù)據(jù)源,每個(gè)頁(yè)面對(duì)應(yīng)list中的一項(xiàng) 
  10.     private List<downloadItem> list; 
  11.     private Context mContext; 
  12.  
  13.     public downloadItemPageProvider(List<downloadItem> list, Context context) { 
  14.         this.list = list; 
  15.         this.mContext = context; 
  16.     } 
  17.     @Override 
  18.     public int getCount() { 
  19.         return list.size(); 
  20.     } 
  21.     @Override 
  22.     public Object createPageInContainer(ComponentContainer componentContainer, int i) { 
  23.  
  24.         final downloadItem item = list.get(i); 
  25. //        DirectionalLayout layout =new DirectionalLayout(mContext);//(DirectionalLayout) componentContainer.findComponentById(ResourceTable.Id_home_info); 
  26.  
  27.  
  28.         DirectionalLayout layout =(DirectionalLayout) LayoutScatter.getInstance(mContext).parse(ResourceTable.Layout_home_info,null,false); 
  29.  
  30.         componentContainer.addComponent(layout); 
  31.         item.setLayout(layout); 
  32.         return layout; 
  33.     } 
  34.     @Override 
  35.     public void destroyPageFromContainer(ComponentContainer componentContainer, int i, Object o) { 
  36.         componentContainer.removeComponent((Component) o); 
  37.     } 
  38.     @Override 
  39.     public boolean isPageMatchToObject(Component component, Object o) { 
  40.         //可添加具體處理邏輯 
  41.         //... 
  42.         return true
  43.     } 

這個(gè)pageSlid的Provider跟List的Provider大體邏輯差不多的,只是稍稍有些不同,就是這個(gè)里面需要實(shí)現(xiàn)createPageInContainer,而不是list的Provider里面的getComponent接口,但是仔細(xì)觀察我里面的代碼,跟之前那個(gè)如出一轍,然后改造一下初始化那里:

  1. private void initPageSlide(String account) { 
  2.       pageSlider = (PageSlider) findComponentById(ResourceTable.Id_page_slider); 
  3.       pageSlider.setProvider(new downloadItemPageProvider(getData(), this)); 
  4.   } 

 這樣就能輕松的做出一個(gè)左右滑屏的頁(yè)面滑動(dòng)器。

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

7.總結(jié)

個(gè)人感覺比較自豪的一處是那個(gè)數(shù)據(jù)結(jié)構(gòu)跟圖形控件綁定的邏輯,比官方的好用。

其實(shí)總結(jié)下來,做容器類的空間需要的流程是:

#星光計(jì)劃2.0#HarmonyOS開發(fā),從listContainer談容器類控件的使用-鴻蒙HarmonyOS技術(shù)社區(qū)

理解了這個(gè)套路.你就能做出想要的效果

其實(shí)還可以把pageSilde和listContainer結(jié)合起來使用做出更復(fù)雜好玩的界面效果,期待你的反饋。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-08-12 14:59:15

鴻蒙HarmonyOS應(yīng)用

2011-04-19 17:06:24

bada控件bada

2009-08-05 18:32:28

HtmlTextWriASP.NET控件開發(fā)

2020-12-28 10:15:18

鴻蒙HarmonyOSListContain

2011-12-06 10:04:12

QQ手機(jī)移動(dòng)應(yīng)用應(yīng)用設(shè)計(jì)

2015-08-18 14:10:09

Docker云計(jì)算PaaS

2011-12-05 23:08:11

諾基亞

2017-08-17 16:12:09

MySQL架構(gòu)設(shè)計(jì)

2009-11-04 13:33:13

ADO.NET Dat

2014-06-08 23:19:43

DevOps敏捷開發(fā)

2019-12-24 11:19:44

容器DockerLinux

2017-11-21 14:32:05

容器持久存儲(chǔ)

2021-08-25 09:49:48

鴻蒙HarmonyOS應(yīng)用

2015-07-02 10:37:32

C#Json字符串類代碼

2011-03-03 14:57:00

手機(jī)交互設(shè)計(jì)產(chǎn)品管理信息架構(gòu)

2020-01-13 10:45:35

JavaScript解析前端

2021-02-20 09:47:44

Covid-19工業(yè)智能

2010-08-06 14:13:31

FlexDataGrid分頁(yè)控

2010-05-04 13:20:01

負(fù)載均衡服務(wù)

2012-08-02 11:47:38

綁好鞋帶 嵌入式系統(tǒng)開
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)