色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在鴻蒙中如何實現一屏多頁

OpenHarmony技術社區 ? 來源:鴻蒙技術社區 ? 作者:開鴻HOS小鴻 ? 2021-09-28 09:46 ? 次閱讀

眾所周知,PageSlider 是用于頁面之間切換的組件,它通過響應滑動事件完成頁面間的切換,而 PageFlipper 可能知道的人就比較少了。

其實 PageFlipper 和 PageSlider 類似,都是視圖切換組件,它們都繼承自 StackLayout,因此可以將多個 component 層疊在一起,每次只顯示一個組件。

當視圖從一個 component 切換到另一個 component 時,PageFlipper 支持指定動畫效果。

區別:

PageFlipper 通過 addComponent() 添加 component,可使用動畫控制多個 component 之間的切換效果,是個輕量級的組件,適合展示少量靜態數據。

而 PageSlide 是由 provider 來提供 component 的,更適用復雜的視圖切換,實現數據的動態加載。

下面是一個 PageSlider 和 PageFlipper 結合起來的使用效果,頁面中間的卡片使用的是 PageSlider,背景圖片和底部的數字指示器用的是 PageFlipper。

PageSlider

PageSlider 可以說是鴻蒙中最常用的視圖切換組件了,使用方法不用多做介紹,官方文檔有詳細的說明,這里主要說一下一個特殊的效果。

①一屏多頁效果

其實鴻蒙本身有提供一個 setClipEnabled() 的方法,作用是設置是否允許在組件超出其父布局時自動裁剪組件。

理論上通過給 pageSlider 父布局設置 setClipEnabled(false),加上給子組件設置合適的寬度可以實現一屏多頁效果,但是經過測試并沒達到效果。

這個方法我也單獨拿出來在其他場景驗證過確實無效,下面是驗證的效果。

但是鴻蒙卻提供了另外一個方法 setPageMargin(),它的作用是設置 PageSlider 中子組件邊距的,當傳入一個合適的負數時(必須是負數),就能實現一屏同時顯示多個子組件的效果:

②動態設置縮放透明度變化

設置透明度和縮放比例就不細說了,主要就是在 PageSlider 子組件加載完成后和頁面切換中的回調方法中改變 alpha 值和 scale 值。

直接上代碼:

public final class AlphaScalePageTransformer {

/**

* 縮放

*/

public static final float INACTIVE_SCALE = 0.8f;

/**

* 透明度

*/

public static final float INACTIVE_ALPHA = 0.5f;

/**

* 設置初始狀態的縮放和透明度

*

* @param child

* @param position

* @param current

*/

public static void defaultPage(ListContainer child, int position, float current) {

if (position != current) {

child.setAlpha(INACTIVE_ALPHA);

child.setScaleX(INACTIVE_SCALE);

child.setScaleY(INACTIVE_SCALE);

}

}

/**

* 設置滑動中的縮放和透明度

*

* @param childList

* @param position

* @param offset

* @param direction

*/

public static void transformPage(List《ListContainer》 childList, int position, float offset, float direction) {

Component child = childList.get(position);

float scale = INACTIVE_SCALE + (1 - INACTIVE_SCALE) * (1 - Math.abs(offset));

float alpha = INACTIVE_ALPHA + (1 - INACTIVE_ALPHA) * (1 - Math.abs(offset));

child.setScaleX(scale);

child.setScaleY(scale);

child.setAlpha(alpha);

if (direction 》 0) {

if (position 《 childList.size() - 1) {

child = childList.get(position + 1);

}

} else {

if (position 》= 1) {

child = childList.get(position - 1);

}

}

scale = INACTIVE_SCALE + (1 - INACTIVE_SCALE) * Math.abs(offset);

alpha = INACTIVE_ALPHA + (1 - INACTIVE_ALPHA) * Math.abs(offset);

child.setScaleX(scale);

child.setScaleY(scale);

child.setAlpha(alpha);

}

}

設置兩邊的 component 透明度和縮放效果:

//設置初始狀態縮放和透明度

AlphaScalePageTransformer.defaultPage(image, i, pageSlider.getCurrentPage());

//設置頁面切換中縮放和透明度

pageSlider.addPageChangedListener(new PageChangedListener() {

@Override

public void onPageSliding(int position, float positionOffset, int positionOffsetPixels) {

AlphaScalePageTransformer.transformPage(listContainers, position,

positionOffset, positionOffsetPixels);

}

});

PageFlipper(翻頁器)

