软件编程
位置:首页>> 软件编程>> Android编程>> android 实现控件左右或上下抖动教程

android 实现控件左右或上下抖动教程

作者:[JackyCheung]  发布时间:2023-03-19 17:02:07 

标签:android,左右,上下,抖动

差不多一年前在自己的项目中用过这效果,虽然很简单,但还是写写。

1、首先在你的res目录下新建anim子目录,并在anim目录下新建两个文件:

(1)shake.xml文件(位移/平移:translate),设置起始的位移范围、效果时间、循环次数


<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:fromXDelta="0"
 android:toXDelta="10"
 android:duration="500"
 android:interpolator="@anim/share_cycle">
 <!--.
   fromXDelta:x轴起点抖动位置
   toXDelta:x轴终点抖动位置
   duration:循环播放的时间
   interpolator:循环不放设置(次数)
 -->
</translate>

(2)cycle.xml文件,控制循环次数


<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
 android:cycles="2"><!--. 循环次数 -->

</cycleInterpolator><!--. 循环播放 -->

最后给你的控件设置改动画属性

Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
ivShake.startAnimation(shake);

这里ivShake是ImageView,就是这么简单。

2、个人碰到一个问题就是在Activity实现监听中添加动画效果第一次没有反应,不知道为什么

补充知识:Android 抖动提示动画

左右抖动


ObjectAnimator animator = ObjectAnimator.ofFloat(textView, "translationX", 0, 100, -100,0);
animator.setDuration(200);
animator.start();

重复左右抖动


Animation translateAnimation = new TranslateAnimation(-20, 20, 0, 0);
translateAnimation.setDuration(100);//每次时间
translateAnimation.setRepeatCount(10);//重复次数
/**倒序重复REVERSE 正序重复RESTART**/
translateAnimation.setRepeatMode(Animation.REVERSE);
nope.startAnimation(translateAnimation);
 public static void Shakeview( View view) {
   Animation translateAnimation = new TranslateAnimation(-10, 10, 0, 0);
   translateAnimation.setDuration(50);//每次时间
   translateAnimation.setRepeatCount(10);//重复次数
/**倒序重复REVERSE 正序重复RESTART**/
   translateAnimation.setRepeatMode(Animation.REVERSE);
   view.startAnimation(translateAnimation);
 }

左右上下抖动


ObjectAnimator animator = tada(clickMe);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.start();

public static ObjectAnimator tada(View view) {
 return tada(view, 2f);
}

public static ObjectAnimator tada(View view, float shakeFactor) {

PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofKeyframe(View.SCALE_X,
     Keyframe.ofFloat(0f, 1f),
     Keyframe.ofFloat(.1f, .9f),
     Keyframe.ofFloat(.2f, .9f),
     Keyframe.ofFloat(.3f, 1.1f),
     Keyframe.ofFloat(.4f, 1.1f),
     Keyframe.ofFloat(.5f, 1.1f),
     Keyframe.ofFloat(.6f, 1.1f),
     Keyframe.ofFloat(.7f, 1.1f),
     Keyframe.ofFloat(.8f, 1.1f),
     Keyframe.ofFloat(.9f, 1.1f),
     Keyframe.ofFloat(1f, 1f)
 );

PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofKeyframe(View.SCALE_Y,
     Keyframe.ofFloat(0f, 1f),
     Keyframe.ofFloat(.1f, .9f),
     Keyframe.ofFloat(.2f, .9f),
     Keyframe.ofFloat(.3f, 1.1f),
     Keyframe.ofFloat(.4f, 1.1f),
     Keyframe.ofFloat(.5f, 1.1f),
     Keyframe.ofFloat(.6f, 1.1f),
     Keyframe.ofFloat(.7f, 1.1f),
     Keyframe.ofFloat(.8f, 1.1f),
     Keyframe.ofFloat(.9f, 1.1f),
     Keyframe.ofFloat(1f, 1f)
 );

PropertyValuesHolder pvhRotate = PropertyValuesHolder.ofKeyframe(View.ROTATION,
     Keyframe.ofFloat(0f, 0f),
     Keyframe.ofFloat(.1f, -3f * shakeFactor),
     Keyframe.ofFloat(.2f, -3f * shakeFactor),
     Keyframe.ofFloat(.3f, 3f * shakeFactor),
     Keyframe.ofFloat(.4f, -3f * shakeFactor),
     Keyframe.ofFloat(.5f, 3f * shakeFactor),
     Keyframe.ofFloat(.6f, -3f * shakeFactor),
     Keyframe.ofFloat(.7f, 3f * shakeFactor),
     Keyframe.ofFloat(.8f, -3f * shakeFactor),
     Keyframe.ofFloat(.9f, 3f * shakeFactor),
     Keyframe.ofFloat(1f, 0)
 );

return ObjectAnimator.ofPropertyValuesHolder(view, pvhScaleX, pvhScaleY, pvhRotate).
     setDuration(1000);
}

来源:https://blog.csdn.net/u012842688/article/details/68944607

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com