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

HarmonyOS從Text的寶藏屬性想到的TabList新玩法

系統(tǒng) OpenHarmony
我們知道所有的控件幾乎都是拿Text做Base繼承出來的,那Text里面有些什么呢?你說,你說說,沒想到濃眉大眼的Text也叛變啦.你這不是把Image的飯碗給搶了嗎.

[[443284]]

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

一.前言

前幾天,運(yùn)營小姐姐跟我說再發(fā)幾篇文章有望沖擊星光計劃創(chuàng)作先鋒獎,我一看有這等好事,哈,說笑呢,我是為了那些獎品嗎,這不是小瞧我么,對于這個請求,依我的性格那當(dāng)然

直接答應(yīng)啊,能拿大獎造福大家不香么.

于是乎我只好拿出昨天發(fā)現(xiàn)的壓箱底的寶藏內(nèi)容,沖擊一波大獎,誰都不許攔哈.

哈哈,開個小玩笑.

二.Text隱藏的王炸,全網(wǎng)暫時還未發(fā)掘

那既然要拿獎,總得拿出點(diǎn)真東西出來,于是打開了塵封的文檔,這一看可不得了,看起來簡單的text一點(diǎn)不簡單啊,直把我驚了一身冷汗.

事情是這樣的,我們知道所有的控件幾乎都是拿Text做Base繼承出來的,那Text里面有些什么呢?

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

就是他了,你說,你說說,沒想到濃眉大眼的Text也叛變啦.你這不是把Image的飯碗給搶了嗎.

跟據(jù)文檔,輕松就做出一個控件效果:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

但是這就完了嗎.

我現(xiàn)在想實現(xiàn)在程序運(yùn)行的時候動態(tài)改變這個圖該怎么辦.

三.動態(tài)修改上方圖標(biāo)

既然是動態(tài)修改,那自然就要在代碼上下功夫了

Text類里面查看一下,果然有Element相關(guān)的接口:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

哈哈,天意,這里面的參數(shù)寫得明明白白,我們可以設(shè)置上下左右四個方向的圖標(biāo)

話不多說,趕緊試一下

可是這個Element是什么呢.點(diǎn)進(jìn)去一看,心涼一半:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

原來是個超類啊,這讓我怎么用,官方文檔貌似沒有講這個的.

經(jīng)過在論壇的搜索,發(fā)現(xiàn)這么一篇寶藏文:

https://harmonyos.51cto.com/posts/8592

一句漫不經(jīng)心的說話,將我疑惑解開:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

原來你有兒子啊,話不多說,拿來就用

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

造出一個Element需要這三個東西,其中下面兩個我不認(rèn)識,去看Resource感覺挺復(fù)雜,那就只有PixelMap能用了

那怎么生成一個PixelMap呢:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

這里面提供了幾個靜態(tài)方法,對我而言,都沒有用

突然我想到在哪用過PixelMap,記得我的朋友應(yīng)該還記得那篇文章:

#星光計劃2.0#應(yīng)用開發(fā)-獨(dú)家發(fā)布-攝像頭掃描二維碼(Java版)

這里面有過把Image轉(zhuǎn)換成PixelMap的方法:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

于是乎立馬想到,Image里面應(yīng)該有取PixelMap的方法,結(jié)果天助我也:

  1. //先創(chuàng)建一個img 
  2.        Image img =new Image(getContext()); 
  3. //把media資源設(shè)置進(jìn)去 
  4.        img.setPixelMap(ResourceTable.Media_setting_large); 
  5. //直接取出生成PixelMapElement  
  6.        PixelMapElement pixelMapElement= new PixelMapElement(img.getPixelMap()); 

 接下來的事情就簡單了:

  1. Text account_text = (Text) findComponentById(ResourceTable.Id_text_helloworld); 
  2.        account_text.setAroundElements(null, pixelMapElement, nullnull); 

 后面效果就是這樣:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

其實這篇文章也解答了一位老兄今年1月份的帖子:

https://harmonyos.51cto.com/answer/386

四.就這?

