当前位置: 首页 > news >正文

旅游 网站建设短链接生成

旅游 网站建设,短链接生成,帮别人做时时彩网站,wordpress新文章无法1. AnimatedVisibility 是什么 AnimatedVisibility可以实现Compose组件的显示和隐藏,并且可以指定显示/隐藏时候的动画效果。(EnterTransition/ExitTransition) 和 animateXxxAsState、animateContentSize、Crossfade、AnimatedContent 这几个API一起,都…

1. AnimatedVisibility 是什么

AnimatedVisibility可以实现Compose组件的显示和隐藏,并且可以指定显示/隐藏时候的动画效果。(EnterTransition/ExitTransition)
和 animateXxxAsState、animateContentSizeCrossfadeAnimatedContent 这几个API一起,都是Compose的高级别动画API,是比较易用的。

2. AnimatedVisibility 的基础使用

@Composable
fun AnimatedVisibilityPage() {Column(horizontalAlignment = Alignment.CenterHorizontally) {var visible by remember {mutableStateOf(true)}AnimatedVisibility(visible = visible) {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)}Spacer(modifier = Modifier.height(10.dp))Button(onClick = { visible = !visible }) {Text(text = "显示/隐藏")}}
}

看上去是不是很简单,只需要在Image外层包上AnimatedVisibility就可以了,显示效果如下
在这里插入图片描述
我们点进AnimatedVisibility的源码,可以看到如下代码

@Composable
fun ColumnScope.AnimatedVisibility(visible: Boolean,modifier: Modifier = Modifier,enter: EnterTransition = fadeIn() + expandVertically(),exit: ExitTransition = fadeOut() + shrinkVertically(),label: String = "AnimatedVisibility",content: @Composable AnimatedVisibilityScope.() -> Unit
){val transition = updateTransition(visible, label)AnimatedEnterExitImpl(transition, { it }, modifier, enter, exit, content)
}

可以发现其内部调用了updateTransition,该函数内部会返回Transition对象。

@Composable
fun <T> updateTransition(targetState: T,label: String? = null
): Transition<T> {//...省略...
}

Transition可管理一个或多个动画作为其子项,并在多个状态之间同时运行这些动画。
这个我们后续文章会讲到,现在先知道有这样一个概念就好。

3. 入场和出场效果

enterexit,用来配置入场/出场时候的动画效果。

默认的入场效果是 fadeIn() + expandVertically()
默认的出场效果是 fadeOut() + shrinkVertically()

3.1 EnterTransitionExitTransition支持的动画

enter的参数类型是EnterTransition,支持这些动画

  • fade: fadeIn
  • scale: scaleIn
  • slide: slideIn, slideInHorizontally, slideInVertically
  • expand: expandIn, expandHorizontally, expandVertically

exit的参数类型是EnterTransition

  • fade: fadeOut
  • scale: scaleOut
  • slide: slideOut, slideOutHorizontally, slideOutVertically
  • shrink: shrinkOut, shrinkHorizontally, shrinkVertically

可以看到EnterTransitionExitTransition支持的动画只有expandshrink命名上有区别,
其他都是对应的 fadeInfadeOutscaleInscaleOutslideInslideOut
expandshrink命名上做区分,是因为expand就是展开的意思,而shrink收缩的意思,它们其实就是相对应的。

3.1.1 fadeIn / fadeOut

fadeIn / fadeOut是淡出淡出的效果

我们依旧使用上面的那段代码

@Composable
fun AnimatedVisibilityPage() {Column(horizontalAlignment = Alignment.CenterHorizontally) {var visible by remember {mutableStateOf(true)}AnimatedVisibility(visible = visible) {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)}Spacer(modifier = Modifier.height(10.dp))Button(onClick = { visible = !visible }) {Text(text = "显示/隐藏")}}
}

先把图片部分抽取为一个Composable函数

@Composable
private fun MyImage() {Image(painter = painterResource(id = R.mipmap.photot1),modifier = Modifier.width(300.dp),contentDescription = null)
}

然后修改AnimatedVisibility,配置enterexit

