AnimationDrawable使用实现跳跃动画
2016-02-26 13:55
246 查看
在网上看到有个实现跳跃动画的,感觉很不错
之前写了一个 小人在跑。
Drawable animation可以加载Drawable资源实现帧动画。AnimationDrawable是实现Drawable animations的基本类。推荐用XML文件的方法实现Drawable动画,不推荐在代码中实现。这种XML文件存放在工程中res/drawable/目录下。XML文件的指令(即属性)为动画播放的顺序和时间间隔。
首先是一个布局文件
可以看到3个button。一会会实现点击 做动作
然后是mainactivity类
之前写了一个 小人在跑。
Drawable animation可以加载Drawable资源实现帧动画。AnimationDrawable是实现Drawable animations的基本类。推荐用XML文件的方法实现Drawable动画,不推荐在代码中实现。这种XML文件存放在工程中res/drawable/目录下。XML文件的指令(即属性)为动画播放的顺序和时间间隔。
首先是一个布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFF"> <ImageView android:id="@+id/image" android:layout_width="150dp" android:layout_height="150dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:orientation="horizontal"> <Button android:id="@+id/btn_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="向左" /> <Button android:id="@+id/btn_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="向右" /> <Button android:id="@+id/btn_jump" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="跳跃" /> </LinearLayout> </RelativeLayout>
可以看到3个button。一会会实现点击 做动作
然后是mainactivity类
Button btn_left; Button btn_right; Button btn_jump; ImageView imageView; //Drawable animation可以加载Drawable资源实现帧动画。AnimationDrawable是实现Drawable animations的基本类。 // 推荐用XML文件的方法实现Drawable动画,不推荐在代码中实现。这种XML文件存放在工程中res/drawable/目录下。XML文件的指令(即属性)为动画播放的顺序和时间间隔。 AnimationDrawable drawable; Handler handler = new Handler(); //是否正在往左运动,是否正在往右运动,是否正在跳跃 private boolean isRidingLeft = false, isRidingRight = false, isJumping = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); getWindow().getDecorView().post(new Runnable() { @Override public void run() { //先加载一下帧动画资源,避免第一次加载的时候的卡顿 handler.post(new Runnable() { @Override public void run() { imageView.setBackgroundResource(R.drawable.riding); drawable = (AnimationDrawable) imageView.getBackground(); imageView.setBackgroundResource(R.drawable.jump); drawable = (AnimationDrawable) imageView.getBackground(); //然后加载 imageView.setBackgroundResource(R.mipmap.riding_0); imageView.animate().translationXBy(10000).setInterpolator(new LinearInterpolator()).setDuration(200000).rotationY(30).start(); // imageView.post(new Runnable() { // //这个实现了view一直做动画 // @Override // public void run() { // drawable.start(); // } // }); } }); } }); setListener(); btn_right.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!isJumping) { ride(); } isRidingRight = true; isRidingLeft = false; ride2Right(); break; case MotionEvent.ACTION_UP: if (!isRidingLeft) { imageView.animate().cancel(); } if (!isJumping && !isRidingLeft) { drawable.stop(); } isRidingRight = false; break; } return false; } }); btn_left.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!isJumping) { ride(); } isRidingLeft = true; isRidingRight = false; ride2Left(); break; case MotionEvent.ACTION_UP: if (!isRidingRight) { imageView.animate().cancel(); } if (!isJumping && !isRidingRight) { drawable.stop(); } isRidingLeft = false; break; } return false; } }); } private void setListener() { btn_jump.setOnClickListener(this); } private void initView() { btn_left = (Button) findViewById(R.id.btn_left); btn_right = (Button) findViewById(R.id.btn_right); btn_jump = (Button) findViewById(R.id.btn_jump); imageView = (ImageView) findViewById(R.id.image); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_jump: jump(); break; } } /** * 向左骑行 */ private void ride2Left() { imageView.animate().cancel(); //属性动画的简写 imageView.animate().translationXBy(-10000).setInterpolator(new LinearInterpolator()).setDuration(20000).start(); imageView.animate().setUpdateListener(MainActivity.this); } /** * 向右滑动 */ private void ride2Right() { //先取消之前的动画 imageView.animate().cancel(); imageView.animate().translationXBy(10000).setInterpolator(new LinearInterpolator()).setDuration(20000).start(); imageView.animate().setUpdateListener(MainActivity.this); } /** * 跳跃动画 */ private void jump() { imageView.setBackgroundResource(R.drawable.jump); drawable = (AnimationDrawable) imageView.getBackground(); if (drawable != null && !drawable.isRunning()) { drawable.stop(); drawable.start(); isJumping = true; //发送延迟消息 停止动画 handler.postDelayed(new Runnable() { @Override public void run() { isJumping = false; drawable.stop(); if (isRiding()) { ride(); } } }, 20 * 50); } } /** * 判断车子是否在运动 * * @return */ private boolean isRiding() { return isRidingLeft || isRidingRight; } /** * 骑行过程中的帧动画 */ private void ride() { imageView.setBackgroundResource(R.drawable.riding); drawable = (AnimationDrawable) imageView.getBackground(); if (drawable != null && !drawable.isRunning()) { drawable.start(); } } /** * 当自行车出了屏幕边界后,重新从另一面驶入 * * @param animation */ @Override public void onAnimationUpdate(ValueAnimator animation) { if (imageView.getTranslationX() > getWindow().getDecorView().getWidth() - 34) { //如果向右移动的X坐标大于 windoew的width ,让imageview从右进入移动 imageView.setTranslationX(-imageView.getWidth() + 70); ride2Right(); } else if (imageView.getTranslationX() < -imageView.getWidth() + 70) { //如果向左移动的X坐标小于 windoew的witdh ,就让从右进入 imageView.setTranslationX(getWindow().getDecorView().getWidth() - 34); ride2Left(); } }
相关文章推荐
- UVA 1643(p343)----Angles and Squares
- LDAP服务器搭建Linux
- iOS 之 UITableView 的多选和全部选择的功能
- Find Minimum in Rotated Sorted Array II
- 自动化交互脚本Expect简单介绍及应用实例
- SAS - Campaign QC
- iOS开发,定位当前所在地理位置偏移,坐标转换
- UVA 1642(p340)----Magical GCD
- 字符串转换成整数
- 绝对定位和相对定位
- SAS - Check Meta Tables
- 简说BASE64编码的应用
- RAID磁盘阵列术语详解
- Linux运维细讲之vim的基础使用
- netperf的安装及使用
- struts配置2
- UVA 1641(p337)----ASCII Area
- Line: 209 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:209:-1
- 逻辑漏洞(-)
- How to activate maven profile inside eclipse