精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS自定義組件之仿微信朋友圈主頁

開發 OpenHarmony
自定義組件是由開發者定義的具有一定特性的組件,通過擴展 Component 或其子類實現,可以精確控制屏幕元素的外觀,實現開發者想要達到的效果,也可響應用戶的點擊、觸摸、長按等操作。

[[433138]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

前言

在實際開發過程中,我們經常會遇到一些系統原有組件無法滿足的情況,而HarmonyOS提供了自定義組件的方式,我們使用自定義組件來滿足項目需求。自定義組件是由開發者定義的具有一定特性的組件,通過擴展 Component 或其子類實現,可以精確控制屏幕元素的外觀,實現開發者想要達到的效果,也可響應用戶的點擊、觸摸、長按等操作。下面通過自定義一個仿微信朋友圈主頁的組件來了解一下自定義組件的過程。

簡述

首先關于自定義組件,一般遵循以下幾個方式

首先,創建一個繼承 Component 或其子類的自定義組件類,并添加構造方法,如 MyComponent 。

實現 Component.EstimateSizeListener 接口,在 onEstimateSize 方法中進行組件測量,并通過 setEstimatedSize 方法通知組件。

自定義組件測量出的大小需通過 setEstimatedSize 通知組件,并且必須返回true使測量值生效。setEstimatedSize 方法的入參攜帶模式信息,可使用 Component.EstimateSpec.getChildSizeWithMode 方法進行拼接。

測量模式

自定義xml屬性,通過構造方法中攜帶的參數 attrSet,可以獲取到在 xml 中配置的屬性值,并應用在該自定義組件中。

實現 Component.DrawTask 接口,在 onDraw 方法中執行繪制任務,該方法提供的畫布 Canvas,可以精確控制屏幕元素的外觀。在執行繪制任務之前,需要定義畫筆 Paint。

實現 Component.TouchEventListener 或其他事件的接口,使組件可響應用戶輸入。

在 xml 文件中創建并配置自定義組件。

在 HarmonyOS 中 Component 是視圖的父類,既然組件都是繼承 Component 來實現的,那么我們也可以繼承它來實現我們想要的視圖了,根據具體流程,我們按照示例代碼來了解一下大致流程:

創建自定義布局

  1. ... 
  2. public class MyComponent extends Component implements Component.DrawTask,Component.EstimateSizeListener { 
  3.     private Paint paint; 
  4.     private Paint paintText; 
  5.  
  6.     private PixelMap bigImage; 
  7.  
  8.     private PixelMap smallImage; 
  9.  
  10.     public MyComponent(Context context) { 
  11.         this(context, null); 
  12.     } 
  13.  
  14.     public MyComponent(Context context, AttrSet attrSet) { 
  15.         this(context, attrSet,""); 
  16.     } 
  17.  
  18.     public MyComponent(Context context, AttrSet attrSet, String styleName) { 
  19.         super(context, attrSet, styleName); 
  20.         init(context); 
  21.     } 
  22.  
  23.     public void init(Context context) { 
  24.         // 設置測量組件的偵聽器 
  25.         setEstimateSizeListener(this); 
  26.         // 初始化畫筆 
  27.         initPaint(); 
  28.         // 添加繪制任務 
  29.         addDrawTask(this); 
  30.     } 
  31.  
  32.     private void initPaint() { 
  33.         paint = new Paint(); 
  34.         paint.setAntiAlias(true); 
  35.         paint.setStrokeCap(Paint.StrokeCap.ROUND_CAP); 
  36.         paint.setStyle(Paint.Style.STROKE_STYLE); 
  37.  
  38.         paintText = new Paint(); 
  39.         paintText.setStrokeCap(Paint.StrokeCap.ROUND_CAP); 
  40.         paintText.setStyle(Paint.Style.FILL_STYLE); 
  41.         paintText.setColor(Color.WHITE); 
  42.         paintText.setTextSize(50); 
  43.         paintText.setAntiAlias(true); 
  44.  
  45.         bigImage = PixelMapUtils.createPixelMapByResId(ResourceTable.Media_imageDev, getContext()).get(); 
  46.         smallImage = PixelMapUtils.createPixelMapByResId(ResourceTable.Media_icon, getContext()).get(); 
  47.  
  48.     } 
  49.  
  50.     @Override 
  51.     public void addDrawTask(Component.DrawTask task) { 
  52.         super.addDrawTask(task); 
  53.         task.onDraw(this, mCanvasForTaskOverContent); 
  54.     } 
  55.  
  56.     @Override 
  57.     public boolean onEstimateSize(int widthEstimateConfig, int heightEstimateConfig) { 
  58.         int width = Component.EstimateSpec.getSize(widthEstimateConfig); 
  59.         int height = Component.EstimateSpec.getSize(heightEstimateConfig); 
  60.         setEstimatedSize( 
  61.                 Component.EstimateSpec.getChildSizeWithMode(width, width, Component.EstimateSpec.NOT_EXCEED), 
  62.                 Component.EstimateSpec.getChildSizeWithMode(height, height, Component.EstimateSpec.NOT_EXCEED)); 
  63.         return true
  64.     } 
  65.  
  66.     @Override 
  67.     public void onDraw(Component component, Canvas canvas) { 
  68.         int width = getWidth(); 
  69.         int center = width / 2; 
  70.  
  71.         float length = (float) (center - Math.sqrt(2) * 1.0f / 2 * center); 
  72.  
  73.         // 獲取大圖片的大小 
  74.  
  75.         Size bigImageSize = bigImage.getImageInfo().size
  76.         RectFloat bigImageRect = new RectFloat(0, 0, width,  bigImageSize.height); 
  77.  
  78.         // 獲取小圖片的大小 
  79.         Size smallImageSize = smallImage.getImageInfo().size
  80.         RectFloat smallImageRect = new RectFloat(length * 5, length * 5 - 50, 1100, 1030); 
  81.  
  82.         canvas.drawPixelMapHolderRect(new PixelMapHolder(bigImage), bigImageRect, paint); 
  83.         canvas.drawPixelMapHolderRect(new PixelMapHolder(smallImage), smallImageRect, paint); 
  84.         canvas.drawText(paintText,"ABCDEFG",width - length * 3.3f, bigImageSize.height - length * 0.2f); 
  85.  
  86.     } 
  87.  

如上代碼,我們創建一個 MyComponent 繼承 Component ,并且在構造方法中,初始化一些畫筆屬性,傳入默認的圖片,當然也可以通過調用接口的方式在引用的地方傳入圖片。然后在 ondraw 方法中做具體的畫筆操作。通過 canvas.drawPixelMapHolderRect 方法畫出一大一小兩張可堆疊的圖片,并調整好位置參數。

在 Ability 中引用

實現組件之后,我們就可以在我們需要展示的 Ability 去調用這個自定義組件了。

  1. ... 
  2. public class ImageAbilitySlice extends AbilitySlice { 
  3.  
  4.     @Override 
  5.     protected void onStart(Intent intent) { 
  6.         super.onStart(intent); 
  7. //        super.setUIContent(ResourceTable.Layout_ability_image_main); 
  8.         drawMyComponent(); 
  9.     } 
  10.  
  11.     private void drawMyComponent() { 
  12.         // 聲明布局 
  13.         ScrollView myLayout = new ScrollView(this); 
  14.         DirectionalLayout.LayoutConfig config = new DirectionalLayout.LayoutConfig( 
  15.                 DirectionalLayout.LayoutConfig.MATCH_PARENT, DirectionalLayout.LayoutConfig.MATCH_PARENT); 
  16.         myLayout.setLayoutConfig(config); 
  17.         myLayout.setReboundEffect(true); 
  18.         MyComponent customComponent = new MyComponent(this); 
  19.         myLayout.addComponent(customComponent); 
  20.         super.setUIContent(myLayout); 
  21.     } 
  22.  

在XML文件中引用

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <ScrollView 
  3.     ohos:id="$+id:dl" 
  4.     xmlns:ohos="http://schemas.huawei.com/res/ohos" 
  5.     ohos:height="match_parent" 
  6.     ohos:width="match_parent" 
  7.     ohos:alignment="center" 
  8.     ohos:rebound_effect="true" 
  9.     ohos:orientation="vertical"
  10.  
  11.     <com.example.harmonyosdeveloperchenpan.MyComponent 
  12.         ohos:id="$+id:myComponent" 
  13.         ohos:height="match_parent" 
  14.         ohos:width="match_parent"/> 
  15.  
  16. </ScrollView> 

需要注意的是,微信朋友圈主頁的滑動有下拉回彈效果,所以我們需要設置 ScrollView 的布局屬性。通過在代碼中調用 setReboundEffect(true) 或者 xml 中設置 ohos:rebound_effect=“true” 來實現。

效果展示

#星光計劃1.0# HarmonyOS 自定義組件之仿微信朋友圈主頁-鴻蒙HarmonyOS技術社區

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-11-19 09:48:33

鴻蒙HarmonyOS應用

2013-11-06 14:25:30

微信朋友圈

2015-09-01 16:55:42

微信朋友圈圖片

2021-03-30 08:36:53

iOS微信朋友圏

2023-03-09 07:29:28

微信朋友圈架構

2021-05-31 08:23:47

應用開發前端

2013-04-12 03:40:53

微信開放平臺朋友圈

2021-06-23 10:24:06

微信macOS移動應用

2020-03-13 13:19:28

微信廣告隱私

2013-12-06 16:39:56

2013-11-29 11:46:49

微信朋友圈朋友圈生意淘寶

2021-08-14 23:23:49

ios微信朋友圈

2022-01-27 07:40:27

iOS微信朋友圈

2019-12-24 13:00:03

微信朋友圈移動應用

2021-11-01 10:21:36

鴻蒙HarmonyOS應用

2021-03-11 22:23:46

微信Mac版朋友圈

2020-11-05 14:26:43

微信朋友圏7.0.18

2021-03-31 06:05:08

微信朋友圈騰訊

2022-01-12 21:00:08

微信安卓騰訊

2022-07-15 16:45:35

slider滑塊組件鴻蒙
點贊
收藏

51CTO技術棧公眾號

国产男女猛烈无遮挡91| 亚洲成人精品视频| 椎名由奈jux491在线播放| 一区二区国产欧美| 亚洲午夜精品一区 二区 三区| 欧美一区二区高清| 亚洲中文字幕无码中文字| 成人动漫在线播放| 国产成人精品亚洲日本在线桃色| 国内免费久久久久久久久久久| 日韩精品卡通动漫网站| 78精品国产综合久久香蕉| 亚洲精品五月天| 久久人人九九| av在线亚洲天堂| 亚洲综合不卡| 另类图片亚洲另类| 亚洲成人日韩在线| 视频一区在线| 欧美在线免费观看亚洲| 2022中文字幕| 91社区在线观看| 成人精品高清在线| 国产在线拍揄自揄视频不卡99| 精品无码久久久久久久| 日韩欧美一区免费| 日韩精品在线私人| 中文字幕制服丝袜| 欧美aaaaaa| 一本色道**综合亚洲精品蜜桃冫| 日本成人在线不卡| 天堂中文8资源在线8| av资源站一区| 91香蕉视频在线下载| 影音先锋国产在线| 免费在线亚洲欧美| 久久久久国产视频| 中文字幕在线观看2018| 国产乱码精品一区二区亚洲| 亚洲精品www| 成人在线短视频| 欧美一区=区三区| 色视频一区二区| 国产一区二区在线视频播放| 日本在线视频网址| 18欧美亚洲精品| 亚洲一区二区免费视频软件合集| 狠狠v欧美ⅴ日韩v亚洲v大胸| 99国产麻豆精品| 国产一区二区不卡视频在线观看| av一区二区三| 国产成人aaa| 成人综合色站| 亚洲精品一区二区三区四区| 国产精品资源在线| 91亚洲精品久久久| 国产欧美久久久| 久久99精品国产.久久久久久| 国产精品热视频| 中文字幕丰满人伦在线| 蜜桃一区二区三区在线| 国产精品久久久久久久久免费看| 天天爱天天做天天爽| 老司机精品久久| 国产精品视频免费观看www| 蜜臀99久久精品久久久久小说| 可以看av的网站久久看| 国产成人在线视频| 波多野结衣视频免费观看| 日韩激情视频在线观看| 国产精品久久9| 在线免费观看高清视频| 国产专区综合网| www.一区二区三区| 欧美 日韩 人妻 高清 中文| 95精品视频在线| 日韩av一区二区三区在线观看| jizz在线观看| 亚洲视频香蕉人妖| 波多野结衣av一区二区全免费观看| 国产传媒在线| 色综合av在线| 性生活免费在线观看| 欧美成年网站| 亚洲精品久久久久国产| 国产人妻大战黑人20p| 99久久激情| 欧美极品少妇与黑人| 国产做受高潮漫动| 日本不卡视频在线观看| 91麻豆国产精品| 日本黄色不卡视频| 欧美国产1区2区| 国产911在线观看| 久久男人天堂| 在线播放日韩导航| 第四色在线视频| 不卡在线一区二区| 欧美精品一区在线播放| 免费看日批视频| 精品一二三四在线| 久久久综合亚洲91久久98| 欧美精品hd| 一区二区三区在线高清| 久久无码高潮喷水| 国产精品一级在线观看| 亚洲国产精品久久91精品| 免费一级特黄3大片视频| 欧美日韩亚洲一区| 日本老师69xxx| jizz国产视频| 国产女人18毛片水真多成人如厕| 999一区二区三区| 日日夜夜亚洲| 亚洲欧美国产视频| 午夜激情福利网| 美女91精品| 国产精选在线观看91| 中文日本在线观看| 欧美视频二区36p| 巨乳女教师的诱惑| 日韩欧美伦理| 欧美中文字幕视频| 国产91免费看| 亚洲人亚洲人成电影网站色| 九色porny91| 日本午夜精品| 久久久久这里只有精品| 国产普通话bbwbbwbbw| 国产色综合一区| 国产亚洲综合视频| 美女一区二区在线观看| 久久99国产精品自在自在app| 亚洲图片欧美在线| 国产亚洲污的网站| 成人三级视频在线播放| 欧美成人一区在线观看| 欧美夫妻性视频| 国产日韩在线观看一区| 国产精品久久久久久久久免费丝袜| 黄色免费福利视频| 黄色美女久久久| 久久久最新网址| 亚洲爱情岛论坛永久| 亚洲欧美日韩电影| 久久精品久久99| 99久久久久国产精品| 国产精品jvid在线观看蜜臀| 免费在线性爱视频| 亚洲3atv精品一区二区三区| 91精品又粗又猛又爽| 欧美日韩国产探花| www.成人av.com| 波多野结衣在线播放| 欧美第一区第二区| 久久久久国产精品夜夜夜夜夜| 国产精品自产自拍| 国产玉足脚交久久欧美| 老司机aⅴ在线精品导航 | 人妻精品久久久久中文字幕69| 久久高清精品| 96pao国产成视频永久免费| 嫩草在线视频| 日韩精品影音先锋| 久久久一二三区| 99久久国产综合精品色伊| 久久久久久久中文| 国产探花一区在线观看| 国产精品美乳一区二区免费 | 欧美国产日本高清在线| 国产91免费在线观看| 亚洲va欧美va人人爽| 少妇特黄一区二区三区| 日本欧美久久久久免费播放网| 色综合影院在线观看| 久久婷婷五月综合色丁香| 久久久国产在线视频| 亚洲h视频在线观看| 精品久久久久久国产91| 国产一级久久久久毛片精品| 久久99精品国产.久久久久久| 麻豆映画在线观看| 另类尿喷潮videofree| 国产99视频精品免视看7| 免费日本一区二区三区视频| 精品国一区二区三区| youjizz在线视频| 国产精品福利一区| 韩国av中国字幕| 久久精品日产第一区二区| 一区二区三区四区视频在线| 国产精品流白浆在线观看| 国产精品成人v| 91在线中文| 国产网站欧美日韩免费精品在线观看| 亚洲一区二区三区高清视频| 亚洲一区二区美女| 日韩人妻无码精品综合区| 国内精品伊人久久久久影院对白| 欧美一区二区中文字幕| 色135综合网| 久久久久久久久久久久久久一区| 日韩三级一区| 欧美做受高潮1| 羞羞电影在线观看www| 亚洲性夜色噜噜噜7777| www.国产三级| 欧美色视频在线| 国产精品111| 最新国产精品久久精品| 97超碰在线资源| 国产91丝袜在线播放| 91看片在线免费观看| 一本色道久久综合一区| 99久re热视频精品98| 亚州国产精品| 成人黄视频免费| 四虎国产精品免费久久| 欧美壮男野外gaytube| 女人黄色免费在线观看| 日韩在线免费高清视频| 你懂的视频在线| 欧美精品一区二区三区久久久| 国产精品伦理一区| 欧美综合在线视频| 久久青青草原亚洲av无码麻豆| 亚洲一区二区不卡免费| 国产精品三区在线观看| 国产精品福利一区二区三区| 91成人在线免费视频| 91免费视频网址| japanese在线观看| 国产99久久久国产精品潘金| 欧美大片久久久| 蜜桃av噜噜一区| 色哟哟精品视频| 乱码第一页成人| 情侣黄网站免费看| 国产一区成人| 成人在线免费在线观看| 一区二区三区四区五区在线| 无码 制服 丝袜 国产 另类| 欧美日本一区二区高清播放视频| 日本在线视频www色| 久久精品久久久| 一道精品一区二区三区| 日韩欧美一区免费| 影音先锋欧美在线| 日本不卡高清| 色中文字幕在线观看| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 久久99热99| 国产精品自在自线| 精品在线观看视频| 一区二区三区国产好的精华液| 精品一区二区三区不卡 | 成人av免费在线| 88av在线播放| 99国产精品久久久| 女同毛片一区二区三区| 国产婷婷色一区二区三区四区| 久久精品国产亚洲av久| 国产蜜臀av在线一区二区三区 | 自拍偷拍国产精品| 黑鬼狂亚洲人videos| 亚洲三级电影全部在线观看高清| 1024手机在线视频| 亚洲综合在线五月| 日本中文字幕网| 色综合色综合色综合色综合色综合 | 97在线精品| 国产树林野战在线播放| 亚洲网站啪啪| 午夜视频在线瓜伦| 精品伊人久久久久7777人| 亚洲一级片免费观看| 成人h动漫精品一区二| 少妇精品一区二区三区| 欧美激情资源网| www日韩在线| 亚洲高清中文字幕| 日韩精品一区不卡| 欧美高清激情brazzers| 六月丁香综合网| 在线观看成人黄色| av激情在线| 欧洲亚洲免费在线| 国产精品igao视频网网址不卡日韩| 国产激情美女久久久久久吹潮| 久9久9色综合| 美女在线免费视频| 性欧美暴力猛交另类hd| 91看片破解版| 91免费版在线| 国产人妻精品一区二区三区不卡| 精品久久久久久久中文字幕| 在线免费观看一区二区| 亚洲精品99久久久久| 国产丝袜在线| 日韩av电影手机在线| 日韩激情欧美| 日韩欧美视频第二区| 国模 一区 二区 三区| 国产又黄又猛又粗又爽的视频| 国产v综合v亚洲欧| 五月婷婷婷婷婷| 亚洲电影一区二区| 97超视频在线观看| 日韩理论片久久| 性欧美高清come| 国产精品永久免费| 亚洲精华一区二区三区| 欧美美女黄色网| 美腿丝袜在线亚洲一区| 中文文字幕文字幕高清| 亚洲欧美福利一区二区| 一区二区三区麻豆| 日韩电影在线观看中文字幕| 成人在线免费看片| 国产精品黄色av| 全球av集中精品导航福利| 99热都是精品| 麻豆91在线看| av网在线播放| 精品欧美激情精品一区| 亚洲大尺度网站| 久久天堂av综合合色| 欧美影视资讯| 欧美日韩最好看的视频| 亚洲精品少妇| 97中文字幕在线观看| 亚洲欧美一区二区三区孕妇| 在线播放精品视频| 在线国产精品视频| 国产韩日精品| 日韩视频在线播放| 美女91精品| 制服 丝袜 综合 日韩 欧美| 午夜久久久影院| 亚洲第一视频在线| 欧美成人精品不卡视频在线观看| 亚洲精品成a人ⅴ香蕉片| 亚洲国产精品综合| 日韩av中文字幕一区二区三区| 超碰97人人干| 欧美性生交xxxxxdddd| 亚洲AV第二区国产精品| 亚洲3p在线观看| 美国十次av导航亚洲入口| 日本十八禁视频无遮挡| 91社区在线播放| 九九热在线免费观看| 日韩高清免费观看| 伊人久久综合一区二区| 欧美理论一区二区| 玖玖精品视频| 久久精品色妇熟妇丰满人妻| 欧美另类z0zxhd电影| 免费看a在线观看| 3d动漫啪啪精品一区二区免费 | 一区二区三区免费在线视频| xxxxx成人.com| 日韩欧美激情电影| 欧美又粗又长又爽做受| 91影院在线免费观看| 日本熟女毛茸茸| 日韩在线不卡视频| 天堂久久一区| 免费网站在线观看视频 | 少妇太紧太爽又黄又硬又爽小说| 欧美蜜桃一区二区三区| 性xxxxfjsxxxxx欧美| 好看的日韩精品| 日日夜夜免费精品视频| 精品国产大片大片大片| 日韩欧美精品在线视频| 国产高清自产拍av在线| 日韩久久不卡| 国产精品自拍三区| 99热只有这里有精品| 中文欧美日本在线资源| 精品入口麻豆88视频| 欧美一级片免费播放| 国产午夜精品一区二区| 国产探花精品一区二区| 78m国产成人精品视频| 欧美精选视频在线观看| 亚洲女人在线观看| 欧美天堂在线观看| 欧美性猛交xxx乱大交3蜜桃| 成人免费视频观看视频| 视频精品一区二区| 永久看片925tv| 亚洲欧美综合区自拍另类| aa亚洲一区一区三区| 内射国产内射夫妻免费频道| 亚洲欧洲一区二区在线播放| 瑟瑟在线观看| 3d动漫精品啪啪一区二区三区免费| 亚洲一区日韩在线|