From a54753e3cadb5316a36cda8e51873301de90c74a Mon Sep 17 00:00:00 2001 From: yangyi Date: Wed, 6 Sep 2017 19:35:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?2017=E5=B9=B409=E6=9C=8806=E6=97=A519:35:29?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practice/Practice01Translation.java | 85 +++++++++++++- .../practice/Practice02Rotation.java | 80 ++++++++++++- .../practice/Practice03Scale.java | 62 +++++++++- .../practice/Practice04Alpha.java | 40 ++++++- .../practice/Practice05MultiProperties.java | 108 +++++++++++++++++- .../practice/Practice06Duration.java | 45 +++++++- .../practice/Practice07Interpolator.java | 6 + .../Practice08ObjectAnimatorLayout.java | 8 ++ .../Practice08ObjectAnimatorView.java | 9 ++ app/src/main/res/layout/practice_alpha.xml | 10 ++ app/src/main/res/layout/practice_duration.xml | 12 +- .../res/layout/practice_multi_properties.xml | 16 ++- .../res/layout/practice_object_animator.xml | 8 +- app/src/main/res/layout/practice_rotation.xml | 10 ++ app/src/main/res/layout/practice_scale.xml | 10 ++ .../main/res/layout/practice_translation.xml | 10 ++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + 18 files changed, 506 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice01Translation.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice01Translation.java index d9f42ee..240085b 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice01Translation.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice01Translation.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.ObjectAnimator; import android.content.Context; import android.graphics.Outline; import android.graphics.Path; @@ -14,24 +15,33 @@ import android.widget.RelativeLayout; import com.hencoder.hencoderpracticedraw6.R; +import com.hencoder.hencoderpracticedraw6.Utils; import static android.os.Build.VERSION.SDK_INT; import static com.hencoder.hencoderpracticedraw6.Utils.dpToPixel; public class Practice01Translation extends RelativeLayout { - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; + int translationStatus; + int translationCount; public Practice01Translation(Context context) { super(context); + translationStatus = 0; + translationCount = 6; } public Practice01Translation(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + translationStatus = 0; + translationCount = 6; } public Practice01Translation(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + translationStatus = 0; + translationCount = 6; } @Override @@ -40,6 +50,8 @@ protected void onAttachedToWindow() { animateBt = (Button) findViewById(R.id.animateBt); imageView = (ImageView) findViewById(R.id.imageView); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); + if (SDK_INT> Build.VERSION_CODES.LOLLIPOP) { // 给音乐图标加上合适的阴影 imageView.setOutlineProvider(new MusicOutlineProvider()); @@ -49,6 +61,77 @@ protected void onAttachedToWindow() { @Override public void onClick(final View v) { // TODO 在这里处理点击事件,通过 View.animate().translationX/Y/Z() 来让 View 平移 + switch (translationStatus) { + case 0: + imageView.animate().translationX(Utils.dpToPixel(100)); + break; + case 1: + imageView.animate().translationXBy(Utils.dpToPixel(-100)); + break; + case 2: + imageView.animate().translationY(Utils.dpToPixel(100)); + break; + case 3: + imageView.animate().translationYBy(Utils.dpToPixel(-100)); + break; + case 4: + if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) { + imageView.animate().translationZ(Utils.dpToPixel(100)); + } + break; + case 5: + if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.LOLLIPOP) { + imageView.animate().translationZBy(Utils.dpToPixel(-100)); + } + break; + } + translationStatus++; + if (translationCount == translationStatus) { + translationStatus = 0; + } + } + }); + + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (translationStatus) { + case 0: + ObjectAnimator.ofFloat(imageView, + "translationX", + 0, + Utils.dpToPixel(100)).start(); + break; + case 1: + ObjectAnimator.ofFloat(imageView, + "translationX", + 0).start(); + break; + case 2: + ObjectAnimator.ofFloat(imageView, + "translationY", + 0, Utils.dpToPixel(100)).start(); + break; + case 3: + ObjectAnimator.ofFloat(imageView, + "translationY", + 0).start(); + break; + case 4: + ObjectAnimator.ofFloat(imageView, + "translationZ", + 0, Utils.dpToPixel(100)).start(); + break; + case 5: + ObjectAnimator.ofFloat(imageView, + "translationZ", + 0).start(); + break; + } + translationStatus++; + if (translationCount == translationStatus) { + translationStatus = 0; + } } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice02Rotation.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice02Rotation.java index f839ce7..5549273 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice02Rotation.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice02Rotation.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.ObjectAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -11,19 +12,27 @@ import com.hencoder.hencoderpracticedraw6.R; public class Practice02Rotation extends RelativeLayout { - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; + int rotationStatus; + int rotationCount; public Practice02Rotation(Context context) { super(context); + rotationStatus = 0; + rotationCount = 6; } public Practice02Rotation(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + rotationStatus = 0; + rotationCount = 6; } public Practice02Rotation(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + rotationStatus = 0; + rotationCount = 6; } @Override @@ -32,11 +41,80 @@ protected void onAttachedToWindow() { animateBt = (Button) findViewById(R.id.animateBt); imageView = (ImageView) findViewById(R.id.imageView); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); animateBt.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { // // TODO 在这里处理点击事件,通过 View.animate().rotation/X/Y() 来让 View 旋转 + switch (rotationStatus) { + case 0: + imageView.animate().rotationX(180); + break; + case 1: + imageView.animate().rotationX(0); + break; + case 2: + imageView.animate().rotationY(180); + break; + case 3: + imageView.animate().rotationY(0); + break; + case 4: + imageView.animate().rotation(180); + break; + case 5: + imageView.animate().rotation(0); + break; + } + rotationStatus++; + if (rotationCount == rotationStatus) { + rotationStatus = 0; + } + } + }); + + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (rotationStatus) { + case 0: + ObjectAnimator.ofFloat(imageView, + "rotationX", + 0, + 180).start(); + break; + case 1: + ObjectAnimator.ofFloat(imageView, + "rotationX", + 0).start(); + break; + case 2: + ObjectAnimator.ofFloat(imageView, + "rotationY", + 0, + 180).start(); + break; + case 3: + ObjectAnimator.ofFloat(imageView, + "rotationY", + 0).start(); + break; + case 4: + ObjectAnimator.ofFloat(imageView, + "rotation", + 180).start(); + break; + case 5: + ObjectAnimator.ofFloat(imageView, + "rotation", + 0).start(); + break; + } + rotationStatus++; + if (rotationStatus == rotationCount) { + rotationStatus = 0; + } } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice03Scale.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice03Scale.java index 655692e..2e7a144 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice03Scale.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice03Scale.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.ObjectAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -11,19 +12,27 @@ import com.hencoder.hencoderpracticedraw6.R; public class Practice03Scale extends RelativeLayout { - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; + int scaleStatus; + int scaleCount; public Practice03Scale(Context context) { super(context); + scaleStatus = 0; + scaleCount = 4; } public Practice03Scale(Context context, @Nullable AttributeSet attrs) { super(context, attrs); + scaleStatus = 0; + scaleCount = 4; } public Practice03Scale(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); + scaleStatus = 0; + scaleCount = 4; } @Override @@ -32,11 +41,62 @@ protected void onAttachedToWindow() { animateBt = (Button) findViewById(R.id.animateBt); imageView = (ImageView) findViewById(R.id.imageView); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); animateBt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { // TODO 在这里处理点击事件,通过 View.animate().scaleX/Y() 来让 View 放缩 + switch (scaleStatus) { + case 0: + imageView.animate().scaleX(1.5f); + break; + case 1: + imageView.animate().scaleX(1); + break; + case 2: + imageView.animate().scaleY(1.5f); + break; + case 3: + imageView.animate().scaleY(1); + break; + } + scaleStatus++; + if (scaleStatus == scaleCount) { + scaleStatus = 1; + } + } + }); + + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (scaleStatus) { + case 0: + ObjectAnimator.ofFloat(imageView, + "scaleX", + 1.5f).start(); + break; + case 1: + ObjectAnimator.ofFloat(imageView, + "scaleX", + 1).start(); + break; + case 2: + ObjectAnimator.ofFloat(imageView, + "scaleY", + 1.5f).start(); + break; + case 3: + ObjectAnimator.ofFloat(imageView, + "scaleY", + 1).start(); + break; + } + scaleStatus++; + if (scaleStatus == scaleCount) { + scaleStatus = 0; + } } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice04Alpha.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice04Alpha.java index 25acdd7..7ab3149 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice04Alpha.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice04Alpha.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.ObjectAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -11,8 +12,10 @@ import com.hencoder.hencoderpracticedraw6.R; public class Practice04Alpha extends RelativeLayout { - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; + int alphaStatus = 0; + int alphaCount = 2; public Practice04Alpha(Context context) { super(context); @@ -32,11 +35,46 @@ protected void onAttachedToWindow() { animateBt = (Button) findViewById(R.id.animateBt); imageView = (ImageView) findViewById(R.id.imageView); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); animateBt.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { // TODO 在这里处理点击事件,通过 View.animate().alpha() 来改变 View 的透明度 + switch (alphaStatus) { + case 0: + imageView.animate().alpha(0); + break; + case 1: + imageView.animate().alpha(1); + break; + } + alphaStatus++; + if (alphaStatus == alphaCount) { + alphaStatus = 0; + } + } + }); + + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (alphaStatus) { + case 0: + ObjectAnimator.ofFloat(imageView, + "alpha", + 0).start(); + break; + case 1: + ObjectAnimator.ofFloat(imageView, + "alpha", + 1).start(); + break; + } + alphaStatus++; + if (alphaStatus == alphaCount) { + alphaStatus = 0; + } } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice05MultiProperties.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice05MultiProperties.java index 56f0cd8..f7f1d65 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice05MultiProperties.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice05MultiProperties.java @@ -1,5 +1,7 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.support.constraint.ConstraintLayout; @@ -9,10 +11,13 @@ import android.widget.ImageView; import com.hencoder.hencoderpracticedraw6.R; +import com.hencoder.hencoderpracticedraw6.Utils; public class Practice05MultiProperties extends ConstraintLayout { - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; + int multiPropertiesStatus = 0; + int multiPropertiesCount = 2; public Practice05MultiProperties(Context context) { super(context); @@ -31,6 +36,7 @@ protected void onAttachedToWindow() { super.onAttachedToWindow(); animateBt = (Button) findViewById(R.id.animateBt); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); imageView = (ImageView) findViewById(R.id.imageView); imageView.setScaleX(0); imageView.setScaleY(0); @@ -39,7 +45,107 @@ protected void onAttachedToWindow() { @Override public void onClick(View v) { // TODO 在这里处理点击事件,同时对多个属性做动画 + + switch (multiPropertiesStatus) { + case 0: + imageView.animate() + .scaleX(1) + .scaleY(1) + .rotation(360) + .alpha(1) + .translationX(Utils.dpToPixel(200)); + break; + case 1: + imageView.animate() + .scaleX(0) + .scaleY(0) + .rotation(0) + .alpha(0) + .translationX(0); + break; + } + + multiPropertiesStatus++; + if (multiPropertiesStatus == multiPropertiesCount) { + multiPropertiesStatus = 0; + } } }); + + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (multiPropertiesStatus) { + case 0: + AnimatorSet animatorSet = new AnimatorSet(); + animatorSet.playTogether( + ObjectAnimator.ofFloat( + imageView, + "scaleX", + 1 + ), + ObjectAnimator.ofFloat( + imageView, + "scaleY", + 1 + ), + ObjectAnimator.ofFloat( + imageView, + "rotation", + 360 + ), + ObjectAnimator.ofFloat( + imageView, + "alpha", + 1 + ), + ObjectAnimator.ofFloat( + imageView, + "translationX", + Utils.dpToPixel(200) + ) + ); + animatorSet.start(); + break; + case 1: + AnimatorSet animatorSet1 = new AnimatorSet(); + animatorSet1.playTogether( + ObjectAnimator.ofFloat( + imageView, + "scaleX", + 0 + ), + ObjectAnimator.ofFloat( + imageView, + "scaleY", + 0 + ), + ObjectAnimator.ofFloat( + imageView, + "rotation", + 0 + ), + ObjectAnimator.ofFloat( + imageView, + "alpha", + 0 + ), + ObjectAnimator.ofFloat( + imageView, + "translationX", + 0 + ) + ); + animatorSet1.start(); + break; + } + + multiPropertiesStatus++; + if (multiPropertiesStatus == multiPropertiesCount) { + multiPropertiesStatus = 0; + } + } + }); + } } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice06Duration.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice06Duration.java index 0af588c..e53c5a6 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice06Duration.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice06Duration.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice; +import android.animation.ObjectAnimator; import android.content.Context; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -11,15 +12,19 @@ import android.widget.TextView; import com.hencoder.hencoderpracticedraw6.R; +import com.hencoder.hencoderpracticedraw6.Utils; public class Practice06Duration extends LinearLayout { SeekBar durationSb; TextView durationValueTv; - Button animateBt; + Button animateBt, objectAnimateBt; ImageView imageView; int duration = 300; + int durationStatus = 0; + int durationCount = 2; + public Practice06Duration(Context context) { super(context); } @@ -59,11 +64,49 @@ public void onStopTrackingTouch(SeekBar seekBar) { }); animateBt = (Button) findViewById(R.id.animateBt); + objectAnimateBt = (Button) findViewById(R.id.objectAnimateBt); imageView = (ImageView) findViewById(R.id.imageView); animateBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 在这里处理点击事件,执行动画。记得使用 `setDuration(duration)` 来设置动画的时长。 + switch (durationStatus) { + case 0: + imageView.animate().setDuration(duration).translationX(Utils.dpToPixel(200)); + break; + case 1: + imageView.animate().setDuration(duration).translationX(0); + break; + } + durationStatus++; + if (durationStatus == durationCount) { + durationStatus = 0; + } + } + }); + objectAnimateBt.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + switch (durationStatus) { + case 0: + ObjectAnimator.ofFloat( + imageView, + "translationX", + Utils.dpToPixel(200) + ).setDuration(duration).start(); + break; + case 1: + ObjectAnimator.ofFloat( + imageView, + "translationX", + Utils.dpToPixel(0) + ).setDuration(duration).start(); + break; + } + durationStatus++; + if (durationStatus == durationCount) { + durationStatus = 0; + } } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice07Interpolator.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice07Interpolator.java index d2a61ee..8944cb3 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice07Interpolator.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/Practice07Interpolator.java @@ -86,6 +86,12 @@ public void onClick(View v) { .translationX(Utils.dpToPixel(150)) .setDuration(600) .setInterpolator(interpolators[spinner.getSelectedItemPosition()]) + .withStartAction(new Runnable() { + @Override + public void run() { + + } + }) .withEndAction(new Runnable() { @Override public void run() { diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorLayout.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorLayout.java index dc367dd..221bf04 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorLayout.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorLayout.java @@ -1,5 +1,6 @@ package com.hencoder.hencoderpracticedraw6.practice.practice08; +import android.animation.ObjectAnimator; import android.content.Context; import android.util.AttributeSet; import android.view.View; @@ -38,6 +39,13 @@ public void onClick(View v) { // 1. 用 ObjectAnimator 创建 Animator 对象 // 2. 用 start() 执行动画 // *. 记得在 Practice08ObjectAnimatorView 中为 progress 添加 setter/ getter 方法! + + ObjectAnimator.ofFloat( + view, + "progress", + 0, + 65 + ).setDuration(3000).start(); } }); } diff --git a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorView.java b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorView.java index 79a41f6..e9fa6c2 100644 --- a/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorView.java +++ b/app/src/main/java/com/hencoder/hencoderpracticedraw6/practice/practice08/Practice08ObjectAnimatorView.java @@ -20,6 +20,15 @@ public class Practice08ObjectAnimatorView extends View { // TODO 为 progress 添加 getter 和 setter 方法(setter 方法记得加 invalidate()) float progress = 0; + public float getProgress() { + return progress; + } + + public void setProgress(float progress) { + this.progress = progress; + invalidate(); + } + public Practice08ObjectAnimatorView(Context context) { super(context); } diff --git a/app/src/main/res/layout/practice_alpha.xml b/app/src/main/res/layout/practice_alpha.xml index f82903e..d919ff4 100644 --- a/app/src/main/res/layout/practice_alpha.xml +++ b/app/src/main/res/layout/practice_alpha.xml @@ -21,4 +21,14 @@ android:text="@string/animate" android:textSize="16sp" /> +