kotlin+android+基础,kotlin-android动画基础篇

因为最近在学习自定义view,所以开始也对动画需要了解下,废话不多说。

动画分为视图动画和属性动画,视图动画需要设计提供图片才可以完成,所以限制性较大,但是属性动画就可以对控件进行属性控制,可以实现更多的效果

视图动画就相对来说比较简单:

1 在drawable创建xml文件

android:drawable需要放入图片的资源,而android:duration设置动画效果的时间,实现代码如下:

class FramAnimationActivity : AppCompatActivity() {

private lateinit var mAnimationDrawable: AnimationDrawable

private lateinit var vAnimationDrawable: View

private lateinit var btnStart: Button

private lateinit var btnStop: Button

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_fram_animation)

vAnimationDrawable=findViewById(R.id.v_animation)

btnStart=findViewById(R.id.start)

btnStop=findViewById(R.id.stop)

mAnimationDrawable=vAnimationDrawable.background as AnimationDrawable

//使动画只演示一次

// mAnimationDrawable.isOneShot=true

onClick()

}

private fun onClick() {

btnStart.setOnClickListener {

mAnimationDrawable.start()

}

btnStop.setOnClickListener {

mAnimationDrawable.stop()

}

}

}

这样就可以实现功能啦

而属性动画就比较多类型了:

1 实现逐渐透明效果:

先在res下面创建一个资源包,用来存放动画效果的xml文件

然后创建xml文件:

android:fillAfter="true"

>

android:duration="1000"

android:fromAlpha="1.0"

android:toAlpha="0.1"/>

android:fromAlpha设定动画开始的透明度

android:toAlpha设置动画变化的目标透明度

实现代码如下:

class ViewActivity : AppCompatActivity() {

private lateinit var tvText:TextView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_view)

initView()

omClick()

}

private fun omClick() {

tvText.setOnClickListener {

//方案一:

// val animation=AnimationUtils.loadAnimation(this,R.anim.alpha)

// tvText.startAnimation(animation)

//方案二:

val alphaAnimator=AnimatorInflater.loadAnimator(this,R.animator.alpha)

//把需要实现效果的控件放进去

alphaAnimator.setTarget(tvText)

alphaAnimator.start()

}

}

private fun initView() {

tvText=findViewById(R.id.tv_text)

}

}

逐渐透明化的效果就出来了!!

2 移动动画的效果:

android:duration="1000"

android:fillAfter="true">

android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="50%"

android:toYDelta="50%p"

android:repeatCount="1"

android:repeatMode="reverse"

/>

android:fillAfter设置动画是否保留移动后的效果,true为是,false的话就会效果实现后,返回原本的位置

android:fromXDelta设置x坐标开始的位置

android:toXDelta设置x坐标移动后的位置

注意下他们俩的填入数值,可以为整数,也可以为百分比,当输入为“50%”那就是对比控件自身的宽度的50%进行移动,如果输入为“50%p”,那就是对比父控件的宽度的50%进行移动!!

android:repeatCount设置控件效果展现重复的次数

android:repeatMode设置重复的模式,有两种,1⃣️reverse就是控件在重复的时候,会以倒倒放的形式重新开始

2⃣️restart在控件效果展现完成后,直接闪现回去,然后重新播放,如果没有设置android:repeatMode的话,就会默认使用第二种重复的模式

实现代码如下:

class TranslateAnimationActivity : AppCompatActivity() {

private lateinit var tvTranslate:TextView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_translate_animation)

initView()

onClick()

}

private fun onClick() {

tvTranslate.setOnClickListener {

//方案一:

// val translateAnimation=AnimationUtils.loadAnimation(this,R.anim.translate)

// tvTranslate.startAnimation(translateAnimation)

//方案二:

tvTranslate.animate().translationX(300f).setDuration(1000).start()

}

}

private fun initView() {

tvTranslate=findViewById(R.id.tv_translate)

}

}

3 动画旋转效果

老规则,创建效果xml

android:duration="1000">

android:fromDegrees="0"

android:toDegrees="180"

android:pivotY="0"

