补间动画基础备忘(3)

举报
ShaderJoy 发表于 2021/12/29 23:06:19 2021/12/29
【摘要】 振动效果: Android SDK提供了linear_interpolator、accelerate_interpolator、decelerate_interpolator、accelerator_decelerate_interpolator,其实还有一个cycle_interpolator,可以将它作为振动动画渲染器。由于其未在...

振动效果:

Android SDK提供了linear_interpolator、accelerate_interpolator、decelerate_interpolator、accelerator_decelerate_interpolator,其实还有一个cycle_interpolator,可以将它作为振动动画渲染器。由于其未在系统中定义,因此需要自己编写cycle_interpolator.xml文件,内容如下:


  
  1. <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:cycles="18" />

还有一个动画文件shake.xml,内容如下


  
  1. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:duration="1000"
  3. android:fromXDelta="0"
  4. android:interpolator="@anim/cycle_interpolator"
  5. android:toXDelta="10" />

public CycleInterpolator(float cycles)
 


  
  1. public class Main extends Activity implements OnClickListener
  2. {
  3. @Override
  4. public void onClick(View view)
  5. {
  6. Animation animation = AnimationUtils.loadAnimation(this, R.anim.shake);
  7. EditText editText = (EditText)findViewById(R.id.edittext);
  8. editText.startAnimation(animation);
  9. }
  10. @Override
  11. public void onCreate(Bundle savedInstanceState)
  12. {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.main);
  15. Button button = (Button) findViewById(R.id.button);
  16. button.setOnClickListener(this);
  17. }
  18. }

自定义的动画渲染器:

实际上,我们也可以自己定义动画渲染器。要实现动画渲染器,需要实现Interpolator接口。示例实现了一个可以来回弹跳的动画渲染器。
渲染器的代码如下:

   
  1. public class MyInterceptor implements Interpolator
  2. {
  3. @Override
  4. public float getInterpolation(float input)
  5. {
  6. if (input <= 0.5)
  7. return input * input;
  8. else
  9. return (1 - input) * (1 - input) ;
  10. }
  11. }
在Interpolator接口中只有一个getInterpolation方法。该方法有一个float类型的参数,取值范围在0.0~1.0之间,表示动画的进度。如果该值为0.0。表示动画刚开始。如果参数值为1.0,表示动画已结束。如果getInterpolation方法的返回值小于1.0,则表示动画对象还没有到达目标点,越接近1.0。目标对象离目标点越近,当返回值为1.0的时候,正好到达目标点。如果getInterpolation方法的返回值大于1.0,表示动画对象超过了目标点。例如在等移动补间动画中,getInterpolation方法的返回值是2.0,表示动画对象超过了目标点,并且距目标点的距离等于目标点到起点的距离。
下面是translate.xml文件的内容:

   
  1. <translate xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:duration="5000"
  3. android:fromXDelta="0"
  4. android:fromYDelta="0"
  5. android:toXDelta="0"
  6. android:toYDelta="1550" />

装载和开始动画

   
  1. public class Main extends Activity
  2. {
  3. @Override
  4. public void onCreate(Bundle savedInstanceState)
  5. {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.main);
  8. ImageView imageView = (ImageView)findViewById(R.id.imageview);
  9. Animation animation = AnimationUtils.loadAnimation(this, R.anim.translate);
  10. animation.setInterpolator(new MyInterceptor());//装在自定义动画渲染器
  11. animation.setRepeatCount(Animation.INFINITE);
  12. imageView.startAnimation(animation);
  13. }
  14. }


以动画方式切换View的组件ViewFlipper

ViewFlipper可以实现不同View之间的切换。本示例,包含了三个XML布局文件,layout1.xml、layout2.xml、layout3.xml来定义三个View,每一个View都包含一个ImageView组件,当触摸第一个ImageView时,会以水平左移的方式切换到底二个ImageView。触摸第二个时,会以淡入淡出的方式切换到第三个ImageView
示例代码如下:

   
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical" >
  6. <ImageView
  7. android:id="@+id/imageview1"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:src="@drawable/image1" />
  11. </LinearLayout>


   
  1. public class Main extends Activity implements OnTouchListener
  2. {
  3. private ViewFlipper viewFlipper;
  4. private Animation translateIn;
  5. private Animation translateOut;
  6. private Animation alphaIn;
  7. private Animation alphaOut;
  8. @Override
  9. public boolean onTouch(View view, MotionEvent event)
  10. {
  11. switch (view.getId())
  12. {
  13. case R.id.imageview1:
  14. viewFlipper.setInAnimation(translateIn);//关键代码
  15. viewFlipper.setOutAnimation(translateOut);
  16. break;
  17. case R.id.imageview2:
  18. viewFlipper.setInAnimation(alphaIn);//关键代码
  19. viewFlipper.setOutAnimation(alphaOut);
  20. break;
  21. }
  22. viewFlipper.showNext();
  23. return false;
  24. }
  25. @Override
  26. public void onCreate(Bundle savedInstanceState)
  27. {
  28. super.onCreate(savedInstanceState);
  29. viewFlipper = (ViewFlipper) getLayoutInflater().inflate(R.layout.main,
  30. null);
  31. View view1 = getLayoutInflater().inflate(R.layout.layout1, null);
  32. View view2 = getLayoutInflater().inflate(R.layout.layout2, null);
  33. View view3 = getLayoutInflater().inflate(R.layout.layout3, null);
  34. viewFlipper.addView(view1);
  35. viewFlipper.addView(view2);
  36. viewFlipper.addView(view3);
  37. setContentView(viewFlipper);
  38. translateIn = AnimationUtils.loadAnimation(this, R.anim.translate_in);
  39. translateOut = AnimationUtils.loadAnimation(this, R.anim.translate_out);
  40. alphaIn = AnimationUtils.loadAnimation(this, R.anim.alpha_in);
  41. alphaOut = AnimationUtils.loadAnimation(this, R.anim.alpha_out);
  42. ImageView imageView1 = (ImageView) view1.findViewById(R.id.imageview1);
  43. ImageView imageView2 = (ImageView) view2.findViewById(R.id.imageview2);
  44. imageView1.setOnTouchListener(this);
  45. imageView2.setOnTouchListener(this);
  46. }
  47. }





文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/8797096

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。