package com.yidianling.home.utils import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator import android.content.Context import android.graphics.Color import android.view.View import android.widget.ImageView import android.widget.LinearLayout import android.widget.RelativeLayout import android.widget.TextView import com.ydl.ydlcommon.utils.ColorCalculateUtils import com.yidianling.home.constract.IHomeContract import com.yidianling.common.tools.RxDeviceTool import com.yidianling.common.tools.RxImageTool /** * @author yuanWai * @描述: * @Copyright Copyright (c) 2018 * @Company 壹点灵 * @date 2019/3/21 */ class HomeAnimUtils { companion object { private var animStart: ValueAnimator? = null private var animEnd: ValueAnimator? = null private var animSearchStart : ValueAnimator? = null private var animSearchEnd : ValueAnimator? = null fun startAnim(context: Context, rl_top : RelativeLayout, rlSearch : LinearLayout, imageView : ImageView,tv_home : TextView?) { animEnd?.cancel() tv_home?.text = "搜索" initStartAnim(context,rl_top,rlSearch,imageView) animStart?.start() } private fun initStartAnim(context: Context, rl_top : RelativeLayout, rlSearch : LinearLayout, imageView : ImageView) { if (null != animStart){ return } val cvWidth = (RxDeviceTool.getScreenWidth(context) - RxImageTool.dip2px(73f)).toFloat() val dp105 = RxImageTool.dip2px(105f) val dp34 = RxImageTool.dip2px(34f) val dp15 = RxImageTool.dip2px(15f) val dp7 = RxImageTool.dip2px(7f) val dp5 = RxImageTool.dip2px(5f) animStart = ValueAnimator.ofFloat(1f, dp105 / cvWidth) animStart?.duration = 500// 设置动画运行的时长 animStart?.startDelay = 0// 设置动画延迟播放时间 animStart?.repeatCount = 0 // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 animStart?.repeatMode = ValueAnimator.RESTART // 设置重复播放动画模式 // ValueAnimator.RESTART(默认):正序重放 // ValueAnimator.REVERSE:倒序回放 // 步骤3:将改变的值手动赋值给对象的属性值:通过动画的更新监听器 // 设置 值的更新监听器 // 即:值每次改变、变化一次,该方法就会被调用一次 animStart?.addUpdateListener { animation -> // 获得改变后的值 val currentValue = animation.animatedValue as Float val lp = RelativeLayout.LayoutParams((cvWidth * currentValue).toInt(),dp34) lp.setMargins(dp15,dp7,dp15,dp5) // 步骤4:将改变后的值赋给对象的属性值,下面会详细说明 rlSearch.layoutParams = lp rl_top.invalidate() } animStart?.addListener(object : AnimatorListenerAdapter() { // override fun onAnimationEnd(animation: Animator) { // imageView.visibility = View.GONE // } override fun onAnimationStart(animation: Animator?) { imageView.visibility = View.GONE } }) } fun endAnim(context: Context, rl_top : RelativeLayout, rlSearch : LinearLayout, home_tv : TextView, imageView: ImageView,homeView : IHomeContract.View){ animStart?.cancel() initEndAnim(context,rl_top,rlSearch,home_tv,imageView,homeView) animEnd?.start() } fun initEndAnim(context: Context, rl_top : RelativeLayout, rlSearch : LinearLayout, home_tv : TextView, imageView: ImageView,homeView : IHomeContract.View) { if (null != animEnd){ return } val cvWidth = (RxDeviceTool.getScreenWidth(context) - RxImageTool.dip2px(73f)).toFloat() val dp105 = RxImageTool.dip2px(105f) val dp34 = RxImageTool.dip2px(34f) val dp15 = RxImageTool.dip2px(15f) val dp7 = RxImageTool.dip2px(7f) val dp5 = RxImageTool.dip2px(5f) animEnd = ValueAnimator.ofFloat(dp105 / cvWidth, 1f) animEnd?.duration = 500// 设置动画运行的时长 animEnd?.startDelay = 0// 设置动画延迟播放时间 animEnd?.repeatCount = 0 // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 animEnd?.repeatMode = ValueAnimator.RESTART // 设置重复播放动画模式 // ValueAnimator.RESTART(默认):正序重放 // ValueAnimator.REVERSE:倒序回放 // 步骤3:将改变的值手动赋值给对象的属性值:通过动画的更新监听器 // 设置 值的更新监听器 // 即:值每次改变、变化一次,该方法就会被调用一次 animEnd?.addUpdateListener { animation -> // 获得改变后的值 val currentValue = animation.animatedValue as Float val lp = RelativeLayout.LayoutParams((cvWidth * currentValue).toInt(),dp34) lp.setMargins(dp15,dp7,dp15,dp5) // 步骤4:将改变后的值赋给对象的属性值,下面会详细说明 rlSearch.layoutParams = lp rl_top.invalidate() } animEnd?.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { home_tv.text = homeView.getSearchContent() imageView.visibility = View.VISIBLE } }) } fun startSearchShow(ll_top_function : LinearLayout, searchBg : View, home_tv : TextView, iv_search_icon:ImageView,img_ad:View){ if (null == animSearchStart){ animSearchStart = ValueAnimator.ofFloat(0f, 1f) animSearchStart?.duration = 500// 设置动画运行的时长 animSearchStart?.startDelay = 0// 设置动画延迟播放时间 animSearchStart?.repeatCount = 0 // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 animSearchStart?.repeatMode = ValueAnimator.RESTART animSearchStart?.addUpdateListener { animation -> val currentValue = animation.animatedValue as Float ll_top_function.alpha = currentValue //更改搜索框背景透明度/搜索字体透明度/搜索图标透明度 // searchBg.alpha = (1-0.2*currentValue).toFloat() iv_search_icon.setColorFilter(Color.parseColor(ColorCalculateUtils.calculateColor("#FFB3B3B3", "#B8FFFFFF", currentValue))) home_tv.setTextColor(Color.parseColor(ColorCalculateUtils.calculateColor("#FF999999", "#A4FFFFFF", currentValue))) if (img_ad.visibility == View.VISIBLE){ searchBg.alpha = 1 - currentValue home_tv.alpha = 1 - currentValue }else{ searchBg.alpha = (1-0.8*currentValue).toFloat() home_tv.alpha = 1f } } } animSearchStart?.start() } fun startSearchHide(ll_top_function : LinearLayout, searchBg : View, home_tv : TextView, iv_search_icon:ImageView,img_ad:View){ if (null == animSearchEnd){ animSearchEnd = ValueAnimator.ofFloat(1f, 0f) animSearchEnd?.duration = 500// 设置动画运行的时长 animSearchEnd?.startDelay = 0// 设置动画延迟播放时间 animSearchEnd?.repeatCount = 0 // 设置动画重复播放次数 = 重放次数+1 // 动画播放次数 = infinite时,动画无限重复 animSearchEnd?.repeatMode = ValueAnimator.RESTART animSearchEnd?.addUpdateListener { animation -> val currentValue = animation.animatedValue as Float ll_top_function.alpha = currentValue //更改搜索框背景透明度/搜索字体透明度/搜索图标透明度 searchBg.alpha = (0.2+(0.8*(1-currentValue))).toFloat() iv_search_icon.setColorFilter(Color.parseColor(ColorCalculateUtils.calculateColor("#B8FFFFFF", "#FFB3B3B3", 1-currentValue))) home_tv.setTextColor(Color.parseColor(ColorCalculateUtils.calculateColor("#A4FFFFFF", "#FF999999", 1-currentValue))) if (img_ad.visibility == View.VISIBLE){ home_tv.alpha = 1-currentValue }else{ home_tv.alpha = 1f } } } animSearchEnd?.start() } fun clear(){ if (null != animStart){ animStart = null } if (null != animEnd){ animEnd = null } if (null != animSearchStart){ animSearchStart = null } if (null != animSearchEnd){ animSearchEnd = null } } } }