1
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"minSdkVersion": "21"
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
// import UniversalBlurHelper from 'uts.sdk.modules.utsXdBlur.UniversalBlurHelper';
|
||||
import Color from 'android.graphics.Color';
|
||||
import { hexToRgb } from '../libs/color.uts'
|
||||
import View from 'android.view.View';
|
||||
|
||||
import xdAnimation from 'uts.sdk.modules.utsXdxdAnimation.xdAnimation';
|
||||
import {XDANIMATION_FLIP3D_OPTIONS,XDANIMATION_TRANSLATE_OPTIONS,XDANIMATION_ROTATE_OPTIONS,XDANIMATION_SCALE_OPTIONS} from "../interface.uts"
|
||||
|
||||
|
||||
export class xAnimationS {
|
||||
public static translate(opts:XDANIMATION_TRANSLATE_OPTIONS){
|
||||
if(opts.ele == null) return
|
||||
let view = (opts.ele as UniElement).getAndroidView()! as View
|
||||
let duration_s = (opts?.duration??1000).toLong()
|
||||
let delay_s = (opts?.delay??0).toLong()
|
||||
let translation_s = (opts?.translation??0).toInt()
|
||||
let fromlen_s = (opts?.from??360).toFloat()
|
||||
let len_s = (opts?.len??360).toFloat()
|
||||
let loop_s = (opts?.loop??0).toInt()
|
||||
xdAnimation.translate(view,duration_s,delay_s,translation_s,fromlen_s,len_s,loop_s,opts?.start,opts?.end)
|
||||
}
|
||||
public static rotate(opts:XDANIMATION_ROTATE_OPTIONS){
|
||||
if(opts.ele == null) return
|
||||
let view = (opts.ele as UniElement).getAndroidView()! as View
|
||||
let duration_s = (opts?.duration??1000).toLong()
|
||||
let delay_s = (opts?.delay??0).toLong()
|
||||
let from_s = (opts?.from??0).toFloat()
|
||||
let deg_s = (opts?.deg??360).toFloat()
|
||||
let loop_s = (opts?.loop??0).toInt()
|
||||
xdAnimation.rotate(view,duration_s,delay_s,from_s,deg_s,loop_s,opts?.start,opts?.end)
|
||||
}
|
||||
public static scale(opts:XDANIMATION_SCALE_OPTIONS){
|
||||
if(opts.ele == null) return
|
||||
let view = (opts.ele as UniElement).getAndroidView()! as View
|
||||
let duration_s = (opts?.duration??1000).toLong()
|
||||
let delay_s = (opts?.delay??0).toLong()
|
||||
let direction_s = (opts?.direction??2).toInt()
|
||||
let scale_s = (opts?.scale??1).toFloat()
|
||||
let from_s = (opts?.from??0).toFloat()
|
||||
|
||||
let loop_s = (opts?.loop??0).toInt()
|
||||
xdAnimation.scale(view,duration_s,delay_s,direction_s,from_s,scale_s,loop_s,opts?.start,opts?.end)
|
||||
}
|
||||
public static flip3D(opts:XDANIMATION_FLIP3D_OPTIONS){
|
||||
if(opts.ele == null) return
|
||||
let view = (opts.ele as UniElement).getAndroidView()! as View
|
||||
let duration_s = (opts?.duration??1000).toLong()
|
||||
let delay_s = (opts?.delay??0).toLong()
|
||||
let axis_s = (opts?.axis??1).toInt()
|
||||
let from_s = (opts?.from??0).toFloat()
|
||||
let deg_s = (opts?.deg??360).toFloat()
|
||||
let loop_s = (opts?.loop??0).toInt()
|
||||
let cameraDistance_s = (opts?.cameraDistance??12).toFloat()
|
||||
let scaleZ_s = (opts?.scaleZ??0.5).toFloat()
|
||||
xdAnimation.flip3D(view,duration_s,delay_s,axis_s,from_s,deg_s,loop_s,cameraDistance_s,scaleZ_s,opts?.start,opts?.end)
|
||||
}
|
||||
public static clearAnimations(ele:UniElement|null,reset:boolean = true){
|
||||
if(ele == null) return
|
||||
let view = (ele as UniElement).getAndroidView()! as View
|
||||
xdAnimation.clearAnimations(view,reset)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
package uts.sdk.modules.utsXdxdAnimation
|
||||
|
||||
|
||||
import android.view.View
|
||||
import android.animation.ObjectAnimator
|
||||
import android.animation.Animator
|
||||
import android.animation.AnimatorInflater
|
||||
import android.graphics.Path
|
||||
import android.animation.AnimatorSet
|
||||
import android.animation.AnimatorListenerAdapter
|
||||
import android.animation.TimeInterpolator
|
||||
import android.view.animation.LinearInterpolator
|
||||
import android.animation.ValueAnimator
|
||||
|
||||
class xdAnimation private constructor() {
|
||||
val runningAnimators = mutableListOf<Animator>()
|
||||
companion object {
|
||||
|
||||
// 平移动画
|
||||
fun translate(
|
||||
view: View,
|
||||
duration: Long = 1000,
|
||||
delay: Long = 0,
|
||||
translation : Int = 0, //0平行移x,1平移y,2平移x,y
|
||||
fromLen:Float = 0f,
|
||||
len:Float = 0f,
|
||||
loop: Int = 0,
|
||||
start: (() -> Unit)? = null,
|
||||
end: (() -> Unit)? = null
|
||||
) {
|
||||
|
||||
val animator = when (translation) {
|
||||
1 -> { // Y轴平移
|
||||
ObjectAnimator.ofFloat(view, "translationY", fromLen, len)
|
||||
}
|
||||
2 -> { // XY轴同时平移
|
||||
val path = Path().apply {
|
||||
moveTo(fromLen, fromLen)
|
||||
lineTo(len, len)
|
||||
}
|
||||
ObjectAnimator.ofFloat(view, View.X, View.Y, path)
|
||||
}
|
||||
else -> { // X轴平移
|
||||
ObjectAnimator.ofFloat(view, "translationX", fromLen, len)
|
||||
}
|
||||
}
|
||||
// animator.repeatMode = ObjectAnimator.RESTART
|
||||
if (loop == -1) {
|
||||
animator.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
animator.repeatCount = loop
|
||||
}
|
||||
|
||||
animator.duration = duration
|
||||
animator.startDelay = delay
|
||||
animator.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
}
|
||||
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
animator.start()
|
||||
}
|
||||
|
||||
// 旋转动画
|
||||
fun rotate(
|
||||
view: View,
|
||||
duration: Long = 1000,
|
||||
delay: Long = 0,
|
||||
fromDeg: Float = 0f,
|
||||
deg: Float = 360f,
|
||||
loop: Int = 0,
|
||||
start: (() -> Unit)? = null,
|
||||
end: (() -> Unit)? = null
|
||||
) {
|
||||
val animator = ObjectAnimator.ofFloat(view, "rotation", fromDeg, deg)
|
||||
animator.repeatMode = ObjectAnimator.RESTART
|
||||
if (loop == -1) {
|
||||
animator.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
animator.repeatCount = loop
|
||||
}
|
||||
|
||||
animator.interpolator = LinearInterpolator()
|
||||
animator.duration = duration
|
||||
animator.startDelay = delay
|
||||
animator.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
animator.start()
|
||||
// runningAnimators.add(animator)
|
||||
}
|
||||
|
||||
// 3D翻转动画
|
||||
fun flip3D(
|
||||
view: View,
|
||||
duration: Long = 1000,
|
||||
delay: Long = 0,
|
||||
axis: Int = 1, // 0: X轴, 1: Y轴
|
||||
fromDeg: Float = 0f, // 旋转角度
|
||||
deg: Float = 180f, // 旋转角度
|
||||
loop: Int = 0,
|
||||
cameraDistance: Float = 8f, // 控制视角距离,默认值更合理
|
||||
scaleZ: Float = 0.8f, // 控制Z轴缩放,默认值更自然
|
||||
start: (() -> Unit)? = null,
|
||||
end: (() -> Unit)? = null
|
||||
) {
|
||||
view.pivotX = if (axis == 0) view.width / 2f else view.pivotX
|
||||
view.pivotY = if (axis == 1) view.height / 2f else view.pivotY
|
||||
|
||||
val rotateProperty = if (axis == 0) "rotationX" else "rotationY"
|
||||
val rotateFrom = fromDeg
|
||||
val rotateTo = deg
|
||||
|
||||
val rotateAnimator = ObjectAnimator.ofFloat(view, rotateProperty, rotateFrom, rotateTo)
|
||||
val scaleZAnimator = ObjectAnimator.ofFloat(view, "scale", scaleZ, scaleZ)
|
||||
|
||||
rotateAnimator.repeatMode = ObjectAnimator.RESTART
|
||||
if (loop == -1) {
|
||||
rotateAnimator.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
rotateAnimator.repeatCount = loop
|
||||
}
|
||||
|
||||
val animatorSet = AnimatorSet()
|
||||
animatorSet.playTogether(rotateAnimator, scaleZAnimator)
|
||||
animatorSet.duration = duration
|
||||
animatorSet.startDelay = delay
|
||||
|
||||
animatorSet.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
// 使用传入的参数控制摄像机距离
|
||||
view.cameraDistance = view.width * cameraDistance
|
||||
}
|
||||
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
|
||||
animatorSet.start()
|
||||
}
|
||||
|
||||
/**
|
||||
* 清除视图上的所有动画
|
||||
* @param view 需要清除动画的视图
|
||||
* @param reset 是否重置视图属性到初始状态
|
||||
*/
|
||||
fun clearAnimations(
|
||||
view: View,
|
||||
reset: Boolean = true
|
||||
) {
|
||||
view.animate().cancel()
|
||||
view.clearAnimation()
|
||||
|
||||
// 如果需要重置视图属性
|
||||
if (reset) {
|
||||
// 重置所有变换
|
||||
view.translationX = 0f
|
||||
view.translationY = 0f
|
||||
view.scaleX = 1f
|
||||
view.scaleY = 1f
|
||||
view.rotation = 0f
|
||||
view.rotationX = 0f
|
||||
view.rotationY = 0f
|
||||
view.alpha = 1f
|
||||
// 重置视角距离
|
||||
view.cameraDistance = 0f
|
||||
}
|
||||
}
|
||||
|
||||
fun scale(
|
||||
view: View,
|
||||
duration: Long = 1000,
|
||||
delay: Long = 0,
|
||||
direction: Int = 0, // 0: 水平缩放, 1: 竖直翻转,2:x,y缩放,
|
||||
fromScale: Float = 0f,
|
||||
scale: Float = 1f,
|
||||
loop: Int = 0,
|
||||
start: (() -> Unit)? = null,
|
||||
end: (() -> Unit)? = null
|
||||
) {
|
||||
when (direction) {
|
||||
1 -> { // Y轴缩放
|
||||
val scaleY = ObjectAnimator.ofFloat(view, "scaleY", fromScale, scale)
|
||||
scaleY.duration = duration
|
||||
scaleY.startDelay = delay
|
||||
// scaleY.interpolator = LinearInterpolator()
|
||||
if (loop == -1) {
|
||||
scaleY.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
scaleY.repeatCount = loop
|
||||
}
|
||||
scaleY.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
scaleY.start()
|
||||
}
|
||||
2 -> { // XY轴同时缩放
|
||||
val scaleX = ObjectAnimator.ofFloat(view, "scaleX", fromScale, scale)
|
||||
val scaleY = ObjectAnimator.ofFloat(view, "scaleY", fromScale, scale)
|
||||
|
||||
// 为每个动画单独设置循环
|
||||
if (loop == -1) {
|
||||
scaleX.repeatCount = ObjectAnimator.INFINITE
|
||||
scaleY.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
scaleX.repeatCount = loop
|
||||
scaleY.repeatCount = loop
|
||||
}
|
||||
|
||||
val animatorSet = AnimatorSet()
|
||||
animatorSet.playTogether(scaleX, scaleY)
|
||||
animatorSet.duration = duration
|
||||
animatorSet.startDelay = delay
|
||||
// animatorSet.interpolator = LinearInterpolator()
|
||||
animatorSet.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
animatorSet.start()
|
||||
}
|
||||
else -> { // X轴缩放
|
||||
val scaleX = ObjectAnimator.ofFloat(view, "scaleX", fromScale, scale)
|
||||
// scaleX.interpolator = LinearInterpolator()
|
||||
scaleX.duration = duration
|
||||
scaleX.startDelay = delay
|
||||
if (loop == -1) {
|
||||
scaleX.repeatCount = ObjectAnimator.INFINITE
|
||||
} else {
|
||||
scaleX.repeatCount = loop
|
||||
}
|
||||
scaleX.addListener(object : AnimatorListenerAdapter() {
|
||||
override fun onAnimationStart(animation: Animator) {
|
||||
start?.invoke()
|
||||
}
|
||||
override fun onAnimationEnd(animation: Animator) {
|
||||
end?.invoke()
|
||||
}
|
||||
})
|
||||
scaleX.start()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user