您的位置:首页 > 移动开发 > Android开发

Android 循环读数字动画实现

2018-01-06 15:02 260 查看




[b]一、概述[/b]

大家好,这篇文章为大家实现一个读数字的动画,非常简单,安卓动画一共有三种:
视图动画(View Animation),帧动画(Frame Animation),属性动画(Property
Animation)
先显示一个效果图(卖家秀~)

 

 

[b]二、实现[/b]

下面我们使用属性动画中的Object Animator为例:
[b](1)[b]配置权限[/b][/b]
<!-- 相机 -->
<[b]uses-permission
android:name="android.permission.CAMERA"
[/b]/>
<!-- 录音 -->
<[b]uses-permission
android:name="android.permission.RECORD_AUDIO"
[/b]/>
<!-- 视频 -->
<[b]uses-permission
android:name="android.permission.RECORD_VIDEO"
[/b]/>
<!-- 写入内存 -->
<[b]uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"[/b]/>
上面的权限按需求添加即可
 
[b](2)[b]编写代码[/b][/b]
 
首先编写一个动画,实现动画监听器,在动画开始时显示数字,根据参数[b]mValidateData[/b]的数字进行循环显示。
我们可以在onCreate中点击某个按钮然后调用stratReadNumberAnimation()这个方法;
//
声明变量
[b]private
[/b]Button
[b]btnStart[/b];
[b]private
[/b]TextView
[b]tvVolume[/b];
[b]private
[/b]ImageView
[b]ivNumber[/b];
 
//这个是第三方的一个相机,如可不用
[b]private
[/b]CameraPreview
[b]cameraPreview[/b]; 
[b]private
[/b]File
[b]mVideoFile[/b];
[b]private
[/b]Boolean
[b]isVedioStart
[/b]=
[b]false[/b];
[b]private int
count
[/b]=
0;
[b]private
[/b]String
[b]mValidateData
[/b]=
[b]"123456789"[/b];
[b]private int
counts
[/b]=
[b]mValidateData[/b].length();
 
// 开始读数字的动画
[b]private void
[/b]stratReadNumberAnimation() {
    ObjectAnimator alpha = ObjectAnimator.ofFloat([b]ivNumber[/b],
[b]"alpha"[/b],
0.5f,
1.0f);
    ObjectAnimator scaleX = ObjectAnimator.ofFloat([b]ivNumber[/b],
[b]"scaleX"[/b],
0.8f,
1.2f);
    ObjectAnimator scaleY = ObjectAnimator.ofFloat([b]ivNumber[/b],
[b]"scaleY"[/b],
0.8f,
1.3f);
    AnimatorSet set =
[b]new
[/b]AnimatorSet();
    set.addListener([b]animatorListener[/b]);
    set.setDuration(2000);
    set.playTogether(alpha, scaleX, scaleY);
    set.start();
}
 
//
动画监听器
[b]private
[/b]Animator.AnimatorListener
[b]animatorListener
[/b]=
[b]new
[/b]Animator.AnimatorListener() {

    @Override
    [b]public void
[/b]onAnimationStart(Animator animation) {
        [b]count
[/b]+=
1;
        [b]if
[/b]([b]ivNumber[/b].getVisibility()
== View.[b]INVISIBLE[/b])
{
      [b]ivNumber[/b].setVisibility(View.[b]VISIBLE[/b]);
        }
        [b]int
[/b]number = VideoNumber.readChangedNumber([b]mValidateData[/b],
[b]count[/b]);
        [b]ivNumber[/b].setImageResource(number);
    }

    @Override
    [b]public void
[/b]onAnimationEnd(Animator animation) {
        [b]if
[/b]([b]count
[/b]>=
[b]counts[/b])
{
            [b]ivNumber[/b].setVisibility(View.[b]INVISIBLE[/b]);
            [b]count
[/b]=
0;
            [b]return[/b];
        }
 //
   这里注意一个坑,不能重用那个参数animation,会出现不正确循环
//            animation.reset();
//            animation.setAnimationListener(animationListener2);
//            animation.start();

//重新创建animation循环执行动画
        stratReadNumberAnimation(); 
    }

    @Override
    [b]public void
[/b]onAnimationCancel(Animator animation) {
    }

    @Override
    [b]public void
[/b]onAnimationRepeat(Animator animation) {
    }
};
 
/**
 *
这个类是根据传入的显示的数字和次数,进行每次显示不同的数字
 */
[b]public class
[/b]VideoNumber {

    [b]public static int
[/b]readChangedNumber(String mValidateData,
[b]int
[/b]count) {
        count = count -
1;
//传入count为次数,count作用为坐标,因为坐标从0开始,所以要减1
        [b]int
[/b]number = Integer.parseInt(String.valueOf(mValidateData.charAt(count)));

        [b]if
[/b](number ==
0) {
            [b]return
[/b]R.drawable.[b]image_num0_gold[/b];
        }
        [b]if
[/b](number ==
1) {
            [b]return
[/b]R.drawable.[b]image_num1_gold[/b];
        }
        [b]if
[/b](number ==
2) {
            [b]return
[/b]R.drawable.[b]image_num2_gold[/b];
        }
        [b]if
[/b](number ==
3) {
            [b]return
[/b]R.drawable.[b]image_num3_gold[/b];
        }
        [b]if
[/b](number ==
4) {
            [b]return
[/b]R.drawable.[b]image_num4_gold[/b];
        }
        [b]if
[/b](number ==
5) {
            [b]return
[/b]R.drawable.[b]image_num5_gold[/b];
        }
        [b]if
[/b](number ==
6) {
            [b]return
[/b]R.drawable.[b]image_num6_gold[/b];
        }
        [b]if
[/b](number ==
7) {
            [b]return
[/b]R.drawable.[b]image_num7_gold[/b];
        }
        [b]if
[/b](number ==
8) {
            [b]return
[/b]R.drawable.[b]image_num8_gold[/b];
        }
        [b]if
[/b](number ==
9) {
            [b]return
[/b]R.drawable.[b]image_num9_gold[/b];
        }
        [b]return
[/b]-1;
    }
}
 
至此,一个简单的动画就完成啦~~

三、附加
有了录音读数字,是不是需要获取录音的音量大小呢?完整项目获取了音量大小,大家还可以对音量大小进行显示不同的图标~~
源码地址:https://github.com/18824153269/Animator
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: