Android开发 之 属性动画(自定义ValueAnimator的TypeEvaluator)
来源:互联网 发布:apache url重写 编辑:程序博客网 时间:2024/05/22 01:34
自定义ValueAnimator的TypeEvaluator
翻译过来就是类型计算器,对,就是一个计算器,只不过这计算器的计算规则由你设定,也就是你要继承重写喽。
对于valueAnimator类中的其他ofXXx方法,其实都是有计算器,默认好像是FloatEvaluator的。
本文这次改变属性是一个点的x,y跟随要给曲线运动动画效果:
妈的,这 gif录制工具太差了,变成绿低了。但是还是能看出小蝌蚪在动。
下面看代码:
activity的布局文件就一个imageview,等会这个就是存放你的运动点的容器。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/iv" android:layout_width="300dp" android:layout_height="400px" android:layout_margin="50dp"/></LinearLayout>
activity代码
这里是根据imageview的尺寸 去设置起点和终点的。
有个iamgeview尺寸的获取,利用视图树,当iamgeview绘制好了,再去获取其宽高。
自定义了一个pointDrawable,和myself类下面有代码
package com.example.zxq.bsquxian;import android.animation.ValueAnimator;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.view.ViewTreeObserver;import android.view.animation.LinearInterpolator;import android.widget.ImageView;import com.example.zxq.bsquxian.zidiyizhidonghua.MySelf;import com.example.zxq.bsquxian.zidiyizhidonghua.Point;import com.example.zxq.bsquxian.zidiyizhidonghua.PointDrawable;/** * Created by Administrator on 2017/7/26 0026. */public class ShuxingAnmationActivity extends AppCompatActivity { private ImageView iv; private int width; private int height; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shuxingdonghua); iv= (ImageView) findViewById(R.id.iv); int intw=View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); iv.measure(intw, inth); iv.getViewTreeObserver().addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { height = iv.getHeight(); width = iv.getWidth(); iv.getViewTreeObserver().removeGlobalOnLayoutListener(this); final PointDrawable pointDrawable=new PointDrawable(width,height); iv.setBackground(pointDrawable); ValueAnimator valueAnimator = ValueAnimator.ofObject(new MySelf(), pointDrawable.getStartPoint(), pointDrawable.getEndPoint()); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { Point animatedValue = (Point) valueAnimator.getAnimatedValue(); pointDrawable.setCurrentPoint(animatedValue); pointDrawable.invalidateSelf(); } }); valueAnimator.setDuration(5000); valueAnimator.setInterpolator(new LinearInterpolator());//设置插值器 valueAnimator.start(); } }); }}
pointDrawable的代码:
创建这个对象的时候,创建了两个点,起点和终点,还有画笔
在draw()方法中去绘制图形
在setcurrentpoint()方法中,当前运动点的位置传进来。这个方法是在activity中动画运行监听中调用的。在上面
package com.example.zxq.bsquxian.zidiyizhidonghua;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.ColorFilter;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.graphics.drawable.PictureDrawable;import android.support.annotation.IntRange;import android.support.annotation.NonNull;import android.support.annotation.Nullable;import android.util.Log;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2017/7/26 0026. */public class PointDrawable extends Drawable { private Point startPoint; private Point endPoint; private Point currentPoint; private final Paint paint; private List<Point> list=new ArrayList<Point>(); public void setCurrentPoint(Point currentPoint) { this.currentPoint = currentPoint; } public void setStartPoint(Point startPoint) { this.startPoint = startPoint; } public void setEndPoint(Point endPoint) { this.endPoint = endPoint; } public Point getStartPoint() { return startPoint; } public Point getEndPoint() { return endPoint; } public PointDrawable(int width,int height){ startPoint = new Point(0,height/2); endPoint = new Point(width,height/2); paint = new Paint(); paint.setStyle(Paint.Style.FILL); paint.setAntiAlias(true); paint.setColor(Color.GREEN); } @Override public void draw(@NonNull Canvas canvas) { canvas.drawColor(Color.BLACK); if(currentPoint!=null) { Log.e("jinlai",currentPoint.getX()+"???"+currentPoint.getY()); if(list.size()<20) { list.add(currentPoint); }else{ list.remove(0); list.add(currentPoint); } for (int i=0;i<list.size();i++) { Point point = list.get(i); int r=i/2; canvas.drawCircle(point.getX(),point.getY(),r,paint); } } } @Override public void setAlpha(@IntRange(from = 0, to = 255) int i) { } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { } @Override public int getOpacity() { return 1; }}
MySelf类就是真个点运动位置的计算方法
实现TypeEvaluator接口
方法中的那两个点就是activity代码中的创建动画传进来的开始和结束点,x成线性变化,y成正玄曲线变化。
package com.example.zxq.bsquxian.zidiyizhidonghua;import android.animation.TypeEvaluator;import android.widget.Button;/** * Created by Administrator on 2017/7/26 0026. */public class MySelf implements TypeEvaluator<Point> { @Override public Point evaluate(float v, Point point, Point t1) { int x = (int) (v*(t1.getX()-point.getX())); int y = (int) (50 * (float) (Math.sin(0.01 * Math.PI * x)) +200); return new Point(x,y); }}
这就是整个过程。主要用途就是根据自己的计算规则实现动态计算,获取要的数据,然后在
阅读全文
0 0
- Android开发 之 属性动画(自定义ValueAnimator的TypeEvaluator)
- Android属性动画(二) ValueAnimator的实际应用 & 自定义TypeEvaluator
- Android属性动画--TypeEvaluator
- Android属性动画之ValueAnimator
- Android属性动画之ValueAnimator
- Android 动画之属性动画ValueAnimator
- Android 2.x自定义属性动画ValueAnimator
- Android-Property 动画自定义TypeEvaluator
- Android属性动画之ValueAnimator使用
- Android属性动画之 一、 ValueAnimator
- 属性动画之ValueAnimator
- 属性动画之ValueAnimator
- android 属性动画(ValueAnimator)
- Android属性动画 ValueAnimator
- android ValueAnimator 属性动画的用法
- android 动画 属性动画 ValueAnimator
- 逐帧动画 补间动画 属性动画ObjectAnimator ValueAnimator AnimatorSet)演示 TypeEvaluator
- 走进绚烂多彩的属性动画-Property Animation之TimeInterpolator和TypeEvaluator(下篇)
- GalaxyOJ-36 (排序+并查集)
- 选票统计
- Laravel5.2简单的API实现
- 2017笔试编程之砝码称重~
- Gym
- Android开发 之 属性动画(自定义ValueAnimator的TypeEvaluator)
- Larvel5.2上传图片并显示缩略图
- 递归的使用
- Java异常、断言、日志与调试
- NYOJ-635 Oh, my goddess C语言
- 1010. Radix (25)
- jdk安装配置环境变量以及测试
- 初识AOP
- Ajax复选框多选删除的实现