到這里,很多朋友以為結(jié)束了,nonono

為什么我會冒出一身冷汗,因為我看到了官方文檔:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-component-tablist-tab-0000001062229749

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

這里展示了一個頂部標(biāo)簽頁,一般新聞,資訊,論壇類會用這種,我想要一個什么樣的效果呢?

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

我想在底部做出一個類似的切換效果,這種界面其實還是很常見的,比如微信

有了官方文檔的buff,很快我們就能做出一個類似的效果:

  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:alignment="top" 
  7.     ohos:orientation="vertical" 
  8.  
  9.     > 
  10.  
  11.  
  12.     <Text 
  13.         ohos:id="$+id:text_helloworld" 
  14.         ohos:height="match_content" 
  15.         ohos:width="match_content" 
  16.         ohos:top_margin="200vp" 
  17.         ohos:layout_alignment="horizontal_center" 
  18.         ohos:text="歡迎登錄系統(tǒng)" 
  19.         ohos:text_size="30fp" 
  20.         ohos:text_color="#58d421" 
  21.         ohos:element_top="$media:home_large" 
  22.  
  23.  
  24.         /> 
  25.  
  26.     <DirectionalLayout 
  27.         ohos:height="match_content" 
  28.         ohos:width="match_parent" 
  29.         ohos:top_margin="60vp" 
  30.         ohos:left_margin="30vp" 
  31.         ohos:orientation="horizontal" 
  32.         > 
  33.  
  34.         <Text 
  35.             ohos:height="30vp" 
  36.             ohos:width="50vp" 
  37.             ohos:text_size="20fp" 
  38.             ohos:text="賬號:" 
  39.             ohos:text_color="#58d421" 
  40.             /> 
  41.         <TextField 
  42.             ohos:id="$+id:account_input" 
  43.             ohos:height="30vp" 
  44.             ohos:width="230vp" 
  45.             ohos:left_margin="10vp" 
  46.             ohos:text_size="20fp" 
  47.  
  48.             ohos:background_element="$graphic:text_filed_style" 
  49.             /> 
  50.  
  51.     </DirectionalLayout> 
  52.  
  53.     <DirectionalLayout 
  54.         ohos:height="match_content" 
  55.         ohos:width="match_parent" 
  56.         ohos:top_margin="10vp" 
  57.         ohos:left_margin="30vp" 
  58.         ohos:orientation="horizontal" 
  59.         > 
  60.  
  61.         <Text 
  62.             ohos:height="30vp" 
  63.             ohos:width="50vp" 
  64.             ohos:text_size="20fp" 
  65.             ohos:text="密碼:" 
  66.             ohos:text_color="#58d421" 
  67.             /> 
  68.         <TextField 
  69.             ohos:id="$+id:pwd_input" 
  70.             ohos:height="30vp" 
  71.             ohos:width="230vp" 
  72.             ohos:text_input_type="pattern_password" 
  73.             ohos:left_margin="10vp" 
  74.             ohos:text_size="20fp" 
  75.             ohos:padding="0vp" 
  76.             ohos:background_element="$graphic:text_filed_style" 
  77.             /> 
  78.  
  79.     </DirectionalLayout> 
  80.  
  81.  
  82.     <Button 
  83.         ohos:top_margin="50vp" 
  84.         ohos:id="$+id:main_btn" 
  85.         ohos:height="50vp" 
  86.         ohos:width="100vp" 
  87.         ohos:clickable="true" 
  88.         ohos:text="登陸" 
  89.         ohos:layout_alignment="center" 
  90.         ohos:text_size="20vp" 
  91.         ohos:text_color="#58d421" 
  92.         ohos:scrollbar_background_color="#3FC390EF" 
  93.         ohos:background_element="$graphic:capsule_button_element" 
  94.  
  95.         /> 
  96.  
  97.     <TabList 
  98.         ohos:id="$+id:main_tabList" 
  99.         ohos:height="150vp" 
  100.         ohos:width="match_parent" 
  101.         ohos:text_size="20fp" 
  102.         ohos:layout_alignment="bottom" 
  103.         ohos:orientation="horizontal" 
  104.         ohos:normal_text_color="black" 
  105.         /> 
  106.  
  107. </DirectionalLayout> 
