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

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

 更新時間:2021年11月18日 15:30:43   作者:theyangchoi  
這篇文章主要介紹了如何利用compose框架制作app底部按鈕以及首頁內容的詳細代碼,具有一定價值,感興趣的可以了解一下
.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) } }) } }

最后就行調用

InitBanner(bannerList= bannerList!!,2000L)

實現(xiàn)文章列表

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

Compose約束布局需要導入以下相關依賴:

implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0-rc01"
  1. val img = createRef() 創(chuàng)建一個依賴點,就像xml約束布局里面的id意義昂
  2. Modifier 使用Modifier的constrainAs進行約束調整
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下拉刷新組件的使用。

首先導入依賴包:

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

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

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 關閉加載狀態(tài)
    })
})

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

LaunchedEffect簡介

LaunchedEffect存在的意義是允許我們在被Composable標注的方法中使用協(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ā)條件,當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 關閉加載狀態(tài)
   })
})

而當我們在刷新的時候在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 當前頁面狀態(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分支

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

相關文章

  • android自定義對話框實例代碼

    android自定義對話框實例代碼

    大家好,本篇文章主要講的是android自定義對話框實例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android自適應不同屏幕大小的全部方法

    Android自適應不同屏幕大小的全部方法

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

    詳解Android的登錄那點事

    本篇為大家介紹的內容包括:1、用戶連續(xù)多次輸錯密碼,增加驗證碼驗證;2、Android如何通過http請求達到與服務器之間的通訊。內容簡單,便于學習。
    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的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-03-03
  • Android判斷后臺服務是否開啟的兩種方法實例詳解

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

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

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

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

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

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

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

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

最新評論

随州市| 岳普湖县| 密云县| 越西县| 浠水县| 策勒县| 邯郸县| 都昌县| 婺源县| 绵阳市| 周口市| 松江区| 榆社县| 浠水县| 满洲里市| 军事| 隆昌县| 桐庐县| 白沙| 宿迁市| 永寿县| 清河县| 安丘市| 英山县| 厦门市| 浠水县| 宁武县| 泰来县| 乡宁县| 团风县| 通州区| 县级市| 凤山县| 永修县| 英德市| 漳州市| 定结县| 恩平市| 乌兰浩特市| 成武县| 兴隆县|