最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android Compose實現(xiàn)底部按鈕以及首頁內(nèi)容詳細過程第2/2頁

 更新時間:2021年11月18日 15:30:43   作者:theyangchoi  
這篇文章主要介紹了如何利用compose框架制作app底部按鈕以及首頁內(nèi)容的詳細代碼,具有一定價值,感興趣的可以了解一下
.imagePath), modifier = Modifier.fillMaxSize(), contentScale = ContentScale.Crop, contentDescription = null ) } //自動輪播 LaunchedEffect(key1 = pagerState.currentPage, block = { Log.e("LaunchedEffect","${pagerState.currentPage}") if (pagerState.currentPage >=0 && pagerState.currentPage < bannerList.size -1){ delay(timeMillis = timeMillis) pagerState.animateScrollToPage(pagerState.currentPage +1) }else{ delay(timeMillis = timeMillis) pagerState.animateScrollToPage(0) } }) } }

最后就行調(diào)用

InitBanner(bannerList= bannerList!!,2000L)

實現(xiàn)文章列表

數(shù)據(jù)請求就不做過多贅述了,和banner的數(shù)據(jù)請求一樣,這里主要解析一下Compose的約束布局ConstraintLayout。

Compose約束布局需要導(dǎo)入以下相關(guān)依賴:

implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-rc01"
  1. val img = createRef() 創(chuàng)建一個依賴點,就像xml約束布局里面的id意義昂
  2. Modifier 使用Modifier的constrainAs進行約束調(diào)整
ConstraintLayout(
        Modifier
            .fillMaxWidth()
            .padding(horizontal = 8.dp)) {
             val img = createRef()
             Text(text = "作者:${entity.audit}")

             Image(painter = painterResource(id = R.drawable.icon_un_select),
                   contentDescription = "收藏",
                   Modifier
                       .width(30.dp)
                       .height(30.dp)
                       .constrainAs(img) {
                           end.linkTo(parent.end)
                        },
            		alignment = Alignment.CenterEnd)
}

Item代碼如下

@Composable
private fun ArticleListItem(entity: ArticleEntity,modifier: Modifier = Modifier){
    Card(
        shape = RoundedCornerShape(10.dp),
        backgroundColor = ComposeUIDemoTheme.colors.listItem,
        elevation = 2.dp,modifier =
        Modifier.padding(0.dp,10.dp,0.dp,0.dp)
    ) {
        Row(
            Modifier
                .fillMaxWidth()
                .clickable {
                    Log.e("articleTAG", "文章點擊")
                }) {
            Column(Modifier.fillMaxWidth()) {
                Text(text = "${entity.title}",
                    Modifier.padding(8.dp,8.dp,8.dp,8.dp),
                    fontSize = 16.sp,
                    color = ComposeUIDemoTheme.colors.textPrimary,
                    maxLines = 1,
                    overflow = TextOverflow.Ellipsis)

                ConstraintLayout(
                    Modifier
                        .fillMaxWidth()
                        .padding(horizontal = 8.dp)) {
                    val img = createRef()
                    Text(text = "作者:${entity.audit}")

                    Image(painter = painterResource(id = R.drawable.icon_un_select),
                        contentDescription = "收藏",
                        Modifier
                            .width(30.dp)
                            .height(30.dp)
                            .constrainAs(img) {
                                end.linkTo(parent.end)
                            },
                        alignment = Alignment.CenterEnd)
                }

                ConstraintLayout(
                    Modifier
                        .fillMaxWidth()
                        .padding(8.dp)) {
                    val parentView = createRef()

                    Text(text = "${entity.superChapterName}",
                        modifier = Modifier
                            .padding(8.dp)
                            .border(
                                1.dp, color = Color(R.color.b_666),
                                RoundedCornerShape(8.dp)
                            )
                            .padding(horizontal = 8.dp, vertical = 2.dp),
                        color = Color.Gray,
                        fontSize = 12.sp
                    )
                    Text(text = "${entity.niceShareDate}",modifier = Modifier.constrainAs(parentView){
                        end.linkTo(parent.end)
                        centerVerticallyTo(parent)
                    },color = Color.Gray,fontSize = 12.sp,textAlign = TextAlign.Center)
                }
            }
        }
    }
}

