美文网首页Android知识首页投稿(暂停使用,暂停投稿)半栈工程师
自定义View+Animation仿真实现小球自由落体+弹跳效果

自定义View+Animation仿真实现小球自由落体+弹跳效果

作者: luckyyyyou | 来源:发表于2017-09-15 14:44 被阅读0次

昨天在郭神的公众号推送里看到了一篇关于小球自由落体动画加载控件的文章推送,就琢磨着班门弄斧做一个小球自由落体动画,适合刚接触自定义View和动画的童鞋学习。


1.知识储备

1.1自定义View

我们知道自定义View主要涉及两个过程,测量和绘制,也就是简单地重写onMeasure()(不过只需要在宽高设定为wrap-content时重写)和onDraw()方法,接下来就自由发挥画出自己想要的效果,详细的方法可以参照我的初探自定义View(一)初探自定义View(二)

1.2自定义动画

自定义动画涉及的方法也是主要就两个:

1.2.1applyTransformation(float interpolatedTime, Transformation t)

这个方法是自定义动画的核心方法,定义了动画进行的整个过程。第一个参数interpolatedTime是插值器的时间因子(可以理解成物理中的加速度),决定了这个动画从开始到结束完成过程中的加速度,第二个参数Transformation是矩阵的封装类,一般使用这个类来获得当前的矩阵对象(当前操作的View),然后对该对象进行操作就能实现各种动画效果。

1.2.2initialize(int width, int height, int parentWidth, int parentHeight)

这个方法主要是通过覆写父类的initialize()来进行一些初始化工作。

2.实现过程

2.1小球的绘制

public void init(){
        //初始化
        mCirclePaint=new Paint();
        mCirclePaint.setColor(Color.RED);
        mCirclePaint.setStyle(Paint.Style.FILL);
    }
    //绘制
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.drawCircle(x,y,r,mCirclePaint);
    }

    @Override
    protected void onSizeChanged(int w,int h,int oldW,int oldH){
        super.onSizeChanged(w,h,oldW,oldH);
        length = w;  //这里的w指的是在xml文件中设定的宽度width的值
        //确定圆心坐标和半径
        x = length/2;
        y = length/8;
        r = (float) (length*0.5/8);
    }

添加到布局文件中:

    <com.example.animation.Ball
        android:id="@+id/ball"
        android:layout_width="400dp"
        android:layout_height="400dp" />

经过上述过程小球就画好了,如图:

小球

2.2动画效果的实现

public class OpenGL extends Animation {

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(2000);// 设置默认时长
        setFillAfter(true);// 动画结束后保留状态
        setInterpolator(new BounceInterpolator());// 设置插值器
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final Matrix matrix = t.getMatrix();
        matrix.preTranslate(0,700 * interpolatedTime);
    }
}

首先覆写父类的initialize()方法进行初始化setInterpolator(new BounceInterpolator());这个方法是这个实现自由落体效果的关键,BounceInterpolator这个插值器的取值为0-1,而且从0变到1的速度越来越快,可以理解成物理场景中的匀加速运动,而且在结束后还有一个弹跳的效果。
更多插值器效果
matrix.preTranslate(0,1000 * interpolatedTime);这个可以理解成View的实时坐标(x,y),注意这里的x其实是Δx,表示View在移动前的坐标和移动过程中的差值,0就代表这是一个竖直方向上的运动。

final OpenGL open=new OpenGL();
        ball.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ball.startAnimation(open);
            }
        });

最后调用这个动画类的实例就能实现这一效果:

动画效果

源码

Github

相关文章

  • 自定义View+Animation仿真实现小球自由落体+弹跳效果

    昨天在郭神的公众号推送里看到了一篇关于小球自由落体动画加载控件的文章推送,就琢磨着班门弄斧做一个小球自由落体动画,...

  • 物理仿真

    物理仿真就比较有意思了,之前很火的愤怒的小鸟就是全部用物理仿真完成的,使用物理仿真可以实现弹跳,重力,吸附等效果

  • 简单实现弹跳小球

    作品来自《动手玩转scratch2.0编程》里的教程。文章记录学习成长过程。如有错误和不足,请各位指出。 ...

  • scratch实现弹跳小球2

    前言:在上一个作品做了一些改进和增添。让整个游戏更加好玩。上个作品链接地址如下 scratch实现弹跳小球1 1....

  • Canvas<小球自由落体效果>

    效果图: 此效果参考他人代码,并加以注释和改造,想直接看源地址效果的话,可直接点击下方链接 参考地址:http:/...

  • [Android动画]属性动画-小球下落动画实现3

    前言 这篇文章是一个小球无限弹跳的动画效果,不说废话直接上效果吧 效果 代码 UI:R.layout.fragme...

  • AE效果 01丨小球弹跳教程

    Lynda - 小球弹跳动画AE教程 这两天在做一个跟球类运动相关的项目,就找到了这个教程。 不用借助三维软件,直...

  • 鼠标酷炫特效--小球

    实现效果: 首先要引入vue.js html代码: 调节小球大小、自定义绘制图代码: 来源:https://blo...

  • python小游戏学习笔记1

    一个简单的小球弹跳。。 来个标准模版:

  • Animation随记

    最终实现的小球效果: Evaluator 加速器 ValueAnimator与ObjectAnimator

网友评论

    本文标题:自定义View+Animation仿真实现小球自由落体+弹跳效果

    本文链接:https://www.haomeiwen.com/subject/evmrsxtx.html