基于Android自带插入器的图形波动效果

对于Android的各种动画我们并不陌生,但是可能很多同学不知道Interpolator到底是什么,以及系统自带的几种Interpolator的效果是什么样子,所以我总结一下这几种插入器。

Interpolator 被用来修饰动画效果,定义动画的变化率
1.AccelerateInterpolator 加速插值器
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速

2.AccelerateDecelerateInterpolator 加速减速插值器
AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速

3.LinearInterpolator 线性插值器
LinearInterpolator 以常量速率改变

4.BounceInterpolator 弹跳插值器
BounceInterpolator 动画结束的时候弹起

5.AnticipateInterpolator 回荡秋千插值器
AnticipateInterpolator 开始的时候向后然后向前甩

6.AnticipateOvershootInterpolator
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值

7.CycleInterpolator 正弦周期变化插值器
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线

8.OvershootInterpolator
OvershootInterpolator 向前甩一定值后再回到原来位置
首先我们要知道这几种插入器的动画效果,然后根据自己的需要来运用这些插入器

下面我们来实现一下图形波动的效果,话不多说,直接上代码

 private Paint wavePaint;//画笔
    private int color;//颜色
    private int radius;//半径
    private long animationTime = 2000;//动画时间

    protected float waveScale;
    protected int alpha;//透明度


    private Interpolator waveInterpolator;//插入器
    private Interpolator alphaInterpolator;

    private Animator animator;
    private AnimatorSet animatorSet;

    /**
     * 构造方法
     * @param color         color
     * @param radius        radius
     * @param animationTime time
     */

    public WaveDrawable(int color, int radius, long animationTime) {
        this(color, radius);
        this.animationTime = animationTime;
    }

    /**
     * 构造方法
     * @param color  colro
     * @param radius radius
     */
    public WaveDrawable(int color, int radius) {
        this.color = color;
        this.radius = radius;
        this.waveScale = 0f;
        this.alpha = 255;

        wavePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        animatorSet = new AnimatorSet();

    }

    /***
     * 复写draw方法
     * 这个方法中可以画出你自己想要的图形
     * @param canvas
     */


    @Override
    public void draw(Canvas canvas) {

        final Rect bounds = getBounds();

        // 画圆
        wavePaint.setStyle(Paint.Style.FILL);
        wavePaint.setColor(color);
        wavePaint.setAlpha(alpha);
        canvas.drawCircle(bounds.centerX(), bounds.centerY(), radius * waveScale, wavePaint);

    }

    /**
     * 设置插入器方法
     * @param interpolator interpolator
     */
    public void setWaveInterpolator(Interpolator interpolator) {
        this.waveInterpolator = interpolator;
    }

    /**
     * 设置透明度插入器方法
     * @param interpolator interpolator
     */
    public void setAlphaInterpolator(Interpolator interpolator) {
        this.alphaInterpolator = interpolator;
    }

    /***
     * 开始动画
     */
    public void startAnimation() {
        animator = generateAnimation();
        animator.start();
    }

    /***
     * 停止动画
     */
    public void stopAnimation() {
        if (animator.isRunning()) {
            animator.end();
        }
    }


    public boolean isAnimationRunning() {
        if (animator != null) {
            return animator.isRunning();
        }
        return false;
    }

    /***
     * 设置透明度
     * @param alpha
     */
    @Override
    public void setAlpha(int alpha) {
        this.alpha = alpha;
        invalidateSelf();
    }

    /***
     * 设置图形颜色
     * @param cf
     */
    @Override
    public void setColorFilter(ColorFilter cf) {
        wavePaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return wavePaint.getAlpha();
    }


    protected void setWaveScale(float waveScale) {
        this.waveScale = waveScale;
        invalidateSelf();
    }

    protected float getWaveScale() {
        return waveScale;
    }

    private Animator generateAnimation() {

        //波动的动画
        ObjectAnimator waveAnimator = ObjectAnimator.ofFloat(this, "waveScale", 0f, 1f);
        waveAnimator.setDuration(animationTime);
        if (waveInterpolator != null) {
            waveAnimator.setInterpolator(waveInterpolator);
        }
        //动画循环次数
        waveAnimator.setRepeatCount(Animation.INFINITE);
        waveAnimator.setRepeatMode(Animation.INFINITE);

        //透明度动画
        ObjectAnimator alphaAnimator = ObjectAnimator.ofInt(this, "alpha", 255, 0);
        alphaAnimator.setDuration(animationTime);
        if (alphaInterpolator != null) {
            alphaAnimator.setInterpolator(alphaInterpolator);
        }
        //动画循环次数
        alphaAnimator.setRepeatCount(Animation.INFINITE);
        alphaAnimator.setRepeatMode(Animation.INFINITE);
        //两个动画结合使用
        animatorSet.playTogether(waveAnimator, alphaAnimator);

        return animatorSet;
    }

接下来的内容就很简单了我们看一下布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/spinner"
        android:scaleType="centerInside"
        android:src="@mipmap/ic_launcher" />

</RelativeLayout>

最后看一下我们的Activity

public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener{
    private String[] interpolatorsList = {"LinearInterpolator", "AccelerateDecelerateInterpolator",
            "AccelerateInterpolator", "AnticipateInterpolator", "AnticipateOvershootInterpolator",
            "BounceInterpolator", "CycleInterpolator", "DecelerateInterpolator", "OvershootInterpolator"};
    private WaveDrawable waveDrawable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ImageView imageView = (ImageView) findViewById(R.id.image);
        Spinner spinner = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, interpolatorsList);
        spinner.setAdapter(adapter);
        spinner.setOnItemSelectedListener(this);

        waveDrawable = new WaveDrawable(Color.parseColor("#8e44ad"), 500);
        imageView.setBackground(waveDrawable);


    }



    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Interpolator interpolator;

        switch (position) {
            case 0:
                interpolator = new LinearInterpolator();
                break;
            case 1:
                interpolator = new AccelerateDecelerateInterpolator();
                break;
            case 2:
                interpolator = new AccelerateInterpolator();
                break;
            case 3:
                interpolator = new AnticipateInterpolator();
                break;
            case 4:
                interpolator = new AnticipateOvershootInterpolator();
                break;
            case 5:
                interpolator = new BounceInterpolator();
                break;
            case 6:
                interpolator = new CycleInterpolator(3);
                break;
            case 7:
                interpolator = new DecelerateInterpolator();
                break;
            case 8:
                interpolator = new OvershootInterpolator();
                break;
            default:
                interpolator = new LinearInterpolator();
                break;
        }
        waveDrawable.setWaveInterpolator(interpolator);
        waveDrawable.startAnimation();
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }
}

运行一下我们的工程,你就会看到不同插入器的不同效果了。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值