属性动画Animator
来源:互联网 发布:如何测试80端口 编辑:程序博客网 时间:2024/05/17 23:23
属性动画Animator的使用方法
public class MainActivity extends AppCompatActivity { private ImageView showIv; private RelativeLayout relativeLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showIv = (ImageView) findViewById(R.id.showIv); relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout); showIv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //调用使用ValueAnimator的方法完成动画// useValueAnimator(); //调用使用ObjectAnimator的方法完成动画// useObjectAnimator(); //调用使用ViewPropertyAnimator的方法完成动画// useViewPropertyAnimator(); //调用使用AnimatorSet的方法完成组合动画// useAnimatorSet(); //调用使用ObjectAnimator完成组合动画// useObjectAnimatorSet(); //调用使用ValueAnimator完成组合动画// useValueAnimatorSet(); //调用通过引用ValueAnimation的xml文件完成动画// useValueAnimatorXml(); //调用通过引用ObjectAnimator的xml文件完成动画// useObjectAnimatorXml(); //调用通过引用AnimatorSet的xml文件完成动画// useAnimatorSetXml(); //调用通过值动画来改变背景颜色// ValueAnimatorSetBackgrundColor(); } }); //通过ValueAnimator完成对自定义View对象的动画效果 ValueAnimatorOfObject(); } //使用ValueAnimator的方法完成动画 private void useValueAnimator() {// 属性动画 ValueAnimator 的用法 ,属性动画本质是值动画 ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f); valueAnimator.setDuration(3000); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float animatedValue = (float) animation.getAnimatedValue(); //设置透明// showIv.setAlpha(animatedValue); ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams(); layoutParams.width = (int) (animatedValue * 500); layoutParams.height = (int) (animatedValue * 500); showIv.setLayoutParams(layoutParams); } }); valueAnimator.start(); } //使用ObjectAnimator的方法完成动画 private void useObjectAnimator() { //透明度变化// ObjectAnimator alphaObjectAnimator = ObjectAnimator.ofFloat(showIv,"alpha",0,1);// alphaObjectAnimator.setDuration(3000).start(); //平移动画// ObjectAnimator translationXObjectAnimator = ObjectAnimator.ofFloat(showIv, "translationX", 0, 1000);// translationXObjectAnimator.setDuration(3000).start(); //旋转动画// ObjectAnimator rotateObjectAnimator = ObjectAnimator.ofFloat(showIv, "rotation", 0, 360);// rotateObjectAnimator.setDuration(3000).start(); //缩放动画 ObjectAnimator scaleObjectAnimator = ObjectAnimator.ofFloat(showIv, "scaleX", 0f, 2f); scaleObjectAnimator.setDuration(3000); //重复3次 scaleObjectAnimator.setRepeatCount(3); scaleObjectAnimator.setRepeatMode(ValueAnimator.REVERSE); scaleObjectAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); scaleObjectAnimator.start(); } //使用ViewPropertyAnimator的方法完成动画 private void useViewPropertyAnimator() { showIv.animate().alpha(0.5f) .translationX(300) .scaleX(2) .scaleY(2) .rotation(360f) .setDuration(3000) //延迟两秒执行 .setStartDelay(2000) .start(); } //使用AnimatorSet的方法完成组合动画 private void useAnimatorSet() { AnimatorSet animatorSet = new AnimatorSet(); ObjectAnimator alpha = ObjectAnimator.ofFloat(showIv, "alpha", 0f, 1f); ObjectAnimator translationX = ObjectAnimator.ofFloat(showIv, "translationX", 0f, 200f); animatorSet.playTogether(alpha, translationX); animatorSet.setDuration(3000); animatorSet.start(); } //使用ObjectAnimator完成组合动画 private void useObjectAnimatorSet() { PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat("alpha", 0f, 1f); PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0f, 200f); ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(showIv, alpha, translationX); objectAnimator.setDuration(3000); objectAnimator.start(); } //使用ValueAnimator完成组合动画 private void useValueAnimatorSet() { ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 1f); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float animatedValue = (float) animation.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = showIv.getLayoutParams(); layoutParams.width = (int) (animatedValue * 300); layoutParams.height = (int) (animatedValue * 300); showIv.setLayoutParams(layoutParams); showIv.setAlpha(animatedValue); } }); valueAnimator.setDuration(3000); valueAnimator.start(); } //通过引用ValueAnimation的xml文件完成动画 private void useValueAnimatorXml() { ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.value_animator); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float animatedValue = (float) animation.getAnimatedValue(); showIv.setAlpha(animatedValue); } }); animator.setDuration(3000); animator.start(); } //value_animator的XML类<animator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:valueFrom="0f" android:valueTo="0.5f" android:valueType="floatType"> </animator>
//通过引用ObjectAnimator的xml文件完成动画 private void useObjectAnimatorXml() { ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.object_animator); animator.setTarget(showIv); animator.start(); }
//object_animator的XML类
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:valueFrom="0f" android:valueTo="0.5f" android:valueType="floatType" android:propertyName="alpha"> </objectAnimator>
//通过引用AnimatorSet的xml文件完成动画 private void useAnimatorSetXml() { AnimatorSet animator = (AnimatorSet) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.set_animator); animator.setTarget(showIv); animator.start(); }
//set_animator的XML的类<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="3000" android:ordering="sequentially"> <objectAnimator android:duration="3000" android:valueFrom="0f" android:valueTo="0.5f" android:valueType="floatType" android:propertyName="alpha"> </objectAnimator> <objectAnimator android:duration="3000" android:valueFrom="0f" android:valueTo="200f" android:valueType="floatType" android:propertyName="translationX"> </objectAnimator> </set>
//通过值动画来改变背景颜色 private void ValueAnimatorSetBackgrundColor() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ValueAnimator valueAnimator = ValueAnimator.ofArgb(0xffff0000, 0xff0000ff, 0xff00ff00); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int animatedValue = (int) animation.getAnimatedValue(); relativeLayout.setBackgroundColor(animatedValue); } }); valueAnimator.setDuration(2000); valueAnimator.start(); } } //通过ValueAnimator完成对自定义View对象的动画效果 private void ValueAnimatorOfObject() { Point startPoint = new Point(0, 0); Point endPoint = new Point(1000, 1000); //fraction是一个从0到1变化的值 ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() { @Override public Point evaluate(float fraction, Point startValue, Point endValue) { float startX = startValue.getX(); float endX = endValue.getX(); float currentX = startX + fraction * (endX - startX); float startY = startValue.getY(); float endY = endValue.getY(); float currentY = startY + fraction * (endY - startY); return new Point(currentX, currentY); } }, startPoint, endPoint); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Point point = (Point) animation.getAnimatedValue(); } }); }}
自定义ViewMyCircleView类
public class MyCircleView extends View { Paint paint; float radius = 100; Point currentPoint; public MyCircleView(Context context) { super(context); init(); } public MyCircleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } private void init() { paint = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.BLUE); } //根据currentPoint的x和y确定圆心的位置,去画圆 private void drawCirle(Canvas canvas) { //只执行一次动画 if (currentPoint == null) { startPointAnimation(); } canvas.drawCircle(currentPoint.getX(), currentPoint.getY(), radius, paint); } //开始执行对Point对象操作的动画 private void startPointAnimation() { Point startPoint = new Point(radius, radius); Point endPoint = new Point(getWidth() - radius, getHeight() - radius); currentPoint = startPoint; //fraction是一个从0到1变化的值 ValueAnimator valueAnimator = ValueAnimator.ofObject(new TypeEvaluator<Point>() { @Override public Point evaluate(float fraction, Point startValue, Point endValue) { float startX = startValue.getX(); float endX = endValue.getX(); float currentX = startX + fraction * (endX - startX); float startY = startValue.getY(); float endY = endValue.getY(); float currentY = startY + fraction * (endY - startY); Log.e("tag", "===== " + currentY); return new Point(currentX, currentY); } }, startPoint, endPoint); //设置监听,获取当前的监听对象 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { currentPoint = (Point) animation.getAnimatedValue(); //重新绘制, (改变了currentPoint之后去重新绘制圆) invalidate(); } }); //设置动画插值器,改变动画变化速率 , 加速,先加速后减速,弹跳效果 valueAnimator.setInterpolator(new BounceInterpolator()); valueAnimator.setDuration(2000); valueAnimator.start(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //去画圆 drawCirle(canvas); }}
Point类
public class Point { float x; float y; public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public Point(float x, float y) { this.x = x; this.y = y; }}
在XML布局文件中引用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/relativeLayout" tools:context="com.hgz.test.animator.MainActivity"> <ImageView android:id="@+id/showIv" android:layout_width="130dp" android:layout_height="130dp" android:layout_centerInParent="true" android:src="@drawable/ic_stub" android:visibility="gone"/> <com.hgz.test.animator.MyCircleView android:layout_width="match_parent" android:layout_height="match_parent" /></RelativeLayout>
阅读全文
1 0
- 属性动画Animator
- 属性动画Animator学习
- android属性动画animator
- Animator属性动画
- animator属性动画
- 【Property Animator 属性动画】
- Android属性动画(Animator)
- Animator --属性动画
- 属性动画Animator
- Animator --- 属性动画
- Unity动画 Animator的属性
- Android之属性动画Animator
- Android Animator属性动画总结
- Animator 属性动画简单使用
- 属性动画Animator工具类
- Animator参考(属性动画)
- Android之Animator属性动画
- Android 动画之属性动画(Animator)
- 左右侧拉
- Python安装和运行Scrapy中的两个问题
- 介绍——基于类的视图(class-based view)
- 集合各实现类的底层实现原理
- Frangment+动画+listview
- 属性动画Animator
- SlidingMenu
- Comparable与Comparator浅析
- SSH整合的配置文件
- UVA 1620 Lazy Susan
- java学习第18天
- shell基础
- windows 2008 密码恢复
- 适配器Fragment,Viewpager