android:pivotX="0"

android:repeatCount="infinite"

android:repeatMode="reverse"

/>

android:fromDegrees设置开始旋转的角度

android:toDegrees

设置旋转的角度

android:pivotY和android:pivotX就是设置旋转的点

,这个基点别的效果也可以应用上的哦

android:repeatCount="infinite"设置动画无限重复!!

实现代码如下:

class RotateAnimationActivity : AppCompatActivity() {

private lateinit var tvBotate:TextView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_rotate_animation)

initView()

onClick()

}

private fun onClick() {

tvBotate.setOnClickListener {

val rotateAnimation= AnimationUtils.loadAnimation(this,R.anim.rotate)

tvBotate.startAnimation(rotateAnimation)

}

}

private fun initView() {

tvBotate=findViewById(R.id.tv_rotate)

}

}

4 组合动画效果

android:fillAfter="true">

android:fromDegrees="0"

android:toDegrees="360"

android:pivotX="50%"

android:pivotY="50%"

android:duration="1000"

android:repeatCount="infinite"

/>

android:fromYDelta="0"

android:toYDelta="0"

android:startOffset="1000"

android:fromXDelta="0"

android:toXDelta="60%p"

android:duration="1000"

/>

这里是把旋转和平移的效果组合使用了

android:startOffset="1000"设置该控件的的效果在1000毫秒后生效

class SetAnimationActivity : AppCompatActivity() {

private lateinit var setAnimation:TextView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_set_animation)

initView()

onClick()

}

private fun onClick() {

setAnimation.setOnClickListener {

//方案一:

// val rotateAnimation= AnimationUtils.loadAnimation(this,R.anim.set)

// setAnimation.startAnimation(rotateAnimation)

//方案二:

// val rotateAnimation=ObjectAnimator.ofFloat(setAnimation,"rotation",0f,720f)

// //设置时间

// rotateAnimation.duration=1000

//

// val translateAnimation=ObjectAnimator.ofFloat(setAnimation,"x",0f,300f)

// translateAnimation.duration=1000

//

// val set=AnimatorSet()

// //两种效果同时显示

set.playTogether(rotateAnimation,translateAnimation)

// //设置效果先后顺序,先旋转再平移

// set.playSequentially(rotateAnimation,translateAnimation)

// set.start()

// //方案三:

// setAnimation.animate().rotation(720f).setDuration(1000).start()

// //setStartDelay(1000)设置延迟生效时间

// setAnimation.animate().translationX(300f).setDuration(1000).setStartDelay(1000).start()

val moveIn = ObjectAnimator.ofFloat(setAnimation, "translationX", -500f, 0f)

val rotate = ObjectAnimator.ofFloat(setAnimation, "rotation", 0f, 360f)

val fadeInOut = ObjectAnimator.ofFloat(setAnimation, "alpha", 1f, 0f, 1f)

val animSet = AnimatorSet()

animSet.play(rotate).with(fadeInOut).after(moveIn)

animSet.duration = 5000

animSet.start()

}

}

private fun initView() {

setAnimation=findViewById(R.id.tv_setAnimation)

}

}

5 动画展现速度的概念

class ValueAnimationActivity : AppCompatActivity() {

private lateinit var valueAnimation:Button

private val TAG = "ValueAnimationActivity"

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_value_animation)

initView()

onClick()

}

private fun onClick() {

valueAnimation.setOnClickListener {

val valueAnimator=ValueAnimator.ofInt(0,100)

valueAnimator.duration = 100

valueAnimator.addUpdateListener(object :ValueAnimator.AnimatorUpdateListener{

override fun onAnimationUpdate(animation: ValueAnimator?) {

var animatedFraction=animation?.animatedFraction

var animatedValue=animation?.animatedValue as Int

Log.d(TAG, "onAnimationUpdate: ${String.format("%3f %d",animatedFraction,animatedValue)}" )

}

})

valueAnimator.start()

}

}

private fun initView() {

valueAnimation=findViewById(R.id.btn_value)

}

}

今天就到了这里啦,先去忙工作啦!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值