SwipeRefresh下拉刷新

操作列表的時候下拉刷新和上拉加載更多的操作肯定是少不了的,這里先說一下Compose SwipeRefresh下拉刷新組件的使用。

首先導(dǎo)入依賴包:

implementation "com.google.accompanist:accompanist-swiperefresh:$accompanist_pager"http://0.20.2

在ViewModel里面保存一個記錄刷新狀態(tài)的元素,在刷新請求數(shù)據(jù)過程中這個值要變成true進行刷新動畫的加載,刷新完成之后要變成false關(guān)閉加載動畫。

val _isRefreshing: MutableLiveData<Boolean> = MutableLiveData(false)
val isRefreshing by viewModel._isRefreshing.observeAsState(false)
SwipeRefresh(state = rememberSwipeRefreshState(isRefreshing = isRefreshing),
    onRefresh = {
          //將刷新狀態(tài)的值改為true  顯示加載動畫
          viewModel._isRefreshing.value = true
          //將請求數(shù)據(jù)的值做改變  讓它能重新請求數(shù)據(jù)
          requestState.value = "refresh"+System.currentTimeMillis()
    }) {
    	//填充數(shù)據(jù)
        Box(
           Modifier
                .background(ComposeUIDemoTheme.colors.background)
                .fillMaxSize()
          ) {
              Column(Modifier.fillMaxWidth()) {
                    if (bannerList !== null){
                        InitBanner(bannerList= bannerList!!,2000L)
                    }
                    if (articleEntityPage !== null){
                        InitHomeArticleList(articleData = articleEntityPage!!)
                    }
            }
     }
}

LaunchedEffect(key1 = requestState.value, block = {
    bVM.getBannerList()
    bVM.getArticleData({
        viewModel._isRefreshing.value = false//將刷新狀態(tài)的值改成false 關(guān)閉加載狀態(tài)
    })
})

首頁的內(nèi)容一共就這么多了,到這里就能實現(xiàn)一個 app的地步導(dǎo)航欄以及首頁了。

LaunchedEffect簡介

LaunchedEffect存在的意義是允許我們在被Composable標(biāo)注的方法中使用協(xié)程。

@Composable
@NonRestartableComposable
@OptIn(InternalComposeApi::class)
fun LaunchedEffect(
    key1: Any?,
    block: suspend CoroutineScope.() -> Unit
) {
    val applyContext = currentComposer.applyCoroutineContext
    remember(key1) { LaunchedEffectImpl(applyContext, block) }
}

主要參數(shù)是key1,block;key1是觸發(fā)條件,當(dāng)key1發(fā)生改變的時候就會執(zhí)行block里面的方法,注意是發(fā)生改變的時候。

我們一開始在請求數(shù)據(jù)的時候創(chuàng)建了一個requestState來記錄請求狀態(tài),如果這個狀態(tài)不發(fā)生改變,那么就只會觸發(fā)一次LaunchedEffect對數(shù)據(jù)進行請求。

//記錄請求狀態(tài)
val requestState = remember { mutableStateOf("") }
LaunchedEffect(key1 = requestState.value, block = {
   bVM.getBannerList()
   bVM.getArticleData({
        viewModel._isRefreshing.value = false//將刷新狀態(tài)的值改成false 關(guān)閉加載狀態(tài)
   })
})

而當(dāng)我們在刷新的時候在onRefres里面改變了這個參數(shù)的值,那么它就會觸發(fā)LaunchedEffect重新進行數(shù)據(jù)請求。

onRefresh = {
      //將刷新狀態(tài)的值改為true  顯示加載動畫
      viewModel._isRefreshing.value = true
      //將請求數(shù)據(jù)的值做改變  讓它能重新請求數(shù)據(jù)
      requestState.value = "refresh"+System.currentTimeMillis()
}

HorizontalPager簡介

HorizontalPager類似于AndroidView的ViewPager,用于頁面承載和滑動切換,主要參數(shù)是count頁面數(shù)據(jù),以及state 當(dāng)前頁面狀態(tài)。

// Display 10 items
HorizontalPager(count = 10) { page ->
    // Our page content
    Text(
        text = "Page: $page",
        modifier = Modifier.fillMaxWidth()
    )
}

