国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

這篇具有很好參考價(jià)值的文章主要介紹了Android Jetpack Compose實(shí)現(xiàn)輪播圖效果。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

在最近思索如何使用Compose方式改進(jìn)我的開(kāi)源TMDB電影列表應(yīng)用程序的主屏幕時(shí),一個(gè)激動(dòng)人心的概念浮現(xiàn)在我的腦海中——為什么不整合一個(gè)吸引人的輪播圖來(lái)展示即將上映的電影呢?在本文中,我將分享我的開(kāi)發(fā)和實(shí)現(xiàn)自定義輪播圖的經(jīng)歷,提供涉及不同步驟的見(jiàn)解。

首先,我搜索了現(xiàn)有的解決方案,考慮到Material Design 3文檔中有一個(gè)輪播圖組件的可用性。然而,我很快發(fā)現(xiàn)它尚未發(fā)布用于Jetpack Compose,而且僅在最新的MDC-Android(視圖系統(tǒng))Alpha版本中可訪問(wèn)。這迫使我決定開(kāi)發(fā)自己的輪播圖,利用HorizontalPager,這是一個(gè)Compose組件,允許水平滾動(dòng)和頁(yè)面變換。

為了有效地解決開(kāi)發(fā)過(guò)程,我將問(wèn)題分為四個(gè)不同的部分:

  1. HorizontalPager轉(zhuǎn)換為實(shí)現(xiàn)所需的旋轉(zhuǎn)木馬效果。
  2. 加入指示器顯示當(dāng)前可見(jiàn)頁(yè)面。
  3. HorizontalPager頁(yè)面實(shí)現(xiàn)自動(dòng)滾動(dòng)。
  4. 利用動(dòng)畫(huà)增強(qiáng)即將出現(xiàn)的頁(yè)面的外觀,同時(shí)聚焦當(dāng)前顯示的頁(yè)面并淡化其他頁(yè)面。
    讓我們逐個(gè)詳細(xì)討論這些部分。

將HorizontalPager轉(zhuǎn)換為實(shí)現(xiàn)所需的旋轉(zhuǎn)木馬效果

為了創(chuàng)建所需的旋轉(zhuǎn)木馬效果,我們必須首先自定義HorizontalPager以部分顯示前一個(gè)和后一個(gè)頁(yè)面。
為此,HorizontalPager提供了兩個(gè)參數(shù):

  1. contentPadding:允許我們從每個(gè)軸應(yīng)用邊距,創(chuàng)建所需的頁(yè)面周圍間距。
  2. pageSpacing:在兩個(gè)相鄰頁(yè)面之間引入間隙,確保視覺(jué)上吸引人的布局。

Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

HorizontalPager(
    contentPadding = PaddingValues(horizontal = 32.dp),
    pageSpacing = 16.dp
) { page ->
    ...
    CarouselItem(item)
}

將指示器合并到頁(yè)面中以顯示當(dāng)前可見(jiàn)頁(yè)面

這個(gè)任務(wù)很容易完成。我只需要將HorizontalPager置于Box布局中,并將DotIndicators合成到Box底部對(duì)齊即可。

Box {
    HorizontalPager(pageCount = pageCount, state = pagerState) { page ->
        CarouselItem(itemList[page])
    }

    DotIndicators(
        pageCount = pageCount,
        pagerState = pagerState,
        modifier = Modifier.align(Alignment.BottomCenter)
    )
}

我們創(chuàng)建了一個(gè)名為DotIndicators的可組合組件。它需要兩個(gè)參數(shù):頁(yè)數(shù)(pageCount)和頁(yè)面狀態(tài)(pageState)。我們使用頁(yè)數(shù)(pageCount)添加相同數(shù)量的指示器,而使用頁(yè)面狀態(tài)(pageState)使選定的點(diǎn)顯示更暗。內(nèi)部實(shí)現(xiàn)如下:

@Composable
fun DotIndicators(
    ...,
    modifier: Modifier
) {
    Row(modifier = modifier) {
        repeat(pageCount) { iteration ->
            val color = if (pagerState.currentPage == iteration) selectedColor else unselectedColor
            Box(
                modifier = Modifier
                    .clip(CircleShape)
                    .background(color)
            )
        }
    }
}

上面指示器效果如下:
Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

為HorizontalPager頁(yè)面實(shí)現(xiàn)自動(dòng)滾動(dòng)

目前,我們的設(shè)置要求用戶手動(dòng)水平滑動(dòng)以導(dǎo)航到下一頁(yè)。為了增強(qiáng)用戶體驗(yàn),我們可以實(shí)現(xiàn)自動(dòng)滾動(dòng)。我們通過(guò)利用HorizontalPager提供的Coroutine、LaunchedEffect和PagerState來(lái)實(shí)現(xiàn)這一點(diǎn)。
以下是一個(gè)完全具備功能的示例實(shí)現(xiàn):