PageFlipper 是一個翻頁器,當它有兩個或多個子組件時,切換過程中可以輕松設置入場動畫和出場動畫,以達到意想不到的效果。

雖然 PageFlipper 的使用率遠不及 PageSlider,但這并不意味著 PageFlipper 就不強大。

他能通過簡單的代碼實現許多動畫效果,比如淘寶頭條的效果,日歷翻頁效果,背景圖淡入淡出效果等等。

常用方法:

getCurrentComponent()//獲取當前組件

showNext():顯示下一個組件(如果當前子組件是最后一個,則顯示第一個子組件)

showPrevious():顯示上一個組件(如果當前子組件是第一個,則顯示最后一個子組件)

getFlipInterval() :獲取自動翻轉時間

setFlipPeriod(int period) :設置翻轉周期

startFlipping() :開啟自動翻轉

stopFlipping() :停止自動翻轉

addComponent() :添加組件

setIncomingAnimationA() :設置轉入動畫

setOutgoingAnimation() :設置轉出動畫

下面通過設置文字翻頁效果來了解下它的使用方法:

代碼如下:

public class IndicatorComponent extends DirectionalLayout {

/**

* 文字大小

*/

private static final int TEXT_SIZE = 130;

/**

* 動畫時長

*/

private static final int DURATION = 600;

private PageFlipper textSwitcher;

private Text textcomponent;

/**

* ItemsCountcomponent

*

* @param context

* @param attrSet

*/

public IndicatorComponent(Context context, AttrSet attrSet) {

super(context, attrSet);

init(context);

}

private void init(Context context) {

setOrientation(ComponentContainer.HORIZONTAL);

textSwitcher = new PageFlipper(context);

//理論上PageFlipper只需要添加兩個子component就能實現動畫效果,但是實際測試發現如果切換速度太快就導致子組件銜接不上出現組件消失的額情況,

//因此這里通過實踐多添加了幾個子component,防止滑動過快出現bug

textSwitcher.addComponent(createcomponentForTextSwitcher(context));

textSwitcher.addComponent(createcomponentForTextSwitcher(context));

textSwitcher.addComponent(createcomponentForTextSwitcher(context));

textSwitcher.addComponent(createcomponentForTextSwitcher(context));

addComponent(textSwitcher, new LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT,

ComponentContainer.LayoutConfig.MATCH_CONTENT));

textcomponent = new Text(context);

textcomponent.setTextSize(TEXT_SIZE);

textcomponent.setFont(Font.DEFAULT_BOLD);

textcomponent.setTextColor(new Color(Color.getIntColor(“#8cffffff”)));

addComponent(textcomponent, new LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT,

ComponentContainer.LayoutConfig.MATCH_CONTENT));

}

/**

* 創建組件

*

* @param context 上下文

* @return text

*/

private Text createcomponentForTextSwitcher(Context context) {

Text text = new Text(context);

text.setTextSize(TEXT_SIZE);

text.setFont(Font.DEFAULT_BOLD);

text.setTextColor(Color.WHITE);

text.setLayoutConfig(new PageFlipper.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT,

PageFlipper.LayoutConfig.MATCH_CONTENT));

return text;

}

/**

* update

*

* @param newPosition 新位置

* @param oldPosition 舊位置

* @param totalElements 總數

*/

public void update(int newPosition, int oldPosition, int totalElements) {

textcomponent.setText(“ / ” + totalElements);

int offset = textSwitcher.getHeight();

if (newPosition 》 oldPosition) {

//設置組件進入和退出的動畫

textSwitcher.setIncomingAnimation(createPositionAnimation(-offset, 0, 0f, 1f, DURATION));

textSwitcher.setOutgoingAnimation(createPositionAnimation(0, offset, 1f, 0f, DURATION));

} else if (oldPosition 》 newPosition) {

textSwitcher.setIncomingAnimation(createPositionAnimation(offset, 0, 0f, 1f, DURATION));

textSwitcher.setOutgoingAnimation(createPositionAnimation(0, -offset, 1f, 0f, DURATION));

}

//顯示下一個組件并執行動畫

textSwitcher.showNext();

Text text = (Text) textSwitcher.getCurrentComponent();

text.setText(String.valueOf(newPosition + 1));

}

/**

* 創建屬性動畫

*

* @param fromY

* @param toY

* @param fromAlpha

* @param toAlpha

* @param duration

* @return

*/

private AnimatorProperty createPositionAnimation(int fromY, int toY, float fromAlpha, float toAlpha, int duration) {

AnimatorProperty animatorProperty = new AnimatorProperty();

animatorProperty.setCurveType(Animator.CurveType.DECELERATE);

animatorProperty.alphaFrom(fromAlpha);

animatorProperty.alpha(toAlpha);

animatorProperty.moveFromY(fromY);

animatorProperty.moveToY(toY);

animatorProperty.setDuration(duration);

return animatorProperty;

}

}

