本篇将介绍Android一些冷门View的使用
关于Android的各个View的介绍
本篇已Kotlin为主要语言
介绍的功能皆为最新功能
Toolbar
设置标题
1
app:title="这里是标题"
设置标题前的图标
1
app:navigationIcon="@drawable/ic_baseline_arrow_back"
是否选择在当前的布局当时是否以“视差”的方式来跟随滚动
1
app:layout_collapseMode="pin"
其实就是让这个View的滚动的速度比其他正常滚动的View速度稍微慢一点
关于CollapsingToolbarLayout与Toolbar联动使用
设置上滑到Toolbar高度时,Toolbar的背景以及过度颜色
1
app:contentScrim=”?attr/colorPrimary”
当上滑到toolbar 高度期间直到达到toolbar高度时,给toolbar设置的背景色,以及过渡颜色。当然,这里不仅仅可以设置颜色,也可以设置图片。 如果不设置该属性,标题栏会过渡为以之前的图片为背景
设置Toolbar Title位置
1
app:expandedTitleGravity=”center_horizontal”
设置Toolbar Title距离开始位置的边距
1
app:expandedTitleMarginStart=”50dp”
设置Toolbar文字颜色
Activity跳转动画
overridePendingTransition()
这个方法用来覆盖即将到来的跳转动画,也就是说使用这个方法可以替换原本的跳转动画
overridePendingTransition()的调用时机
这个方法需要在startActivity()或者finish()之后立即调用
1
2
3
4
5
6val intent = Intent(activity, MainActivity::class.java)
activity.startActivity(intent)
activity.overridePendingTransition(
R.anim.anim_slide_enter_bottom,
R.anim.anim_no_anim
)overridePendingTransition()需要传入两个参数,第一个为进入动画,第二个为退出动画
这些资源都需要在anim文件夹中创建
ObjectAnimator
ObjectAnimator派生自ValueAnimator,所以ValueAnimator能用的方法,ObjectAnimator都能用, ObjectAnimator 是ValueAnimator的子类。
例子展示
1
2
3
4
5
6
7
8private val objectAnimator: ObjectAnimator by lazy {
ObjectAnimator.ofFloat(binding.ivCover, ANIMATION_PROPERTY_NAME, 0f, 360f).apply {
interpolator = LinearInterpolator()
duration = DURATION_CD//设置动画时间
repeatCount = ANIMATION_REPEAT_COUNTS
start()
}
}ObjectAnimator.ofFloat接收4个参数
第一个:进行动画的View
第二个:需要进行动画的属性
第三个:起始值
第四个:结束值
ObjectAnimator的函数
- 改变旋转度数 rotation、rotationX、rotationY
- rotation:表示围绕 Z 旋转,rotation 表示旋转度数
- rotationX:表示围绕X旋转,rotationX表示旋转度数
- rotationY:表示微软Y旋转,rotationY表示旋转度数
- 移动 translationX、translationY
- float translationX:表示在X轴上移动的距离,以当前控件为原点,向右为正方向,参数 translationX 表示移动的距离
- float translationY:表示在Y轴上移动的距离,以当前控件为原点,向下位正方向,参数 translationY 表示移动的距离
- 缩放 scaleX、scaleY
- float scaleX:在X轴上缩放,scaleX表示缩放倍数
- float scaleY:在Y轴上缩放,scaleY表示缩放倍数
- 改变透明度 alpha
- float alpha:控制View的透明度
- 改变旋转度数 rotation、rotationX、rotationY
自定义ObjectAnimator的属性
只需要确保View需要改变属性有公开的 set’() / get() 方法即可
1
2
3class Circle( //圆的半径
var radius: Int
)接下来只需要给它创建一个set/get方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23class MyPointView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {
private val mCircle: Circle? = Circle(0)
protected fun onDraw(canvas: Canvas) {
if (mCircle != null) {
val paint = Paint()
paint.setAntiAlias(true)
paint.setColor(Color.RED)
paint.setStyle(Paint.Style.FILL)
canvas.drawCircle(400, 500, mCircle.getRadius(), paint)
}
super.onDraw(canvas)
}
//set函数
//get函数
var circleRadius: Int
get() = 800
set(radius) {
mCircle.setRadius(radius)
invalidate()//invalidate()请求重绘View树,也就是刷新View
}
}在Activity中使用
1
2
3
4val animator = ObjectAnimator.ofInt(view, "circleRadius", 40, 400)
animator.interpolator = BounceInterpolator()
animator.duration = 2000
animator.start()
DataBingding与ViewBinding
dataBinding
在Model的build.gradle中开启dataBinding
1
2
3
4
5android{
buildFeatures{
dataBinding = true
}
}在Android Stuio 4.0以上时,只能使用buildFeatures来进行管理
在Xml中开启
将光标移到第一行第一位,按下键盘”ALT+ENTER”选择第一个创建binding layout即可
在Activity中引入
1
2
3
4
5
6
7
8
9
10class MainActivity : BaseActivity(), View.OnClickListener {
//先申明为延迟初始化
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//使用DataBindingUtil来进行载入布局
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
}
}使用
1
2binding.randomText.text = "当前随机参数为:${it?.get(0)?.randomName}"
binding.randomCountLast.text = "随机次数为:${it?.get(0)?.randomNum}"直接使用binding.xxx来引用View
viewBinding
在Model的build.gradle中开启dataBinding
1
2
3
4
5
6android {
...
buildFeatures{
viewBinding = true
}
}开启之后,系统将会自动的生成绑定类
在Activity中使用
1
2
3
4
5
6
7
8
9
10class MainActivity : BaseActivity(), View.OnClickListener {
//先申明为延迟初始化
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//将不需要指明Layout文件
binding = ActivityMainBinding.inflate(layoutInflater)
}
}剩下的与dataBinding一致
5.