AnimatedVisibility(visible = visible,enter = fadeIn(),exit = fadeOut()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.2 scaleIn / scaleOut

scaleIn / scaleOut是缩放的效果

AnimatedVisibility(visible = visible,enter = scaleIn(),exit = scaleOut()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.3 slideIn / SlideOut

slideIn / SlideOut是滑动的效果,这里进入的初始位置和退出的目标位置都设置为了(300,-150),所以会从右上角进入/退出

AnimatedVisibility(visible = visible,enter = slideIn(initialOffset = {IntOffset(300, -150) }),exit = slideOut(targetOffset = {IntOffset(300,-150) })
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.3.1 slideInVertically / slideOutVertically

slideInVertically / slideOutVertically是垂直方向滑动进入/退出

AnimatedVisibility(visible = visible,enter = slideInVertically(),exit = slideOutVertically()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.3.2 slideInHorizontally / slideOutHorizontally

slideInHorizontally / slideOutHorizontally是从横向方向滑动进入/退出

AnimatedVisibility(visible = visible,enter = slideInHorizontally(),exit = slideOutHorizontally()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.4 expandIn / shrinkOut

expandIn / shrinkOut展开/收缩的效果

AnimatedVisibility(visible = visible,enter = expandIn(),exit = shrinkOut()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.4.1 expandVertically / shrinkVertically

expandVertically / shrinkVertically是从垂直方向展开/收缩

AnimatedVisibility(visible = visible,enter = expandVertically(),exit = shrinkVertically()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.4.2 expandHorizontally / shrinkHorizontally

expandHorizontally / shrinkHorizontally是从横向方向展开/收缩

AnimatedVisibility(visible = visible,enter = expandHorizontally(),exit = shrinkHorizontally()
) {MyImage()
}

效果如下所示
在这里插入图片描述

3.1.5 EnterTransitionExitTransition的源码

再来看下源码,入场动画EnterTransition和出场动画ExitTransition内部都有TransitionData变量

sealed class EnterTransition {internal abstract val data: TransitionData//...
}
sealed class ExitTransition {internal abstract val data: TransitionData//...
}

TransitionData即是可配置的动画参数,分别对应fadeslideexpand/shrinkscale

internal data class TransitionData(val fade: Fade? = null,val slide: Slide? = null,val changeSize: ChangeSize? = null,val scale: Scale? = null
)

我们可以发现 EnterTransition 和 ExitTransition 是 sealed class,密封类
其子类可以出现在定义 sealed class 的不同文件中,但不允许出现在与不同的 module 中,且需要保证 package 一致
这样既可以避免 sealed class 文件过于庞大,又可以确保第三方库无法扩展你定义的 sealed class,达到限制类的扩展目的

3.2 +号的作用

AnimatedVisibility源码的部分,入场(enter)和出场(exit)的配置,使用了+,这个加号是用来做什么的呢 ?

首先,+号是Kotlin的一个特性 : 重载运算符

我们点击这个+号,就可以跳转到它的源码

@Stable
operator fun plus(enter: EnterTransition): EnterTransition {return EnterTransitionImpl(TransitionData(fade = data.fade ?: enter.data.fade,slide = data.slide ?: enter.data.slide,changeSize = data.changeSize ?: enter.data.changeSize,scale = data.scale ?: enter.data.scale))}

如果data不为空,就用data的值,否则用enter/exit的。
这里的data就是EnterTransitionExitTransition中的那个变量internal abstract val data: TransitionData(见 3.1 EnterTransitionExitTransition支持的动画部分)

所以fadeIn() + expandVertically()fadeIn()会赋值给TransitionDatafadeexpandVertically会赋值给changeSize

即 : 合并各个动画的效果

3.2.1 两个相同的动画会有什么效果

如果是两个相同的动画,比如fadeIn(initialAlpha = 0.3f) + fadeIn(initialAlpha = 0.5f)
根据源码中的这个规则 如果data不为空,就用data的值,否则用enter/exit的。可知 :
两个fade,会重叠了,导致后面那部分不会生效,等同于fadeIn(initialAlpha = 0.3f)+号左边优先级高

3.3 多种动画效果结合

我们来尝试下多种动画效果,使用+号合并之后的效果

val density = LocalDensity.current
AnimatedVisibility(visible = visible,enter = slideInVertically {//从顶部-200dp的位置开始滑入with(density) { -200.dp.roundToPx() }} + expandHorizontally(//展开位置expandFrom = Alignment.End) + fadeIn(//从初始透明度0.3f开始淡入initialAlpha = 0.3f),exit = slideOutHorizontally() + shrinkHorizontally() + fadeOut()
) {MyImage()
}

效果如下所示
在这里插入图片描述

4. 不同的作用域

4.1 AnimatedVisibility的作用域

AnimatedVisibility有好几种作用域,区别在于在这几种布局中,默认的入场动画出场动画是不同的

Column默认的出入场动画具有垂直展开,而Row的出入场动画具有横向展开Transition无前缀的出入场动画是展开/收缩

Column

fun ColumnScope.AnimatedVisibility(visible: Boolean,modifier: Modifier = Modifier,enter: EnterTransition = fadeIn() + expandVertically(),exit: ExitTransition = fadeOut() + shrinkVertically(),label: String = "AnimatedVisibility",content: @Composable AnimatedVisibilityScope.() -> Unit
)

Row

fun RowScope.AnimatedVisibility(visible: Boolean,modifier: Modifier = Modifier,enter: EnterTransition = fadeIn() + expandHorizontally(),exit: ExitTransition = fadeOut() + shrinkHorizontally(),label: String = "AnimatedVisibility",content: @Composable() AnimatedVisibilityScope.() -> Unit
)

Transition

@ExperimentalAnimationApi //实验的动画API
@Composable
fun <T> Transition<T>.AnimatedVisibility(visible: (T) -> Boolean,modifier: Modifier = Modifier,enter: EnterTransition = fadeIn() + expandIn(),exit: ExitTransition = shrinkOut() + fadeOut(),content: @Composable() AnimatedVisibilityScope.() -> Unit
) = AnimatedEnterExitImpl(this, visible, modifier, enter, exit, content)

无前缀

fun AnimatedVisibility(visible: Boolean,modifier: Modifier = Modifier,enter: EnterTransition = fadeIn() + expandIn(),exit: ExitTransition = shrinkOut() + fadeOut(),label: String = "AnimatedVisibility",content: @Composable() AnimatedVisibilityScope.() -> Unit
)

4.2 使用不了AnimatedVisibility

如果我们在Column里面有个BoxBox里面又有AnimatedVisibility,会发现AnimatedVisibility会报错
在这里插入图片描述

我们把鼠标移到这个报红的地方,可以看到如下的提示

在这里插入图片描述
这边提示

'fun ColumnScope.AnimatedVisibility(visible: Boolean, modifier: Modifier = ..., enter: EnterTransition = ..., exit: ExitTransition = ..., label: String = ..., content: AnimatedVisibilityScope.() -> Unit): Unit' can't be called in this context by implicit receiver. Use the explicit one if necessary

注意最后一句
也就是说,不能使用隐式调用,而必须得用显式的。因为AnimatedVisibility有好几种作用域,ColumnScope和全局的作用域,IDE不知道该引用哪个了。

我们可以显示添加this@Column.,这样,就会引用Column的那个AnimatedVisibility
在这里插入图片描述
当然也可以包装一层Compose函数,使用全局作用域的AnimatedVisibility
在这里插入图片描述
这两种都是可行的

5. 其他

Compose 动画系列,后续持续更新,可以先关注
Compose 动画 (一) : animateXxxAsState 实现放大/缩小/渐变等效果
Compose 动画 (二) : 为什么animateDpAsState要用val ? MutableState和State有什么区别 ?

http://www.dinnco.com/news/49419.html

相关文章:

  • 牡丹区住房城乡建设局网站免费涨热度软件
  • 嘉兴网站建设科技有限公司营销型网站建设
  • 江门中企动力淘宝seo排名优化
  • 招聘网站开发人员bing搜索
  • 免费版多用户商城源码seoapp推广
  • 网站制作南宁搜索引擎优化技巧
  • 网站开发需求分析怎么写怎么做推广和宣传
  • 美团网站怎么做电子商务推广
  • 怎样提高网站浏览量外贸seo推广招聘
  • 整站seoseo优化最近的国际新闻热点
  • 新公司做网站和域名百度推广怎么优化
  • 记事本做网站插图片近期国内新闻
  • 网站页面策划怎么做公司网站设计与制作
  • 建站全过程一级域名生成二级域名
  • wordpress云存储seo搜索引擎优化课程总结
  • 安徽华力建设集团网站淘宝关键词排名查询工具
  • 滕州市做淘宝网站的北京seo相关
  • 网站的建设论文济南网站建设公司选济南网络
  • 移动深圳网站关键词排名点击软件工具
  • 星悦做任务网站是搜索关键词怎么让排名靠前
  • 美容美发化妆品培训企业网站源码带后台php织梦dede5.7各大搜索引擎收录入口
  • 网站做sem推广时要注意什么国际大新闻最新消息
  • 建设网站的报告腾讯企点客服
  • 视频上传网站如何做站长平台工具
  • 快照网站国外搜索引擎
  • 韩城网站建设网站百度推广
  • 沈阳做网站seo家庭优化大师下载
  • 三里屯做网站的公司百度点击软件
  • 不会写代码怎样做网站互联网营销行业前景
  • 杭州网站建设宣盟网络江门seo