android關於屬性動畫的七個使用案例
package com.tz.dream.property.animation;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.AnimatorInflater;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.animation.TypeEvaluator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.PointF;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
@SuppressLint("NewApi")
public class MainActivity extends Activity implements OnClickListener {
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.iv_property);
imageView.setOnClickListener(this);
// api 3.0之前這些個屬性是不存在的
// imageView.setRotationX(rotationX);
// imageView.setAlpha(alpha);
// imageView.setTranslationX(translationX);
}
@Override
public void onClick(View v) {
// 第一個案例:旋轉
// target表示作用目標
// propertyName表示屬性名稱(rotationX:旋轉)
// values:表示從哪裡旋轉到哪裡
// ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v,
// "rotationY",
// 0.0f, 360.0f).setDuration(2000);
// objectAnimator.start();
// 第二個案例(監聽動畫執行過程)
// 注:雖然我們輸入的屬性不存在,但是仍然會執行(指的是時間)
// 非主流用法
// ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(v, "dream",
// 0.0f, 50.0f);
// objectAnimator.setDuration(200);
// objectAnimator.start();
// // 新增動畫監聽(監聽動畫執行過程)
// objectAnimator.addUpdateListener(new AnimatorUpdateListener() {
// @Override
// public void onAnimationUpdate(ValueAnimator animation) {
// // getAnimatedValue:指的是當前時間在某一個時刻對應的value值 (距離/時間=速度)
// float animatedValue = (float) animation.getAnimatedValue();
// // imageView.setScaleX(Math.max(0.8f, animatedValue));
// // imageView.setScaleY(Math.max(0.8f, animatedValue));
// imageView.setTranslationX(animatedValue);
// // imageView.setAlpha(alpha);
// }
// });
// 第三個案例:多個動畫同時執行
// PropertyValuesHolder scaleXholder = PropertyValuesHolder.ofFloat(
// "scaleX", 0.0f, 1.0f);
// PropertyValuesHolder scaleYholder = PropertyValuesHolder.ofFloat(
// "scaleY", 0.0f, 1.0f);
// ObjectAnimator objectAnimator =
// ObjectAnimator.ofPropertyValuesHolder(
// v, scaleXholder, scaleYholder);
// objectAnimator.setDuration(2000);
// objectAnimator.start();
// // 第四個案例------ValueAnimator-------
// ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f, 100.0f);
// valueAnimator.setDuration(1000);
// valueAnimator.start();
// valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
//
// @Override
// public void onAnimationUpdate(ValueAnimator animation) {
// float animatedValue = (float) animation.getAnimatedValue();
// // imageView.setScaleX(animatedValue);
// // imageView.setScaleY(animatedValue);
// imageView.setTranslationX(animatedValue);
// }
// });
// 第五個案例---實現多個動畫同時執行,實現拋物線效果----估值器
// 總時間
// final int duration = 2000;
// ValueAnimator valueAnimator = new ValueAnimator();
// valueAnimator.setDuration(duration);
// valueAnimator.setObjectValues(new PointF(0, 0));
//
// // 估值器:可以用來計算我們的view在螢幕當中顯示的位置(運動的軌跡:平移、縮放、拋物線等等......)
// valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {
//
// @Override
// public PointF evaluate(float fraction, PointF startValue,
// PointF endValue) {
// // fraction:表示百分比,代表當前執行到了什麼程度
// // duration:總時間
// // t表示當前時間
// // 百分比: fraction = t/duration
// // 時間:t = fraction*duration
// // 速度我們自定義:自已規定速度s = 50px/s
// // x = t * s
// // pointF.x: 表示距離
// // 建立一個點
// PointF pointF = new PointF();
// // 計算當前實現
// float t = fraction * duration / 1000;
// // 速度=50px/s
// int s = 100;
// // 計算當前執行的距離
// pointF.x = t * s;
// // pointF.y : y = 1/2*g*t*t;
// pointF.y = 1 / 2.0f * 98f * t * t;
//
// return pointF;
// }
// });
//
// valueAnimator.start();
// valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
//
// @Override
// public void onAnimationUpdate(ValueAnimator animation) {
// PointF pointF = (PointF) animation.getAnimatedValue();
// imageView.setX(pointF.x);
// imageView.setY(pointF.y);
// }
// });
// valueAnimator.addListener(new AnimatorListenerAdapter() {
// @Override
// public void onAnimationEnd(Animator animation) {
// super.onAnimationEnd(animation);
// }
//
// });
// valueAnimator.addListener(new AnimatorListener() {
//
// @Override
// public void onAnimationStart(Animator animation) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void onAnimationRepeat(Animator animation) {
// // TODO Auto-generated method stub
//
// }
//
// @Override
// public void onAnimationEnd(Animator animation) {
// PropertyValuesHolder scaleXholder = PropertyValuesHolder
// .ofFloat("scaleX", 0.0f, 1.0f);
// PropertyValuesHolder scaleYholder = PropertyValuesHolder
// .ofFloat("scaleY", 0.0f, 1.0f);
// ObjectAnimator objectAnimator = ObjectAnimator
// .ofPropertyValuesHolder(imageView, scaleXholder, scaleYholder);
// objectAnimator.setDuration(2000);
// objectAnimator.start();
// }
//
// @Override
// public void onAnimationCancel(Animator animation) {
// // TODO Auto-generated method stub
//
// }
// });
// 第六個案例---AnimatorSet動畫集合
// ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(imageView,
// "scaleX", 1.0f, 2.0f);
// ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(imageView,
// "scaleY", 1.0f, 2.0f);
// ObjectAnimator translationXAnimator =
// ObjectAnimator.ofFloat(imageView,
// "translationX", 0.0f, 100.0f);
//
// AnimatorSet animatorSet = new AnimatorSet();
// animatorSet.setDuration(2000);
// // animatorSet.playTogether(scaleXAnimator, scaleYAnimator);
// // animatorSet.start();
// // 補充知識:思考當我們的縮放動畫執行完畢的時候執行我們的平移動畫?
// // with:同時執行 after:在誰的後面執行 before:在誰的前面執行
// animatorSet.play(scaleXAnimator).with(scaleYAnimator)
// .with(translationXAnimator);
// // animatorSet.play(scaleXAnimator).with(scaleYAnimator);
// // animatorSet.play(scaleXAnimator).after(translationXAnimator);
// animatorSet.start();
// 第七個案例---使用xml檔案配置動畫
// Animator loadAnimator = AnimatorInflater.loadAnimator(this,
// R.animator.animator_set_x_and_y);
// loadAnimator.setTarget(imageView);
// loadAnimator.start();
}
class DreamPoint {
private boolean bool;
}
}
res\animator\animator_set_x_and_y.xml
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<objectAnimator
android:duration="2000"
android:propertyName="scaleX"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType" />
<objectAnimator
android:duration="2000"
android:propertyName="scaleY"
android:valueFrom="0.0"
android:valueTo="1.0"
android:valueType="floatType" />
</set>
整理自教程
相關文章
- android屬性動畫Android動畫
- Android 動畫之屬性動畫Android動畫
- Android 屬性動畫實戰Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(三)Android動畫
- 【Android 動畫】動畫詳解之屬性動畫(五)Android動畫
- Android 動畫詳解:屬性動畫、View 動畫和幀動畫Android動畫View
- Android 顏色漸變 屬性動畫Android動畫
- Android備忘錄《屬性動畫-ValueAnimator》Android動畫
- Android 自定義View:屬性動畫(六)AndroidView動畫
- 初識屬性動畫——使用Animator建立動畫動畫
- 屬性動畫動畫
- 關於手動關閉多個el-popover的方法且不使用visible屬性
- CSS動畫屬性關鍵幀keyframes全解析CSS動畫
- Android 樣式屬性的使用Android
- SVG 動畫 fill 屬性SVG動畫
- SVG restart 動畫屬性SVGREST動畫
- SVG restart動畫屬性SVGREST動畫
- Android動畫雜七雜八Android動畫
- 屬性動畫與差值器動畫
- HenCoder Android 自定義 View 1-6: 屬性動畫(上手篇)AndroidView動畫
- CSS 屬性篇(七):Display屬性CSS
- 關於IOS 屬性atomic(原子性)的理解iOS
- 關於vuejs的偵聽屬性watch的三個問題VueJS
- Vue一個案例引發「動畫」的使用總結Vue動畫
- Android繪製(三):Path結合屬性動畫,讓圖示動起來!Android動畫
- SVG accumulate和additive動畫屬性SVG動畫
- Android 自定義View:深入理解自定義屬性(七)AndroidView
- webpack 拆包:關於 splitChunks 的幾個重點屬性解析Web
- 帶有活力的屬性動畫原始碼分析與實戰——Android高階UI動畫原始碼AndroidUI
- Android屬性動畫基礎:你是否真的瞭解插值器(TimeInterpolator)Android動畫
- Android 幀動畫使用Android動畫
- 屬性動畫-波紋擴散WaveView動畫View
- 三談屬性動畫——Keyframe以及ViewPropertyAnimator動畫View
- 檢視屬性+物件動畫元件ViewPropertyObjectAnimator物件動畫元件ViewObject
- Android關於Typedarray的使用Android
- 關於css屬性calc對於ie的態度CSS
- Android XML 屬性AndroidXML
- Android 《CardView 屬性》AndroidView
- Android全套動畫使用技巧Android動畫