@Composable
fun AwesomeCarousel(
    pageCount: Int = 10,
    pagerState: PagerState = rememberPagerState(),
    autoScrollDuration: Long = 3000L
) {
    val isDragged by pagerState.interactionSource.collectIsDraggedAsState()
    if (isDragged.not()) {
        with(pagerState) {
            var currentPageKey by remember { mutableStateOf(0) }
            LaunchedEffect(key1 = currentPageKey) {
                launch {
                    delay(timeMillis = autoScrollDuration)
                    val nextPage = (currentPage + 1).mod(pageCount)
                    animateScrollToPage(page = nextPage)
                    currentPageKey = nextPage
                }
            }
        }
    }

    HorizontalPager(pageCount = pageCount, state = pagerState) { page ->
        CarouselItem(itemList[page])
    }
}

代碼片段中的主要要點(diǎn)是:

  1. LaunchedEffectLaunchedEffect 是 Jetpack Compose 提供的一種特殊效果,允許我們?cè)趨f(xié)程中執(zhí)行副作用,當(dāng)特定鍵值發(fā)生改變時(shí)觸發(fā)。在這種情況下,key1 參數(shù)設(shè)置為 currentPageKey,這意味著只要 currentPageKey 的值發(fā)生更改,該效果就會(huì)被觸發(fā)。在LaunchedEffect塊內(nèi),我們使用 launch 函數(shù)啟動(dòng)一個(gè)新的協(xié)程。這個(gè)協(xié)程在合成過(guò)程中異步執(zhí)行并且獨(dú)立于合成進(jìn)程。

  2. delay(timeMillis = autoScrollDuration):這一行引入了一個(gè)延遲,協(xié)程會(huì)在 autoScrollDuration 變量指定的持續(xù)時(shí)間內(nèi)暫停,然后繼續(xù)執(zhí)行下一行代碼。在暫停后,我們?cè)俅胃逆I,這導(dǎo)致協(xié)程重新啟動(dòng),因此這意味著 LaunchedEffect 內(nèi)部的塊將無(wú)限次地執(zhí)行。

  3. isDragged.not():此代碼段確保僅在不拖動(dòng)頁(yè)面時(shí)執(zhí)行后續(xù)操作。它控制自動(dòng)滾動(dòng)行為,避免了用戶交互和自動(dòng)滾動(dòng)過(guò)程之間的沖突。例如,如果用戶正在滑動(dòng)頁(yè)面,自動(dòng)滾動(dòng)將停止。

利用動(dòng)畫(huà)增強(qiáng)頁(yè)面外觀

實(shí)現(xiàn)的最后一部分著重于增強(qiáng)輪播頁(yè)面的視覺(jué)過(guò)渡效果。通過(guò)利用graphicLayer修飾器,我們可以實(shí)現(xiàn)平滑無(wú)縫的過(guò)渡效果。關(guān)鍵動(dòng)畫(huà)包括在淡出舊項(xiàng)的同時(shí)淡入新項(xiàng),以及在項(xiàng)接近或遠(yuǎn)離中心時(shí)進(jìn)行縮放。

以下代碼計(jì)算當(dāng)前頁(yè)面和目標(biāo)頁(yè)面之間的偏移量,然后使用此偏移量在0.7和1之間插值出一個(gè)轉(zhuǎn)換值。然后將此轉(zhuǎn)換值應(yīng)用于graphicLayeralphascaleY屬性。