#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

但是仔細(xì)觀察一下,會發(fā)現(xiàn),微信上面選中的頁面不僅文字會變色,圖標(biāo)也會變色:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

接下來就是見證奇怪的時刻

五.制作按下圖片換色效果

為了實現(xiàn)這一步,最簡單的做法是找兩張圖片,比如一張彩色,一張黑色,那這種圖片哪里找呢?

在這個網(wǎng)站幾乎常見不常見的圖標(biāo)都能找到:

https://www.iconfont.cn/search/index?spm=a313x.7781069.1998910419.28&searchType=icon&q= home&page=1&fromCollection=-1&fills=&tag=

選中一個喜歡的圖標(biāo),點(diǎn)擊下載按鈕:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)
#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

左邊選顏色,右邊選尺寸,下載完放到media目錄就行

把圖標(biāo)都準(zhǔn)備好之后,就要想辦法了

官方的TabList和Tab都已經(jīng)實現(xiàn)好了,肯定不能動

那我們就用繼承吧:

  1. class myTab extends TabList.Tab { 
  2.  
  3.     PixelMapElement normal; 
  4.     PixelMapElement pressed; 
  5.  
  6.     Color defaultColor = Color.BLACK; 
  7.     public myTab(TabList list,Context context) { 
  8.         list.super(context); 
  9.         this.setTextColor(defaultColor); 
  10.  
  11.     } 
  12.     public void setImage(int normal_img,int pressed_img){ 
  13.         Image img = new Image(getContext()); 
  14.         img.setPixelMap(normal_img); 
  15.  
  16.         normal = new PixelMapElement(img.getPixelMap()); 
  17.         img.setPixelMap(pressed_img); 
  18.  
  19.         pressed = new PixelMapElement(img.getPixelMap()); 
  20.         super.setAroundElements(null,normal,null,null); 
  21.     } 
  22.  
  23.     public void isSelected(boolean select){ 
  24.         this.setTextColor(select?Color.BLUE:defaultColor); 
  25.         super.setAroundElements(null,select ? pressed : normal,null,null); 
  26.  
  27.     } 
  28.  

這里我們用myTab繼承了TabList里面的Tab類,就不去講語法了,總之這樣就行

注意這里面的兩個方法:

setImage(int normal_img,int pressed_img)方法用來設(shè)置兩個圖片,一個是普通未選中的狀態(tài),另一個就是選中的狀態(tài)

isSelected(boolean select)來指示當(dāng)Tab被選中的時候如何進(jìn)行切換圖片

在主程序的tabList里面添加事件監(jiān)聽:

  1. TabList tabList = (TabList) findComponentById(ResourceTable.Id_main_tabList); 
  2.  
  3.     myTab tab = new myTab(tabList,getContext()); 
  4.     tab.setText("home"); 
  5.     tab.setImage(ResourceTable.Media_home_large,ResourceTable.Media_home_large_pushed); 
  6.     tabList.addTab(tab); 
  7.  
  8.     myTab tab2 = new myTab(tabList,getContext()); 
  9.     tab2.setText("my"); 
  10.     tab2.setImage(ResourceTable.Media_my_large,ResourceTable.Media_my_large_pushed); 
  11.     tabList.addTab(tab2); 
  12.  
  13.  
  14.  
  15.     myTab tab3 = new myTab(tabList,getContext()); 
  16.     tab3.setText("setting"); 
  17.     tab3.setImage(ResourceTable.Media_setting_large,ResourceTable.Media_setting_large_pushed); 
  18.     tabList.addTab(tab3); 
  19.  
  20.     tabList.setFixedMode(true); 
  21.  
  22.  
  23.     tabList.addTabSelectedListener(new TabList.TabSelectedListener() { 
  24.         @Override 
  25.         public void onSelected(TabList.Tab tab) { 
  26.             // 當(dāng)某個Tab從未選中狀態(tài)變?yōu)檫x中狀態(tài)時的回調(diào) 
  27.             myTab mytab = (myTab)tab; 
  28.             mytab.isSelected(true); 
  29.         } 
  30.  
  31.         @Override 
  32.         public void onUnselected(TabList.Tab tab) { 
  33.             // 當(dāng)某個Tab從選中狀態(tài)變?yōu)槲催x中狀態(tài)時的回調(diào) 
  34.             myTab mytab = (myTab)tab; 
  35.             mytab.isSelected(false); 
  36.  
  37.         } 
  38.  
  39.         @Override 
  40.         public void onReselected(TabList.Tab tab) { 
  41.             // 當(dāng)某個Tab已處于選中狀態(tài),再次被點(diǎn)擊時的狀態(tài)回調(diào) 
  42.             this.onUnselected(tab); 
  43.         } 
  44.     }); 

大功告成,在模擬器里面運(yùn)行一下:

#星光計劃2.0# HarmonyOS從Text的寶藏屬性想到的TabList新玩法-鴻蒙HarmonyOS技術(shù)社區(qū)

里面有幾下圖片變藍(lán)然后又變白其實是出發(fā)了上面的onReselected(TabList.Tab tab)方法,我這里做法是直接變成未選中,大家也可以選擇忽略這個方法,根據(jù)自己的應(yīng)用場景靈活使用.

六.尚未解決的問題

1.本次使用了遠(yuǎn)程的tabList實現(xiàn)了底部文字及圖標(biāo)的切換效果,但是是利用切圖片的方式實現(xiàn)了,有沒有辦法能夠直接修改圖片的顏色,望有大神告知

2.使用原生的TabList方式做出這樣一個效果就是貌似PixelMapElement無法設(shè)置圖片的大小,這就是為什么大家會看到我的meida資源的圖片會有l(wèi)arge字樣,有沒有辦法設(shè)置圖片的大小希望有大神能告知

3.點(diǎn)擊Tab切換頁面的效果時間關(guān)系沒有做,而且本文重點(diǎn)也不在這,如果有想知道如何切換真正的頁面搜索論壇里面TabList有其他大牛寫的例子

七.總結(jié)

這篇文章屬于拋磚引玉,主要是想說明一個不經(jīng)意的發(fā)現(xiàn)也能發(fā)散出精彩的創(chuàng)意,可能在別人看來我這沒什么,但是技術(shù)這東西,都是自己才能懂.

之前鴻蒙系統(tǒng)很多功能總有網(wǎng)友說這有什么用,我想說的是:到底有什么用,不要問別人,問自己,有沒有那雙真正能發(fā)現(xiàn)精彩的眼睛.

用一張楚團(tuán)長的表情包與大家共勉:

[[443290]]

想了解更多內(nèi)容,請訪問:

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

https://harmonyos.51cto.com

 

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

2012-04-29 16:01:39

Phone

2024-05-27 08:39:17

Vue3變量響應(yīng)式

2013-12-19 14:04:18

MySQLMySQL優(yōu)化

2013-08-26 10:11:08

Intel固態(tài)硬盤超頻

2022-08-06 16:40:13

SDN網(wǎng)絡(luò)

2015-08-25 10:56:21

大數(shù)據(jù)

2013-10-08 10:53:36

2024-02-21 20:10:18

滾動視頻網(wǎng)頁

2019-01-31 17:22:22

華為

2013-08-28 10:44:46

2021-12-10 22:13:08

VR虛擬空間

2022-04-08 10:31:28

美團(tuán)代碼建設(shè)

2011-12-16 20:48:09

Siri

2016-11-10 19:14:18

當(dāng)當(dāng)雙11

2017-02-06 10:53:33

2017-04-19 09:21:00

數(shù)據(jù)備份信息

2017-07-21 10:14:41

高德極客地圖高德地圖

2013-01-29 11:02:10

應(yīng)用商店洗應(yīng)用

2021-03-03 12:40:59

微服務(wù)架構(gòu)軟件
點(diǎn)贊
收藏

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