我怎样做我黑色球球跳动的游戏球移动

动图入门,制作简单的跳动小球。
来源:站酷
作者:cssj2012
在FLASH 和 AE横行的时代,相信很多平面设计师都在想
&我不会FLASH 不会AE 但是想做一些简单的东西,这个能用PS 完成吗?&
我回答是,简单的小动画 用PS是可以完成的。
下面,小编介绍一个简单的动画和操作方式,大家可以依次推理制作一些简单好玩的动画。
看上去很简单吧,来看看怎么制作的吧!
首先,用PS画好一个椭圆(这里稍微卖弄一下,根据动力学的原理,一般球状物下落是会有一个形变的,)然
后,在上面画三条竖线,代表有速度的下落,下面的直线作为一个平台。制作的时候最好把椭圆和三条竖线组成
一个组。命名为第一帧,方便后面做动画好找图层。
然后吧你刚刚成组的椭圆和三条竖线复制一个 命名为第二帧 然后吧第一帧隐藏起来 把位置向下移动一点
然后 吧第二帧的组在复制,命名为第三帧,这里要注意一点了当椭圆形下落到平台后,吧椭圆旋转90度,表示
这个椭圆是有一柔韧性的,显得比较活泼,然后,吧蓝色的线复制一个图层,吧蓝色线弯曲一点,也是体现柔韧性的
然后 吧第三帧的组在复制,命名为第四帧,这次先别急着吧平台还原,先把椭圆旋转回来,三条竖线不用要了。
然后 吧第四帧的组在复制,命名为第五帧,加上三条竖线,吧椭圆向上移动一点 第六帧也一样 复制第五帧,
然后向上移动一点就可以了。 然后隐藏所有的图层。
做好前面这些就是为了后面做动画就会非常方面了,下面开始见证奇迹的时刻吧。
窗口---动画
就会弹出一个动画(帧)的窗口,这个时候就可以制作动画了哦
首先,点开第一帧那个组的隐藏,然后,蓝色线条也点开,
然后点击一下那个复制所选帧,然后再点开第二帧,隐藏第一帧(一定要隐藏)。
同样的道理,先点击那个复制所选帧,吧第三帧显示出来,隐藏第二帧,吧蓝色直线隐藏,吧弯曲的蓝色线显示出来,后面的几帧都是一样的到底。
最终显示是这样的,现在开始验收成果了,哦也~~
点击播放键就可以看到动画了哦
动画播放的快慢可以调这里。
动画到这里就可以完结了!小伙伴们多多练习,自己也可以做好玩的动画!全教程完,学完记得交作业。教程对您有所帮助,请推荐给你的朋友。如果学会了,可以尝试投稿给我们,跟大家分享你的学习经验:
打开ps,跟着教程做一遍,做完的图要到这里交作业:
教程有看不懂的地方,可以到论坛发帖提问:
加官方微信,随时随地,想学就能学:ps_bbs,或扫右侧二维码!
关注我们微博:
想学更多的同学,可以订阅我们邮件,每天都有新教程发给你:
欢迎投稿教程:
22140人学习过
关于我们:P教(PS教程自学网的简称)成立于,成立已超十年,目前网站的全球网站排名(Alexa排名)13331位,日IP稳定5~6万,微博35万粉,公众号22万粉,是国内人气最高的教程分享网站之一。
免责声明:本站文章均由网友原创投稿或由网友转载自第三方,其版权归原作者所有,如出现资料错误或侵权,请通过邮箱联系修正或删除:android跳动的小球动画
平时对牛逼动画,高级UI,都深入的不多!近日,某头条,推了一个android技术类视频(平时在头条关注技术比较多),讲的是加载动画效果,是动脑学院讲的公开课,160分钟,我硬是拿着小手机看完了!边看,便记,然后整理了一下,规范了一下代码
做这个动画,需掌握:
1、属性动画
2、Path类、Canvas类
3、贝塞尔曲线
4、SurfaceView用法
5、自定义attr属性
6 、架构: 状态模式,控制器
7 、自由落体,抛物线等概念
不多说了,直接上码
1.DancingView.java
public class DancingView extends SurfaceView implements SurfaceHolder.Callback {
public static final int STATE_DOWN = 1;//向下状态
public static final int STATE_UP = 2;//向上状态
public static final int DEFAULT_POINT_RADIUS = 10;
public static final int DEFAULT_BALL_RADIUS = 13;
public static final int DEFAULT_LINE_WIDTH = 200;
public static final int DEFAULT_LINE_HEIGHT = 2;
public static final int DEFAULT_LINE_COLOR = Color.parseColor(&#FF9800&);
public static final int DEFAULT_POINT_COLOR = Color.parseColor(&#9C27B0&);
public static final int DEFAULT_BALL_COLOR = Color.parseColor(&#FF4081&);
public static final int DEFAULT_DOWN_DURATION = 600;//ms
public static final int DEFAULT_UP_DURATION = 600;//ms
public static final int DEFAULT_FREEDOWN_DURATION = 1000;//ms
public static final int MAX_OFFSET_Y = 50;//水平下降最大偏移距离
public int PONIT_RADIUS = DEFAULT_POINT_RADIUS;//小球半径
public int BALL_RADIUS = DEFAULT_BALL_RADIUS;//小球半径
private Paint mP
private Path mP
private int mLineC
private int mPonitC
private int mBallC
private int mLineW
private int mLineH
private float mDownD
private float mUpD
private float freeBallD
private ValueAnimator mDownC//下落控制器
private ValueAnimator mUpC//上弹控制器
private ValueAnimator mFreeDownC//自由落体控制器
private AnimatorSet animatorS
private boolean ismUpControllerDied =
private boolean isAnimationShowing =
private boolean isBounced =
private boolean isBallFreeUp =
public DancingView(Context context) {
super(context);
init(context, null);
public DancingView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
public DancingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
private void init(Context context, AttributeSet attrs) {
initAttributes(context, attrs);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(mLineHeight);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPath = new Path();
getHolder().addCallback(this);
initController();
private void initAttributes(Context context, AttributeSet attrs) {
TypedArray typeArray = context.obtainStyledAttributes(attrs, R.styleable.DancingView);
mLineColor = typeArray.getColor(R.styleable.DancingView_lineColor, DEFAULT_LINE_COLOR);
mLineWidth = typeArray.getDimensionPixelOffset(R.styleable.DancingView_lineWidth, DEFAULT_LINE_WIDTH);
mLineHeight = typeArray.getDimensionPixelOffset(R.styleable.DancingView_lineHeight, DEFAULT_LINE_HEIGHT);
mPonitColor = typeArray.getColor(R.styleable.DancingView_pointColor, DEFAULT_POINT_COLOR);
mBallColor = typeArray.getColor(R.styleable.DancingView_ballColor, DEFAULT_BALL_COLOR);
typeArray.recycle();
private void initController() {
mDownController = ValueAnimator.ofFloat(0, 1);
mDownController.setDuration(DEFAULT_DOWN_DURATION);
mDownController.setInterpolator(new DecelerateInterpolator());
mDownController.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
mDownDistance = MAX_OFFSET_Y * (float) animation.getAnimatedValue();
postInvalidate();
mDownController.addListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animation) {
state = STATE_DOWN;
public void onAnimationEnd(Animator animation) {
public void onAnimationCancel(Animator animation) {
public void onAnimationRepeat(Animator animation) {
mUpController = ValueAnimator.ofFloat(0, 1);
mUpController.setDuration(DEFAULT_UP_DURATION);
mUpController.setInterpolator(new DancingInterpolator());
mUpController.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
mUpDistance = MAX_OFFSET_Y * (float) animation.getAnimatedValue();
if (mUpDistance &= MAX_OFFSET_Y) {
//进入自由落体状态
isBounced =
if (!mFreeDownController.isRunning() && !mFreeDownController.isStarted() && !isBallFreeUp) {
mFreeDownController.start();
postInvalidate();
mUpController.addListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animation) {
state = STATE_UP;
public void onAnimationEnd(Animator animation) {
ismUpControllerDied =
public void onAnimationCancel(Animator animation) {
public void onAnimationRepeat(Animator animation) {
mFreeDownController = ValueAnimator.ofFloat(0, 8f);
mFreeDownController.setDuration(DEFAULT_FREEDOWN_DURATION);
mFreeDownController.setInterpolator(new DecelerateInterpolator());
mFreeDownController.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
//该公式解决上升减速 和 下降加速
float t = (float) animation.getAnimatedValue();
freeBallDistance = 40 * t - 5 * t *
if (ismUpControllerDied) {//往上抛,到临界点
postInvalidate();
mFreeDownController.addListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animation) {
isBallFreeUp =
public void onAnimationEnd(Animator animation) {
isAnimationShowing =
//循环第二次
startAnimations();
public void onAnimationCancel(Animator animation) {
public void onAnimationRepeat(Animator animation) {
animatorSet = new AnimatorSet();
animatorSet.play(mDownController).before(mUpController);
animatorSet.addListener(new Animator.AnimatorListener() {
public void onAnimationStart(Animator animation) {
isAnimationShowing =
public void onAnimationEnd(Animator animation) {
public void onAnimationCancel(Animator animation) {
public void onAnimationRepeat(Animator animation) {
* 启动动画,外部调用
public void startAnimations() {
if (isAnimationShowing) {
if (animatorSet.isRunning()) {
animatorSet.end();
animatorSet.cancel();
isBounced =
isBallFreeUp =
ismUpControllerDied =
animatorSet.start();
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 一条绳子用左右两部分的二阶贝塞尔曲线组成
mPaint.setColor(mLineColor);
mPath.reset();
mPath.moveTo(getWidth() / 2 - mLineWidth / 2, getHeight() / 2);
if (state == STATE_DOWN) {//下落
/**************绘制绳子开始*************/
//左部分 的贝塞尔
mPath.quadTo((float) (getWidth() / 2 - mLineWidth / 2 + mLineWidth * 0.375), getHeight() / 2 + mDownDistance,
getWidth() / 2, getHeight() / 2 + mDownDistance);
//右部分 的贝塞尔
mPath.quadTo((float) (getWidth() / 2 + mLineWidth / 2 - mLineWidth * 0.375), getHeight() / 2 + mDownDistance,
getWidth() / 2 + mLineWidth / 2, getHeight() / 2);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawPath(mPath, mPaint);
/**************绘制绳子结束*************/
/**************绘制弹跳小球开始*************/
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mBallColor);
canvas.drawCircle(getWidth() / 2, getHeight() / 2 + mDownDistance - BALL_RADIUS, BALL_RADIUS, mPaint);
/**************绘制弹跳小球结束*************/
} else if (state == STATE_UP) { //向上弹
/**************绘制绳子开始*************/
//左部分的贝塞尔
mPath.quadTo((float) (getWidth() / 2 - mLineWidth / 2 + mLineWidth * 0.375), getHeight() / 2 + 50 - mUpDistance,
getWidth() / 2,
getHeight() / 2 + (50 - mUpDistance));
//右部分的贝塞尔
mPath.quadTo((float) (getWidth() / 2 + mLineWidth / 2 - mLineWidth * 0.375), getHeight() / 2 + 50 - mUpDistance,
getWidth() / 2 + mLineWidth / 2,
getHeight() / 2);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawPath(mPath, mPaint);
/**************绘制绳子结束*************/
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(mBallColor);
//弹性小球,自由落体
if (!isBounced) {
canvas.drawCircle(getWidth() / 2, getHeight() / 2 + (MAX_OFFSET_Y - mUpDistance) - BALL_RADIUS, BALL_RADIUS, mPaint);
//自由落体
canvas.drawCircle(getWidth() / 2, getHeight() / 2 - freeBallDistance - BALL_RADIUS, BALL_RADIUS, mPaint);
mPaint.setColor(mPonitColor);
mPaint.setStyle(Paint.Style.FILL);
canvas.drawCircle(getWidth() / 2 - mLineWidth / 2, getHeight() / 2, PONIT_RADIUS, mPaint);
canvas.drawCircle(getWidth() / 2 + mLineWidth / 2, getHeight() / 2, PONIT_RADIUS, mPaint);
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = holder.lockCanvas();//锁定整个SurfaceView对象,获取该Surface上的Canvas.
draw(canvas);
holder.unlockCanvasAndPost(canvas);//释放画布,提交修改
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
public void surfaceDestroyed(SurfaceHolder holder) {
2.DancingInterpolator.java
public class DancingInterpolator implements Interpolator {
public float getInterpolation(float input) {
return (float) (1 - Math.exp(-3 * input) * Math.cos(10 * input));
3.自定义属性 styles.xml您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
maya基础动画实例:跳动的小球方案.ppt 39页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
·····
·········
调整小球弹跳重量感 此时再点播放按钮可再次观察小球运动情况,我们发现此时小球运动比较呆板。 怎么样才能给小球以生命力呢,这就需要用动动画中的绽放与拉伸的效果。 缩放与拉伸变形 在制作小球的缩放与拉伸动画时,一定要保持小球的体积不变,也就是说调节小球的缩放属性时,缩放前后小球的体积是不变的。 本例中小球的原体积数是3(即Scale X、 Scale Y、 Scale Z的总和为3)。
缩放与拉伸变形 回到前视图中,将时间滑块移动第9帧,在属性栏中将小球的Scale X(X轴缩放)、 Scale Y(Y轴缩放)、 Scale Z(Z轴缩放)属性分别调节为0.9,1.2,0.9。按S设置关键帧。 将时间滑块移动第10帧,在属性栏中将小球的Scale X(X轴缩放)、 Scale Y(Y轴缩放)、 Scale Z(Z轴缩放)属性分别调节为1.15,0.7,1.15。按S设置关键帧。 缩放与拉伸变形 将时间滑块移动第11帧,在属性栏中将小球的Scale X(X轴缩放)、 Scale Y(Y轴缩放)、 Scale Z(Z轴缩放)属性分别调节为0.9,1.2,0.9。按S设置关键帧。 如果数值无法保存,请单击右下角的
图标。 缩放与拉伸变形 将时间滑块移动第18帧,即小球弹跳的最高点处还原,在属性栏中将小球的Scale X(X轴缩放)、 Scale Y(Y轴缩放)、 Scale Z(Z轴缩放)属性分别调节为1,1,1。按S设置关键帧。
缩放与拉伸变形 以此类推,对小球进行压缩和拉伸操作,在接触地面前一帧进行拉伸,接触地面时进行压缩,再次起跳的第一帧进行拉伸,到达最高点时还原。按以下数值设置 小球的旋转动画 将时间滑块拖动到第1帧,在属性中设置Z轴旋转为-90,按S记录关键帧。 将时间滑块拖动到第10帧,在属性中设置Z轴旋转为-180,按S记录关键帧。 将时间滑块拖动到第18帧,在属性中设置Z轴旋转为-270,按S记录关键帧。
输出动画 单击选中小球,然后在时间轴上单击右键,选择播放预览后的小方框,如下图设置。 扫尾工作 完成后点输出动画,并保存当前场景。 这里小球的关键帧的位置及数值并不是一次设置完成的,需要在操作的过程中不断的调整,最后完善。 通常来说,为了测试动画时间安排是否合理需要生成一个影片文件来进行观察。 * MAYA我们的世界 跳动的小球 跳动的小球实例 Maya为用户提供了功能强大的动画制作工具,通过这些工具,用户可以自由地为对象的任何属性设置动画。 下面通过小球的弹跳动画,向大家介绍Maya动画制作的一般流程和方法。 小球的弹跳动画原理 制作小球弹跳动画,首先要考虑几点重要因素:球的轻重感、球的质地、球的大小及运动的速度。 不同质地的小球运动方式会有很大不同,如乒乓球和铁球。 以下以皮球为例来制作小球的弹跳动画。 小皮球弹跳的原理和运动规律 1、皮球从被抛出到最终落地是一个逐渐加速 的过程。 2、小皮球在弹跳的过程中,会发生压缩和伸展的变形。即下落时拉伸变形,与地面碰撞时压缩变形,弹起到达高点时回原状。 3、小球弹起的过程中,由于重力和空气阻力的作用,向上的运动速度变慢,就这样,小球不断重复向前弹起,但弹起高度越来越低,直到形变的作用力消失,各种力达到平衡,小球最终静止下来。 基本设置 由于本例制作的是一个动画,因此在开启Maya后首先需要设置场景的帧率。 首先确定该动画的最后输出形式:运行启动Maya软件,执行Window?Settings/Preferences?Preferences(窗口?设置/参数?参数) 基本设置 在Preferences(参数)窗口左侧的Categories(类别)中选择Settings(设置),这时右栏Working Units(工作单位)中列出当前Maya运行中所使用的各种单位,从Time(时间)参数下接列表中选择Film(24fps)[影片(每秒24帧)] 单击主界面右下角的动画首选项也可以。 基本设置 在Preferences(参数)窗口左侧类别中选择Animation(动画)在右栏中调节Default in tangent(默认入切线)和Default out tangent(默认出切线),它们均为clamped(钳制) 基本设置 接下来将播放速率改为实时播放。在Preferences(参数)窗口中选择左侧Categories(类别)中的Time Slider(时间滑块),然后在右侧将Playback(回放)中的Playback Speed(回放速度)改为Real-time(24fps)[实时(每秒24帧)],最后单击Save(保存),这样动画就可以实时播放了。 创建场景 下面开始创建动画。 单击Create?polygon primetive?Cube(创建?多
正在加载中,请稍后...
17页24页17页15页20页23页21页31页14页69页看着来球鞭长莫及?别慌,练好羽毛球启动小跳球场就是你的天下看着来球鞭长莫及?别慌,练好羽毛球启动小跳球场就是你的天下和小虫聊羽毛球百家号羽毛球场上,最让人郁闷的事情相比用三个字就可以概括—— “够不着”。对于身高马大的选手来说,很多球都可以依靠自己的身体条件强行去够,可是对于普通选手,能不能快速移动到位才是关键,所以启动速度在羽毛球运动中至关重要。而启动小跳就是你能不能够得到球的先决条件,任何上网步伐和后退步伐都是在启动小跳步之后发生的。启动小跳是衔接每一次完整步法之间的纽带,也是体现步法节奏的关键环节。正确的启动小跳能提前获得重心移动的动能,能最大限度、最合理的节约你的体力。今天我们就聊聊启动步,也就是启动小跳的动作要领。【动作要领】启动快速的基本就是重心不能死,无论是双脚在运动中,还是在原地等球时双脚都要在动。启动步前的移动小跳落地时,两脚分开,膝关节弯曲。这种姿势能帮助身体保持平衡。落地的时机把握在对手击球或刚刚击球后一瞬间。落地时两脚分开上身放松,重心在两脚之间,腰部略向前倾,重心此时放在两脚之间维持身体平衡。落地瞬间要蹬地,和地面接触的时间要短促,这样才能更快地移动出去。练习启动小跳的时候要注意,先落地的脚决定了移动的方向。为了保持平衡,刚开始两脚同时落地是可以的。但实际上,一只脚总是比另一只脚先落地。先落地的脚决定了移动的方向。左脚先落地,向右侧移动;右脚先落地,向左侧移动;前面的脚先落地,向后移动;后面的脚先落地,向前移动。对于初学者来说,如果对自己判断能力不那么自信,那就要等着球出拍的那一瞬间开始小跳,再向球的方向启动迈步。如果做出预判抓球路,容易抢到高点,争取到主动,但也有可能被对手一致的手法欺骗,不得已进行二次启动。对方出球后再小跳启动,时间略为滞后,减少被骗的可能性,但也同时难以抢到主动。这两者也需要你在练习中不断摸索,找到适合自己的节奏。羽毛球需要无限制的大范围移动,而启动步可以出现在场地的任何地方,帮助你更快地来到击球位置。对于初学者而言,启动小跳除了让你的移动加快之外,个人认为更重要的一点是让你的步法富有 “弹性”,而这一点甚至是决定你羽毛球能力的天花板。本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。和小虫聊羽毛球百家号最近更新:简介:羽球为媒,连接你我,羽乐共享作者最新文章相关文章

我要回帖

更多关于 flash跳动的球 的文章

 

随机推荐