fun Modifier.carouselTransition(page: Int, pagerState: PagerState) =
    graphicsLayer {
        val pageOffset =
            ((pagerState.currentPage - page) + pagerState.currentPageOffsetFraction).absoluteValue

        val transformation =
            lerp(
                start = 0.7f,
                stop = 1f,
                fraction = 1f - pageOffset.coerceIn(0f, 1f)
            )
        alpha = transformation
        scaleY = transformation
    }
  1. 我們計(jì)算了在頁(yè)面分頁(yè)器中當(dāng)前頁(yè)面和目標(biāo)頁(yè)面之間的偏移量。它考慮了整個(gè)頁(yè)面差異(pagerState.currentPage-page)和分?jǐn)?shù)(pagerState.currentPageOffsetFraction),后者表示在頁(yè)面之間轉(zhuǎn)換的進(jìn)度。絕對(duì)值確保偏移量始終為正數(shù)。
  2. lerp函數(shù)用于基于分?jǐn)?shù)在起始點(diǎn)和結(jié)束點(diǎn)之間插值計(jì)算一個(gè)值。在這種情況下,起始值為0.7f,停止值為1f,而分?jǐn)?shù)則被計(jì)算為1f - pageOffset.coerceIn(0f, 1f)。coerceIn函數(shù)可以確保分?jǐn)?shù)保持在0到1的范圍內(nèi)。
  3. alpha = transformationtransformation的值分配給了graphicLayeralpha屬性。將alpha設(shè)置為介于0和1之間的值可以確定圖層的透明度。值為1表示圖層完全不透明,而值為0表示它完全透明。
  4. scaleY = transformation同樣,這行將transformation的值分配給了graphicLayerscaleY屬性。調(diào)整scaleY屬性會(huì)垂直縮放圖層。值為1表示圖層的原始大小,而小于1的值會(huì)減少垂直比例,大于1的值會(huì)增加垂直比例。
    我們?cè)?code>HorizontalPager的item modifier上利用graphicLayer擴(kuò)展函數(shù)。這使我們可以對(duì)每個(gè)旋轉(zhuǎn)木馬項(xiàng)目應(yīng)用變換并創(chuàng)建效果。
HorizontalPager() { page ->
    val page = list[page]
    CarouselItem(
        item = page,
        modifier = Modifier.carouselTransition(page, pagerState)
    )
}

Android Jetpack Compose實(shí)現(xiàn)輪播圖效果

github地址

https://github.com/TheSomeshKumar/Flixplorer文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-475314.html