通過scrollToPage可以進行頁面切換,但是只能在協(xié)程里面被執(zhí)行,所以同樣要使用LaunchedEffect進行頁面切換。

//頁面切換
LaunchedEffect(key1 = indexState.value, block = {
     pagerState.scrollToPage(indexState.value)
})

更多用法以及demo移步這個鏈接。

源碼地址

碼云地址,記得切換main分支

到此這篇關(guān)于Android Compose實現(xiàn)底部按鈕以及首頁內(nèi)容詳細過程的文章就介紹到這了,更多相關(guān)Android內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • android自定義對話框?qū)嵗a

    android自定義對話框?qū)嵗a

    大家好,本篇文章主要講的是android自定義對話框?qū)嵗a,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android自適應(yīng)不同屏幕大小的全部方法

    Android自適應(yīng)不同屏幕大小的全部方法

    這篇文章主要介紹了Android自適應(yīng)不同屏幕大小的全部方法,具有很好的參考價值,希望對大家有所幫助,一起跟隨小編過來看看吧
    2018-05-05
  • 詳解Android的登錄那點事

    詳解Android的登錄那點事

    本篇為大家介紹的內(nèi)容包括:1、用戶連續(xù)多次輸錯密碼,增加驗證碼驗證;2、Android如何通過http請求達到與服務(wù)器之間的通訊。內(nèi)容簡單,便于學(xué)習(xí)。
    2016-12-12
  • JankMan-極致的卡頓分析系統(tǒng)

    JankMan-極致的卡頓分析系統(tǒng)

    這篇文章主要為大家介紹了JankMan-極致的卡頓分析系統(tǒng)使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Android開發(fā)懸浮窗踩坑解決

    Android開發(fā)懸浮窗踩坑解決

    這篇文章主要為大家介紹了Android懸浮窗踩坑解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 解決Android Studio電腦不支持HAXM的問題

    解決Android Studio電腦不支持HAXM的問題

    這篇文章主要介紹了Android Studio電腦不支持HAXM的問題及解決方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-03-03
  • Android判斷后臺服務(wù)是否開啟的兩種方法實例詳解

    Android判斷后臺服務(wù)是否開啟的兩種方法實例詳解

    這篇文章主要介紹了Android判斷后臺服務(wù)是否開啟的方法的相關(guān)資料,這里提供了兩種方法及實例,需要的朋友可以參考下
    2017-07-07
  • Kotlin字符串操作在Android開發(fā)中的應(yīng)用示例代碼

    Kotlin字符串操作在Android開發(fā)中的應(yīng)用示例代碼

    本文介紹了Kotlin在Android開發(fā)中的字符串操作,包括多行字符串的創(chuàng)建、字符串插值、獲取字符串長度以及處理特殊字符等,通過示例代碼,展示了這些操作的實現(xiàn)方法,使開發(fā)者在處理字符串時更加高效便捷,感興趣的朋友一起看看吧
    2025-03-03
  • 使用android隱藏api實現(xiàn)亮度調(diào)節(jié)的方法

    使用android隱藏api實現(xiàn)亮度調(diào)節(jié)的方法

    使用android隱藏api實現(xiàn)亮度調(diào)節(jié)的方法,需要的朋友可以參考一下
    2013-05-05
  • Android中activity從創(chuàng)建到顯示的基本介紹

    Android中activity從創(chuàng)建到顯示的基本介紹

    這篇文章主要給大家介紹了關(guān)于Android中activity從創(chuàng)建到顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android初學(xué)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧。
    2017-11-11

最新評論

二连浩特市| 阳信县| 黔南| 虎林市| 高安市| 靖宇县| 垣曲县| 洪雅县| 大邑县| 安远县| 观塘区| 济阳县| 高邑县| 监利县| 灵川县| 长寿区| 平果县| 区。| 溧阳市| 龙泉市| 松溪县| 万安县| 海安县| 吉木萨尔县| 云梦县| 双鸭山市| 五原县| 鲜城| 云梦县| 锡林郭勒盟| 东宁县| 康定县| 普陀区| 万源市| 苏尼特右旗| 新源县| 威信县| 集贤县| 北海市| 吉木萨尔县| 谷城县|