前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >D5-Android绘图之让图形动起来

D5-Android绘图之让图形动起来

作者头像
张风捷特烈
发布2018-09-29 11:20:51
5590
发布2018-09-29 11:20:51
举报

以前在Html利用js控制SVG或canvas进行运动模拟。浏览器自带window.requestAnimationFrame能不断执行渲染 在这使用我的LogicCanvas中的NumGo进行不断渲染工作,用法详见: 绘图部分基于我的LogicCanvas绘图库:基础使用在此, 喜欢的话可以到项目的github上看看,顺便给个star 如果此篇看起来有些困难,可以先看一下其他D系列文章,尤其是:D4-Android绘图之和我一起画箭头 本篇将介绍:反弹、自由落体、平抛、斜抛的物理场景模拟


一、反弹

效果.gif

1.构造函数初始化时:核心就是:位移=时间*速度
代码语言:javascript
复制
//创建一个水平速度向量对象,并赋值水平速度为100px/s,竖直速度50px/s
mVA = v2(100, -50);
//创建一个位移向量对象
mSA = v2(0, 0);

mRunNum = new NumGo(false, 0, 100000).setOnUpdate(new NumGo.OnUpdate() {
    @Override
    public void onUpdate(float rate) {
        long frameTime = System.currentTimeMillis();
        float detaT = frameTime - lastFrameTime;//时间变化量
        Pos detaS = mVA.dotC(detaT / 500);//位移增量=速度*时间变化量
        Pos detaSB = mVB.dotC(detaT / 500);//位移增量=速度*时间变化量
        mSA = mSA.add(detaS);//位移总量 = 位移增量和
        mSB = mSB.add(detaSB);//位移总量 = 位移增量和
        //区域限定
        if (mSA.x > 200 || mSA.x < -200) {
            mVA = mVA.refX();//x反弹
            mAColor = ColUtils.randomRGB();//随机色
        }
        if (mSA.y > 200 || mSA.y < -200) {
            mVA = mVA.refY();//Y反弹
            mAColor = ColUtils.randomRGB();
        }
        
        invalidate();
        lastFrameTime = frameTime;//时刻更新
    }
});
2.成员变量:
代码语言:javascript
复制
    Pos coo = v2(500, 600);
    private NumGo mRunNum;
    private long lastFrameTime;
    private Pos mVA;
    private Pos mSA;
    private Shape mFA;
    private int mBColor = Color.RED;
    private int mAColor = Color.BLUE;
2.抬起的事件:启动mRunNum
代码语言:javascript
复制
lastFrameTime = System.currentTimeMillis();
mRunNum.go();
3.绘制的方法:OnDraw中:
代码语言:javascript
复制
        Painter painter = PainterEnum.INSTANCE.getInstance(canvas);
        mFA = sa.deepClone().r(20).ang(360).fs(mAColor).p(mSA).coo(coo);//绘制小球
        //绘制矩形区域
        Shape fr = new ShapeRect().x(440).y(440).r(1).fs(0x66B8F8F0).coo(coo).p(-220, -220);
        painter.draw(fr, mFA);

二、自由落体:

自由落体.gif

加入加速度向量,初速度设为0:
代码语言:javascript
复制
 mG = v2(0, -10);
 mV = v2(0, 0);
处理位移时将加速度叠加到速度上
代码语言:javascript
复制
Pos detaV = mG.dotC(detaT);//速度变化量
mV = mV.add(detaV);//速度增量和

三、平抛运动:

平抛运动.gif

增加水平初速度
代码语言:javascript
复制
 mV = v2(3000, 0);

四、斜抛运动:

斜抛运动.gif

代码语言:javascript
复制
mV = v2(3000, -5000);//倾斜初速度

后记、
1.声明:

1本文由张风捷特烈原创,转载请注明

2欢迎广大编程爱好者共同交流

3个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正

4你的喜欢与支持将是我最大的动力

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、反弹
    • 1.构造函数初始化时:核心就是:位移=时间*速度
      • 2.成员变量:
        • 2.抬起的事件:启动mRunNum
          • 3.绘制的方法:OnDraw中:
          • 二、自由落体:
            • 加入加速度向量,初速度设为0:
              • 处理位移时将加速度叠加到速度上
              • 三、平抛运动:
                • 增加水平初速度
                • 四、斜抛运动:
                • 后记、
                  • 1.声明:
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档