android视频⾃动旋转,Android仿视频加载旋转⼩球动画效果的
实例代码
先上个效果图,以免⼤家跑错地了。
嗯,除了只能录三秒,其他没啥问题。
下⾯分析⼀下怎么实现上⾯这个效果。
理性分析后我们可以看到是⼏个⼩球绕着⼀个圆进⾏运动,那这⾥⾯的重点我们看看什么。
绘制五个球,没什么难度,让球绕圆进⾏运动,这个好像我们没有见到是怎么去实现了,那下就说这个。
从本质上看,球绕圆运动,其实我们可以看作是⼀个物体绕指定的路劲运动,那我们就有下⾯⼏个东西需要说⼀下:
1:Path
2:ValueAnimator
3:PathMeasure
前两个⼤家应该都见过,⼀个是路径,就是可以⾃⼰绘制路线的⼀个⼯具,⼀个是动画,⽤来指定物体运动的⼯具,那第三个是⼀个关于测量路径的类。
下⾯说说PathMeasure的⽤法。
⾸先是初始化:
pathMeasure = new PathMeasure(path, false);
两个参数第⼀个,第⼀个就是我们需要⽤到的路径,第⼆个参数意思就是这个以路径头尾是否相连来计算结果,通常我们就写false就⾏,不会有问题。
然后是⽤法:
private float[] mCurrentPositionOne = new float[2];
float value = (Float)
我们可以看见把⼀个⼆维数组放到了getPosTan这个⽅法⾥⾯,然后还有⼀个animation,这⾥的animation来⾃哪⾥呢?来⾃这⾥:valueAnimatorOne.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前点坐标封装到mCurrentPosition
float value = (Float) AnimatedValue();
canvas动画postInvalidate();
}
});
看见没,是动画的监听⾥⾯来的,getPosTan的最后⼀个参数通常也就写null就⾏了,那么这整个⼀⾏的代码意思就是当动画发⽣了变化,就执⾏这⾏代码,然后这⾏代码会把这个时间点的路径上的坐标赋值给mCurrentPositionOne。
那我们获取到看这个路径上的坐标点怎么办呢?
⽴马⽤来ondraw⾥⾯啊,我的⼩球此时就可以根据这个坐标点去绘制⾃⼰的位置,这个的话,当动画开始时,⼩球就会不断接受新的坐标,然后不断重绘,最终产⽣旋转⼩球的效果。
我先把属性动画的代码贴出来:
if (valueAnimatorOne == null) {
valueAnimatorOne = ValueAnimator.ofFloat(0, Length());
valueAnimatorOne.setDuration(800);
// 减速插值器
valueAnimatorOne.setInterpolator(new DecelerateInterpolator());
valueAnimatorOne.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 获取当前点坐标封装到mCurrentPosition
float value = (Float) AnimatedValue();
postInvalidate();
}
});
valueAnimatorOne.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animator) {
finishAnimateOne = 1;
}
@Override
public void onAnimationEnd(Animator animator) {
finishAnimateOne = 0;
}
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationRepeat(Animator animator) {
}
});
}
valueAnimatorOne.start();
我写了个800,也就是动画的维持时间,但是我们发现有啊后⼏个⼩球,所以我们需要绘制好⼏个⼩球,然后给他们不同的动画,为什么呢?因为动画都⼀样,⼩球就叠加在⼀起了,我们就只能看见⼀个球了。
说到这⾥的话,我们的⽬标算时完成了,具体的操作,⼤家参考以下代码,或者去:android⾃定义View索引
⾥⾯动画的demo进⾏下载,⼤家随意,下⾯给出代码:
/**
* 仿视频加载动画,旋转的蓝⾊⼩球
*/
public class RotaryBall extends View {
private Path rotationPath;
private float radius;
private Paint circlePaintOne;
private PathMeasure pathMeasure;
private int finishAnimateOne = 0; // ⽤来判断当前动画有没有开始
private int finishAnimateTwo = 0; // ⽤来判断当前动画有没有开始
private int finishAnimateThree = 0; // ⽤来判断当前动画有没有开始
private int finishAnimateFour = 0; // ⽤来判断当前动画有没有开始
private int finishAnimateFive = 0; // ⽤来判断当前动画有没有开始
private Handler handler;
private float[] mCurrentPositionOne = new float[2];
private float[] mCurrentPositionTwo = new float[2];
private float[] mCurrentPositionThree = new float[2];
private float[] mCurrentPositionFour = new float[2];
private float[] mCurrentPositionFive = new float[2];
private ValueAnimator valueAnimatorOne = null;
private ValueAnimator valueAnimatorTwo = null;
private ValueAnimator valueAnimatorThree = null;
private ValueAnimator valueAnimatorFour = null;
private ValueAnimator valueAnimatorFive = null;
private int currentStatus = -1; //-1表⽰第⼀次运⾏,0表⽰动画结束或者没开始,1表⽰正在运动中private boolean animateOrNot = true; //⽤来决定是否开启动画
public RotaryBall(Context context) {
super(context);
initData();
}
public RotaryBall(Context context, AttributeSet attrs) {
super(context, attrs);
initData();
}
private void initData() {
rotationPath = new Path();
circlePaintOne = new Paint();
circlePaintOne.setColor(Color.BLUE);
circlePaintOne.setAntiAlias(true);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 4:
if (finishAnimateOne == 0) {
startAnimatorOne();
}
if (finishAnimateTwo == 0) {
startAnimatorTwo();
}
if (finishAnimateThree == 0) {
startAnimatorThree();
}
if (finishAnimateFour == 0) {
startAnimatorFour();
}
if (finishAnimateFive == 0) {
startAnimatorFive();
}
currentStatus = 0;
}
}
};
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
radius = getMeasuredWidth() / 2;
}
@Override
protected void onDraw(Canvas canvas) {
// rotationPath.addCircle(radius, radius, radius - 10, CW);
rotationPath.cubicTo(radius, 0 + 10, radius * 2 - 10, 0 + 10, radius * 2 - 10, radius);
rotationPath.cubicTo(radius * 2 - 10, radius, radius * 2 - 10, radius * 2 - 10, radius, radius * 2 - 10); rotationPath.cubicTo(radius, radius * 2 - 10, 0 + 10, radius * 2 - 10, 0 + 10, radius);
rotationPath.cubicTo(0 + 10, radius, 0 + 10, 0 + 10, radius, 0 + 10);
rotationPath.close();
pathMeasure = new PathMeasure(rotationPath, false);
//下⾯绘制不同半径的⼩圆
canvas.drawCircle(mCurrentPositionOne[0], mCurrentPositionOne[1], 10, circlePaintOne); canvas.drawCircle(mCurrentPositionTwo[0], mCurrentPositionTwo[1], 9, circlePaintOne);
canvas.drawCircle(mCurrentPositionThree[0], mCurrentPositionThree[1], 7, circlePaintOne);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论