結束

以上主要介紹了 PageSlider 和 PageFlipper 的一些簡單使用,最后補充一個小功能,設置漸變效果,這個簡單的效果可能很多人還不知道如何設置。

首先生成一個 foreground_gradient.xml:

《shape

xmlns:ohos=“http://schemas.huawei.com/res/ohos”

ohos:shape=“rectangle”》

//設置填充的顏色,可以根據實際需要設置多個

《solid

ohos:colors=“#000000,#00ffffff,#d8000000”/》

//設置漸變方向,有三個值可供選擇:linear_gradient,radial_gradient,sweep_gradient

《gradient

ohos:shader_type=“linear_gradient”

/》《/shape》

然后給目標組件設置前景色即可:

ohos:foreground_element=“$graphic:foreground_gradient”

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2634

    瀏覽量

    66308
  • HarmonyOS
    +關注

    關注

    79

    文章

    1974

    瀏覽量

    30148

原文標題:在鴻蒙上實現一屏多頁效果!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ShiMeta鴻蒙同步拼接解決方案

    ???方案概述鴻蒙同步解決方案ShiMeta鴻蒙數字標牌系統的基礎上,通過信號處理器,實現
    的頭像 發表于 12-13 16:45 ?103次閱讀
    ShiMeta<b class='flag-5'>鴻蒙</b><b class='flag-5'>多</b><b class='flag-5'>屏</b>同步拼接解決方案

    玩轉RK3588開發板基于connector-split 功能實現聯動

    玩轉RK3588開發板基于connector-split 功能實現聯動
    的頭像 發表于 12-02 16:05 ?276次閱讀
    玩轉RK3588開發板基于connector-split 功能<b class='flag-5'>實現</b><b class='flag-5'>多</b><b class='flag-5'>屏</b>聯動

    鴻蒙原生開發手記:01-元服務開發

    同樣的使用方法。 服務卡片 元服務可以添加服務卡片,詳細介紹見《鴻蒙原生開發手記:02-服務卡片開發》 開發測試 DevEco 點擊運行,設備上可以從負一屏上方的“搜索”按鈕,點擊進入我的元服務
    發表于 11-14 17:28

    鴻蒙北斗防爆手機巡檢作業的表現

    鴻蒙北斗防爆手機以其卓越的高精度定位、智能互聯及強大的防爆性能,巡檢作業顯著提升了工作效率與安全性,成為現代工業巡檢不可或缺的智能設備。頂堅北斗防爆巡檢終端頂堅鴻蒙北斗防爆手機
    的頭像 發表于 11-11 11:32 ?191次閱讀
    <b class='flag-5'>鴻蒙</b>北斗防爆手機<b class='flag-5'>在</b>巡檢作業<b class='flag-5'>中</b>的表現

    設計院eplan 500項目圖紙

    設計院eplan 500項目圖紙
    發表于 10-28 10:49 ?16次下載

    鴻蒙生態設備超10億!原生鴻蒙發布,國產操作系統實現自主可控

    10月22日晚間,原生鴻蒙之夜暨華為全場景新品發布會正式召開,華為常務董事、終端BG董事長、智能汽車解決方案BU董事長余承東宣布,搭載鴻蒙操作系統,包括Open Harmony的生態設備超過10億。我們實現了同
    的頭像 發表于 10-23 12:04 ?1695次閱讀
    <b class='flag-5'>鴻蒙</b>生態設備超10億!原生<b class='flag-5'>鴻蒙</b>發布,國產操作系統<b class='flag-5'>實現</b>自主可控

    鴻蒙跨端實踐-JS虛擬機架構實現

    類似的框架,我們需要自行實現以確保核心基礎能力的完整。 鴻蒙虛擬機的開發經歷了從最初 ArkTs2V8 到 JSVM + Roma新架構方案 。在此過程,我們實現了完整的
    的頭像 發表于 09-30 14:42 ?2406次閱讀
    <b class='flag-5'>鴻蒙</b>跨端實踐-JS虛擬機架構<b class='flag-5'>實現</b>

    元服務體驗-服務使用

    服務使用 使用流程:通過元服務入口打開元服務→啟動加載→元服務落地使用→退出元服務。 服務狀態:服務狀態可以系統多個地方實時顯示和更新,包括鎖、實況窗、負
    發表于 07-12 15:57

    一屏萬象,場景無限: 藍牙墨水標簽多功能場景應用帶您領略未來

    藍牙墨水標簽作為種創新的顯示設備,通過提供API接口,助力各行各業共創智慧新生態。開放API是為了促進生態系統的共創和共贏,讓更多的開發者和合作伙伴能夠參與到藍牙墨水標簽的應用和創新
    的頭像 發表于 05-27 11:11 ?437次閱讀
    <b class='flag-5'>一屏</b>萬象,場景無限: 藍牙墨水<b class='flag-5'>屏</b>標簽多功能<b class='flag-5'>多</b>場景應用帶您領略未來

    鴻蒙OS開發學習:【尺寸適配實現

    鴻蒙開發,尺寸適配是個重要的概念,它可以幫助我們不同屏幕尺寸的設備上正確顯示和布局我們的應用程序。本文將介紹如何在
    的頭像 發表于 04-10 16:05 ?1735次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發學習:【尺寸適配<b class='flag-5'>實現</b>】

    深圳市24年,實現鴻蒙原生應用數占全國總量10%以上

    )學習手冊(共計1236)與鴻蒙(OpenHarmony )開發入門教學視頻,幫助大家技術的道路上更進步。 如需要,可在上方指定前往。也可在主頁找我保存。 總結
    發表于 03-04 21:42

    鴻蒙實戰項目開發:【短信服務】

    文檔》 針對鴻蒙成長路線打造的鴻蒙學習文檔 。話不多說,我們直接看詳細資料 鴻蒙(OpenHarmony )學習手冊(共計1236)與鴻蒙
    發表于 03-03 21:29

    鴻蒙ArkUI開發-實現增刪Tab

    本文以瀏覽器增加或刪除簽為例,實現Tabs簽的增刪功能。
    的頭像 發表于 01-29 18:43 ?1579次閱讀
    <b class='flag-5'>鴻蒙</b>ArkUI開發-<b class='flag-5'>實現</b>增刪Tab<b class='flag-5'>頁</b>簽

    鴻蒙千帆起】《開心消消樂》完成鴻蒙原生應用開發,創新多端聯動用戶體驗

    技術還為用戶打造出創新的分布式游戲玩法。通過與 HarmonyOS 分布式有機結合,可實現設備協同的分布式 PK 場景。在此場景下,用戶操作各自的 HarmonyOS 設備,使用智慧實時顯示對戰
    發表于 01-03 10:22

    鴻蒙千帆起】《鋼嵐》成為首款基于HarmonyOS NEXT開發的戰棋新游

    通過元服務一屏或桌面呈現,為玩家帶來更便捷的游戲體驗;另方面保證用戶安全與隱私的前提下,AI 大模型可以識別用戶意圖,實現服務精準投
    發表于 12-28 10:24
    主站蜘蛛池模板: 国产日韩欧美有码在线视频| 樱桃视频高清免费观看在线播放| 欧美日韩精品一区二区三区四区 | WWW久久只有这里有精品| 永久adc视频年龄确认| 午夜熟女插插XX免费视频| 三级全黄的视频在线观看| 求个av网站| 泡妞高手在都市免费观看| 欧美男男网站免费观看videos| 免费精品一区二区三区在线观看| 狂野猛交xxxx吃奶| 蜜桃99影院| 免费果冻传媒2021视频| 男男h开荤粗肉h文1v1| 年轻的老师5理伦片| 欧美性暴力变态xxxx| 欧美亚洲另类图片| 日本精品久久久久中文字幕| 日久精品不卡一区二区| 色丁香婷婷综合缴情综| 桃花在线观看播放| 午夜免费福利小电影| 香蕉eeww99国产精品| 亚洲天堂久久久| 又爽又黄又粗又大免费视频| 坠落的丝袜美人妻| 99久久免热在线观看| 达达兔欧美午夜国产亚洲| 囯产免费精品一品二区三区视频| 国产精品永久免费| 精品久久久久久久久免费影院| 久久亚洲国产成人影院| 免费在线观看a视频| 青青草干免费线观看| 忘忧草在线社区WWW日本直播 | 久久内在线视频精品mp4| 免费成人高清在线视频| 强奸美女老师| 胸大美女又黄的网站| 在线观看视频亚洲|