到了這里,關(guān)于Android Jetpack Compose實(shí)現(xiàn)輪播圖效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • uni-app小程序折疊3D輪播圖效果實(shí)現(xiàn)。

    uni-app小程序折疊3D輪播圖效果實(shí)現(xiàn)。

    先來(lái)看效果圖 實(shí)現(xiàn)原理: 通過(guò)小程序的觸摸事件,來(lái)控制圖片數(shù)組的變化實(shí)現(xiàn)動(dòng)態(tài)樣式;來(lái)改變圖片的樣式。 貼上輪播組件完整代碼 組件使用 如果有自動(dòng)輪播的需求,可以改造下組件加個(gè)定時(shí)器處理數(shù)組就OK了。

    2024年02月11日
    瀏覽(25)
  • vue 實(shí)現(xiàn)釘釘官網(wǎng)的輪播圖下面功能滾動(dòng)排版CSS效果

    前言 最近在寫(xiě)PC端的業(yè)主端時(shí)候,發(fā)現(xiàn)傳統(tǒng)的菜單欄比較丑,也不符合實(shí)際應(yīng)用(功能頁(yè)面并不多-展示為主) 偶然發(fā)現(xiàn)釘釘官網(wǎng)的效果挺有意思的,想著把這個(gè)效果復(fù)原過(guò)來(lái),然后夸夸搜索了一番。 經(jīng)過(guò)一頓的cv打法,加上修修補(bǔ)補(bǔ)把大概的效果整了出來(lái),時(shí)間關(guān)系最基礎(chǔ)

    2024年02月11日
    瀏覽(100)
  • 微信小程序中實(shí)現(xiàn)輪播圖效果

    微信小程序中實(shí)現(xiàn)輪播圖效果

    swiper是輪播圖的外層容器,所以使用輪播圖就必須使用到swiper標(biāo)簽。 存在默認(rèn)樣式: 1 width 100% 2 height 150px 只能放置在swiper組件中。表示每一個(gè)輪播項(xiàng)。 編譯效果: 當(dāng)切換機(jī)型后,就可以方向,圖片的寬高與效果不一樣 1.分析和升級(jí)版本,解決換機(jī)型的寬高問(wèn)題 ①先找出

    2024年02月11日
    瀏覽(30)
  • 前端效果積累 |別具一格的3D酷炫輪播圖效果收集

    前端效果積累 |別具一格的3D酷炫輪播圖效果收集

    ?? 個(gè)人主頁(yè) :個(gè)人主頁(yè) ??? 推薦專欄 :前端開(kāi)發(fā)成神之路 --【 這是一個(gè)為想要 入門(mén)和進(jìn)階前端開(kāi)發(fā)專門(mén)開(kāi)啟的精品專欄 !從 個(gè)人到商業(yè)的全套開(kāi)發(fā)教程 ,實(shí)打?qū)嵉母韶浄窒?,確定不來(lái)看看? ????】 ?? 作者簡(jiǎn)介 : 從web開(kāi)發(fā),再到大數(shù)據(jù)算法,踩過(guò)了無(wú)數(shù)的坑,用

    2024年02月16日
    瀏覽(25)
  • 前端Vue自定義輪播圖視頻播放組件 仿京東商品詳情輪播圖視頻Video播放效果 可圖片預(yù)覽

    前端Vue自定義輪播圖視頻播放組件 仿京東商品詳情輪播圖視頻Video播放效果 可圖片預(yù)覽

    隨著技術(shù)的發(fā)展,開(kāi)發(fā)的復(fù)雜度也越來(lái)越高,傳統(tǒng)開(kāi)發(fā)方式將一個(gè)系統(tǒng)做成了整塊應(yīng)用,經(jīng)常出現(xiàn)的情況就是一個(gè)小小的改動(dòng)或者一個(gè)小功能的增加可能會(huì)引起整體邏輯的修改,造成牽一發(fā)而動(dòng)全身。通過(guò)組件化開(kāi)發(fā),可以有效實(shí)現(xiàn)單獨(dú)開(kāi)發(fā),單獨(dú)維護(hù),而且他們之間可以隨

    2024年02月15日
    瀏覽(27)
  • 微信小程序首頁(yè)、界面布局、3D輪播圖效果(示例二)

    微信小程序首頁(yè)、界面布局、3D輪播圖效果(示例二)

    使用swiper實(shí)現(xiàn)3D輪播圖效果,自定義頂部狀態(tài)欄,具體代碼: 1、js代碼 2、wxml代碼 3、wxss代碼 4、json代碼 如需要下載完整版,包含監(jiān)聽(tīng)事件、圖片文件等,請(qǐng)前往下方鏈接,下載完整版,下載后直接使用微信開(kāi)發(fā)者工具打開(kāi)即可,下載鏈接為: 小程序完整版界面(示例二)

    2024年02月10日
    瀏覽(27)
  • Android Jetpack Compose之底部導(dǎo)航欄的實(shí)現(xiàn)

    Android Jetpack Compose之底部導(dǎo)航欄的實(shí)現(xiàn)

    寫(xiě)過(guò)一段Android jetpack compose 界面的小伙伴應(yīng)該都用過(guò)Compose的腳手架 Scaffold ,利用它我們可以很快的實(shí)現(xiàn)一個(gè)現(xiàn)代APP的主流界面架構(gòu),即一個(gè)帶頂部導(dǎo)航欄和底部導(dǎo)航欄的界面架構(gòu),我們基于這個(gè)架構(gòu)可以快速的搭建出我們想要的頁(yè)面效果。而今天的文章就是要介紹如何實(shí)現(xiàn)

    2024年03月23日
    瀏覽(102)
  • Android---Banner輪播圖

    Android---Banner輪播圖

    輪播圖是一種很常見(jiàn)的UI。 Banner框架 能夠幫助我們快速開(kāi)發(fā),完成首頁(yè)輪播圖效果的需求。 1、導(dǎo)入Banner依賴 2、activity_main.xml布局。 banner_loop_time: 設(shè)置輪播間隔時(shí)間,默認(rèn)3000;banner_radius: 設(shè)置輪播圖的圓角 ? 3、設(shè)置Banner 適配器 。 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的輪播圖效果,Banner框架已

    2024年02月01日
    瀏覽(13)
  • 【案例分享 | 旅游出行app】Axure制作banner輪播圖交互效果

    【案例分享 | 旅游出行app】Axure制作banner輪播圖交互效果

    哈嘍,大家好!今天給大家介紹如何使用Axure軟件制作banner輪播圖的交互效果。 【預(yù)覽地址含下載】電腦打開(kāi)鏈接:https://wh9x1s.axshare.com/ 【完整案例作品預(yù)覽含下載】:https://fx2z9z.axshare.com 【視頻教程】:?jiǎn)袅▎袅ㄒ曨l 首先,讓我們來(lái)看下效果展示:進(jìn)入頁(yè)面后自動(dòng)輪播圖

    2024年02月19日
    瀏覽(24)
  • 制作輪播圖經(jīng)驗(yàn)分享——element ui走馬燈的使用(附源碼,效果截圖)

    制作輪播圖經(jīng)驗(yàn)分享——element ui走馬燈的使用(附源碼,效果截圖)

    先附上效果圖: ??element ui鏈接地址:Carousel 走馬燈 | Element Plus (gitee.io) 源碼: 這里我使用的是靜態(tài)圖片(本地) 經(jīng)驗(yàn)分享: 在制作輪播圖的時(shí)候經(jīng)常會(huì)發(fā)現(xiàn)圖片大小不一,這時(shí)候可以在img標(biāo)簽里加上width:100%;height:100%即可實(shí)現(xiàn)圖片鋪滿。 當(dāng)然,這只是輪播圖的一種,還

    2024年02月11日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包