From 2c46e9420264a0ce63931b03f752855cf68da75e Mon Sep 17 00:00:00 2001 From: wang-peiming Date: Thu, 23 Feb 2023 17:29:45 +0800 Subject: [PATCH] #8 #7 #6 #2 Support Exit Animations --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 6 +- app/src/main/java/anim/Anim.java | 11 +- app/src/main/java/anim/AnimBaiYeChuang.java | 6 +- app/src/main/java/anim/AnimCaChu.java | 8 +- app/src/main/java/anim/AnimHeZhuang.java | 7 +- app/src/main/java/anim/AnimJieTi.java | 7 +- app/src/main/java/anim/AnimLingXing.java | 7 +- app/src/main/java/anim/AnimLunZi.java | 7 +- app/src/main/java/anim/AnimPiLie.java | 6 +- app/src/main/java/anim/AnimQiPan.java | 6 +- app/src/main/java/anim/AnimQieRu.java | 8 +- .../main/java/anim/AnimShanXingZhanKai.java | 7 +- .../main/java/anim/AnimShiZiXingKuoZhan.java | 9 +- app/src/main/java/anim/AnimSuiJiXianTiao.java | 6 +- .../main/java/anim/AnimXiangNeiRongJie.java | 6 +- .../main/java/anim/AnimYuanXingKuoZhan.java | 6 +- .../wangpm/enteranimation/AnimActivity.java | 216 ++++++++++++++ .../enteranimation/EnterAnimLayout.java | 38 ++- .../wangpm/enteranimation/MainActivity.java | 137 +-------- app/src/main/res/layout/activity_anims.xml | 278 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 235 +-------------- 22 files changed, 614 insertions(+), 407 deletions(-) create mode 100644 app/src/main/java/com/wangpm/enteranimation/AnimActivity.java create mode 100644 app/src/main/res/layout/activity_anims.xml diff --git a/app/build.gradle b/app/build.gradle index fd09f0d..c145009 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "com.wangpm.enteranimation" minSdkVersion 19 targetSdkVersion 33 - versionCode 1 - versionName "1.0" + versionCode 2 + versionName "2.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4c545f4..92f48f0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,13 +8,17 @@ android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> - + + + \ No newline at end of file diff --git a/app/src/main/java/anim/Anim.java b/app/src/main/java/anim/Anim.java index cc0ec25..ca965ed 100644 --- a/app/src/main/java/anim/Anim.java +++ b/app/src/main/java/anim/Anim.java @@ -1,7 +1,7 @@ package anim; import android.graphics.Canvas; -import android.view.View; +import android.util.Log; import com.wangpm.enteranimation.EnterAnimLayout; @@ -13,23 +13,28 @@ public abstract class Anim { protected float w; protected float h; public float totalPaintTime;//控制绘制时间 + public boolean isExitAnim = false; public Anim(EnterAnimLayout view) { this(view,2000); } public Anim(EnterAnimLayout view, float totalPaintTime) { + this(view, totalPaintTime, false); + } + + public Anim(EnterAnimLayout view, float totalPaintTime, boolean isExitAnim) { this.totalPaintTime = totalPaintTime; this.view = view; this.view.setAnim(this); w = view.getWidth(); h = view.getHeight(); + this.isExitAnim = isExitAnim; } public void startAnimation() { - view.setmIsAnimaionRun(true); + view.setIsAnimationRun(true); view.setStartTime(System.currentTimeMillis()); - view.invalidate(); } public void startAnimation(long animTime) { diff --git a/app/src/main/java/anim/AnimBaiYeChuang.java b/app/src/main/java/anim/AnimBaiYeChuang.java index a7ffa7d..ec479d2 100644 --- a/app/src/main/java/anim/AnimBaiYeChuang.java +++ b/app/src/main/java/anim/AnimBaiYeChuang.java @@ -28,7 +28,11 @@ public void handleCanvas(Canvas canvas, float rate) { float bottom = top + h / lines * rate; path.addRect(0, top, w, bottom, Path.Direction.CW); } - canvas.clipPath(path); + if(isExitAnim) { + canvas.clipPath(path, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimCaChu.java b/app/src/main/java/anim/AnimCaChu.java index 775d576..3edbf19 100644 --- a/app/src/main/java/anim/AnimCaChu.java +++ b/app/src/main/java/anim/AnimCaChu.java @@ -1,6 +1,7 @@ package anim; import android.graphics.Canvas; +import android.graphics.Region; import android.view.View; import com.wangpm.enteranimation.EnterAnimLayout; @@ -18,8 +19,11 @@ public AnimCaChu(EnterAnimLayout view) { public void handleCanvas(Canvas canvas, float rate) { float rectTop = (h - h * rate); //剪切当前需要展示区域的左上右下 - canvas.clipRect(0, rectTop, w, h); - + if(isExitAnim) { + canvas.clipRect(0, rectTop, w, h, Region.Op.DIFFERENCE); + }else{ + canvas.clipRect(0, rectTop, w, h); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimHeZhuang.java b/app/src/main/java/anim/AnimHeZhuang.java index ebcdfd5..335c5d4 100644 --- a/app/src/main/java/anim/AnimHeZhuang.java +++ b/app/src/main/java/anim/AnimHeZhuang.java @@ -24,8 +24,11 @@ public void handleCanvas(Canvas canvas, float rate) { float rectBottom = h - rectTop; //剪切需要展示的区域 - canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom, Region.Op.DIFFERENCE); - + if(isExitAnim) { + canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom); + }else{ + canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom, Region.Op.DIFFERENCE); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimJieTi.java b/app/src/main/java/anim/AnimJieTi.java index f7fd5b3..89236af 100644 --- a/app/src/main/java/anim/AnimJieTi.java +++ b/app/src/main/java/anim/AnimJieTi.java @@ -44,8 +44,11 @@ public void handleCanvas(Canvas canvas, float rate) { float bottom = top + h / lineNum; path.addRect(left,top,right,bottom, Path.Direction.CW); } - canvas.clipPath(path); - + if(isExitAnim) { + canvas.clipPath(path, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimLingXing.java b/app/src/main/java/anim/AnimLingXing.java index ad7be11..e21311c 100644 --- a/app/src/main/java/anim/AnimLingXing.java +++ b/app/src/main/java/anim/AnimLingXing.java @@ -26,8 +26,11 @@ public void handleCanvas(Canvas canvas, float rate) { path1.lineTo(w/2, h+h/2 - h*rate); path1.lineTo(w+w/2 -w*rate, h/2); path1.close();//封闭 - canvas.clipPath(path1, Region.Op.DIFFERENCE); - + if(isExitAnim) { + canvas.clipPath(path1); + }else{ + canvas.clipPath(path1, Region.Op.DIFFERENCE); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimLunZi.java b/app/src/main/java/anim/AnimLunZi.java index eaadf55..80b367d 100644 --- a/app/src/main/java/anim/AnimLunZi.java +++ b/app/src/main/java/anim/AnimLunZi.java @@ -27,8 +27,11 @@ public void handleCanvas(Canvas canvas, float rate) { path1.addArc(oval,270,360*rate); path1.lineTo(w/2,h/2); path1.close();//封闭 - canvas.clipPath(path1); - + if(isExitAnim) { + canvas.clipPath(path1, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path1); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimPiLie.java b/app/src/main/java/anim/AnimPiLie.java index cb7b097..961f7d3 100644 --- a/app/src/main/java/anim/AnimPiLie.java +++ b/app/src/main/java/anim/AnimPiLie.java @@ -20,7 +20,11 @@ public AnimPiLie(EnterAnimLayout view) { public void handleCanvas(Canvas canvas, float rate) { float rectLeft = w / 2 * rate; float rectRight = w - w / 2 * rate; - canvas.clipRect(rectLeft, 0, rectRight, h, Region.Op.DIFFERENCE); + if(isExitAnim) { + canvas.clipRect(rectLeft, 0, rectRight, h); + }else{ + canvas.clipRect(rectLeft, 0, rectRight, h, Region.Op.DIFFERENCE); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimQiPan.java b/app/src/main/java/anim/AnimQiPan.java index 8f0636d..5b30051 100644 --- a/app/src/main/java/anim/AnimQiPan.java +++ b/app/src/main/java/anim/AnimQiPan.java @@ -35,7 +35,11 @@ public void handleCanvas(Canvas canvas, float rate) { path.addRect(left, top,right,bottom, Path.Direction.CW); } } - canvas.clipPath(path); + if(isExitAnim) { + canvas.clipPath(path, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimQieRu.java b/app/src/main/java/anim/AnimQieRu.java index 303e79d..c64c218 100644 --- a/app/src/main/java/anim/AnimQieRu.java +++ b/app/src/main/java/anim/AnimQieRu.java @@ -17,9 +17,11 @@ public AnimQieRu(EnterAnimLayout view) { @Override public void handleCanvas(Canvas canvas, float rate) { - - canvas.translate(0,h-h*rate); - + if(isExitAnim) { + canvas.translate(0,h*rate); + }else{ + canvas.translate(0,h-h*rate); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimShanXingZhanKai.java b/app/src/main/java/anim/AnimShanXingZhanKai.java index 52a86b2..574e219 100644 --- a/app/src/main/java/anim/AnimShanXingZhanKai.java +++ b/app/src/main/java/anim/AnimShanXingZhanKai.java @@ -3,6 +3,7 @@ import android.graphics.Canvas; import android.graphics.Path; import android.graphics.RectF; +import android.graphics.Region; import android.view.View; import com.wangpm.enteranimation.EnterAnimLayout; @@ -26,7 +27,11 @@ public void handleCanvas(Canvas canvas, float rate) { path1.addArc(oval,270-180*rate,360*rate); path1.lineTo(w/2,h/2); path1.close();//封闭 - canvas.clipPath(path1); + if(isExitAnim) { + canvas.clipPath(path1, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path1); + } canvas.save(); } diff --git a/app/src/main/java/anim/AnimShiZiXingKuoZhan.java b/app/src/main/java/anim/AnimShiZiXingKuoZhan.java index 24828ad..ff4a92e 100644 --- a/app/src/main/java/anim/AnimShiZiXingKuoZhan.java +++ b/app/src/main/java/anim/AnimShiZiXingKuoZhan.java @@ -26,9 +26,14 @@ public void handleCanvas(Canvas canvas, float rate) { float rectRight1 = w-rectLeft1; float rectTop1 = 0; float rectBottom1 = h; - canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom, Region.Op.DIFFERENCE); - canvas.clipRect(rectLeft1, rectTop1,rectRight1 , rectBottom1, Region.Op.DIFFERENCE); + if(isExitAnim) { + canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom); + canvas.clipRect(rectLeft1, rectTop1,rectRight1 , rectBottom1); + }else{ + canvas.clipRect(rectLeft, rectTop,rectRight , rectBottom, Region.Op.DIFFERENCE); + canvas.clipRect(rectLeft1, rectTop1,rectRight1 , rectBottom1, Region.Op.DIFFERENCE); + } canvas.save(); } } diff --git a/app/src/main/java/anim/AnimSuiJiXianTiao.java b/app/src/main/java/anim/AnimSuiJiXianTiao.java index 13b010d..bcd6c8b 100644 --- a/app/src/main/java/anim/AnimSuiJiXianTiao.java +++ b/app/src/main/java/anim/AnimSuiJiXianTiao.java @@ -56,7 +56,11 @@ public void handleCanvas(Canvas canvas, float rate) { //剩余线条数量 restNum = restNum - needNum; - canvas.clipPath(path); + if(isExitAnim) { + canvas.clipPath(path, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path); + } canvas.save(); } diff --git a/app/src/main/java/anim/AnimXiangNeiRongJie.java b/app/src/main/java/anim/AnimXiangNeiRongJie.java index 011ad62..dfa3150 100644 --- a/app/src/main/java/anim/AnimXiangNeiRongJie.java +++ b/app/src/main/java/anim/AnimXiangNeiRongJie.java @@ -61,7 +61,11 @@ public void handleCanvas(Canvas canvas, float rate) { } restNum = restNum - needNum; - canvas.clipPath(path); + if(isExitAnim) { + canvas.clipPath(path, Region.Op.DIFFERENCE); + }else{ + canvas.clipPath(path); + } canvas.save(); } diff --git a/app/src/main/java/anim/AnimYuanXingKuoZhan.java b/app/src/main/java/anim/AnimYuanXingKuoZhan.java index 6991886..b691b31 100644 --- a/app/src/main/java/anim/AnimYuanXingKuoZhan.java +++ b/app/src/main/java/anim/AnimYuanXingKuoZhan.java @@ -28,7 +28,11 @@ public void handleCanvas(Canvas canvas, float rate) { path1.addOval(oval, Path.Direction.CCW); path1.close();//封闭 - canvas.clipPath(path1, Region.Op.DIFFERENCE); + if(isExitAnim) { + canvas.clipPath(path1); + }else{ + canvas.clipPath(path1, Region.Op.DIFFERENCE); + } canvas.save(); } diff --git a/app/src/main/java/com/wangpm/enteranimation/AnimActivity.java b/app/src/main/java/com/wangpm/enteranimation/AnimActivity.java new file mode 100644 index 0000000..1829ec8 --- /dev/null +++ b/app/src/main/java/com/wangpm/enteranimation/AnimActivity.java @@ -0,0 +1,216 @@ +package com.wangpm.enteranimation; + +import android.app.Activity; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; + +import anim.Anim; +import anim.AnimBaiYeChuang; +import anim.AnimCaChu; +import anim.AnimHeZhuang; +import anim.AnimJieTi; +import anim.AnimLunZi; +import anim.AnimPiLie; +import anim.AnimQiPan; +import anim.AnimQieRu; +import anim.AnimShanXingZhanKai; +import anim.AnimShiZiXingKuoZhan; +import anim.AnimSuiJiXianTiao; +import anim.AnimXiangNeiRongJie; +import anim.AnimYuanXingKuoZhan; +import anim.AnimLingXing; + + +public class AnimActivity extends Activity implements View.OnClickListener { + private CheckBox mCheckBoxApplyActivity; + private CheckBox mCheckBoxIsExit; + + private EnterAnimLayout enterAnimLayout; + private EnterAnimLayout enterAnimRootView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_anims); + mCheckBoxApplyActivity = (CheckBox) findViewById(R.id.check_box_apply_activity); + mCheckBoxIsExit = (CheckBox) findViewById(R.id.check_box_is_exit); + + enterAnimLayout = (EnterAnimLayout) findViewById(R.id.anim_layout); + enterAnimRootView = (EnterAnimLayout) findViewById(R.id.activity_main); + + //打开页面时给anim_layout播放百叶窗效果 + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Anim anim = new AnimBaiYeChuang(enterAnimLayout); + anim.startAnimation(); + } + }, 1000); + + findViewById(R.id.btn_baiyechuang).setOnClickListener(this); + findViewById(R.id.btn_cachu).setOnClickListener(this); + findViewById(R.id.btn_hezhuang).setOnClickListener(this); + findViewById(R.id.btn_jieti).setOnClickListener(this); + findViewById(R.id.btn_lingxing).setOnClickListener(this); + findViewById(R.id.btn_lunzi).setOnClickListener(this); + findViewById(R.id.btn_pilie).setOnClickListener(this); + findViewById(R.id.btn_qipan).setOnClickListener(this); + findViewById(R.id.btn_qieru).setOnClickListener(this); + findViewById(R.id.btn_shanxingzhankai).setOnClickListener(this); + findViewById(R.id.btn_shizixingkuozhan).setOnClickListener(this); + findViewById(R.id.btn_suijixiantiao).setOnClickListener(this); + findViewById(R.id.btn_xiangneirongjie).setOnClickListener(this); + findViewById(R.id.btn_yuanxingkuozhan).setOnClickListener(this); + } + + @Override + public void onClick(final View view) { + Anim anim1 =null; + Anim anim2 =null; + EnterAnimLayout view1 = enterAnimLayout; + final EnterAnimLayout view2 = (EnterAnimLayout) view.getParent(); + //如果选中了checkbox,则播放整个页面,把activity的根view赋给view1,否则 view1为顶部的anim_layout + if (mCheckBoxApplyActivity.isChecked()) { + view1 = enterAnimRootView; + } + if(view1.isAnimationRun() || view2.isAnimationRun() ){ + // 正在播放动画中 + return; + } + switch (view.getId()) { + case R.id.btn_baiyechuang: + anim1 = new AnimBaiYeChuang(view1); + anim2 = new AnimBaiYeChuang(view2); + break; + case R.id.btn_cachu: + anim1 = new AnimCaChu(view1); + anim2 = new AnimCaChu(view2); + break; + case R.id.btn_hezhuang: + anim1 = new AnimHeZhuang(view1); + anim2 = new AnimHeZhuang(view2); + break; + case R.id.btn_jieti: + anim1 = new AnimJieTi(view1); + anim2 = new AnimJieTi(view2); + break; + case R.id.btn_lingxing: + anim1 = new AnimLingXing(view1); + anim2 = new AnimLingXing(view2); + break; + case R.id.btn_lunzi: + anim1 = new AnimLunZi(view1); + anim2 = new AnimLunZi(view2); + break; + case R.id.btn_pilie: + anim1 = new AnimPiLie(view1); + anim2 = new AnimPiLie(view2); + break; + case R.id.btn_qipan: + anim1 = new AnimQiPan(view1); + anim2 = new AnimQiPan(view2); + break; + case R.id.btn_qieru: + anim1 = new AnimQieRu(view1); + anim2 = new AnimQieRu(view2); + break; + case R.id.btn_shanxingzhankai: + anim1 = new AnimShanXingZhanKai(view1); + anim2 = new AnimShanXingZhanKai(view2); + break; + case R.id.btn_shizixingkuozhan: + anim1 = new AnimShiZiXingKuoZhan(view1); + anim2 = new AnimShiZiXingKuoZhan(view2); + break; + case R.id.btn_suijixiantiao: + anim1 = new AnimSuiJiXianTiao(view1); + anim2 = new AnimSuiJiXianTiao(view2); + break; + case R.id.btn_xiangneirongjie: + anim1 = new AnimXiangNeiRongJie(view1); + anim2 = new AnimXiangNeiRongJie(view2); + break; + case R.id.btn_yuanxingkuozhan: + anim1 = new AnimYuanXingKuoZhan(view1); + anim2 = new AnimYuanXingKuoZhan(view2); + break; + } + //如果选中了checkbox,则只播放anim1,anim1绑定的view为view1,view1之前赋值为acitivity的根view + //否则播放anim_layout和当前button的动画 + //参数为动画播放总时间 + if (mCheckBoxIsExit.isChecked()){ + anim1.isExitAnim = true; + anim2.isExitAnim = true; + } + if (mCheckBoxApplyActivity.isChecked()) { + if(view1.isAnimationRun()){ + return; + } + anim1.startAnimation(2000); + } else { + anim1.startAnimation(2000); + anim2.startAnimation(2000); + } + + final EnterAnimLayout finalView = view1; + if(!mCheckBoxApplyActivity.isChecked() && mCheckBoxIsExit.isChecked()){ + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + // exit动画播放完成后移除view2 + if(view2 != null) { + ViewGroup view2Parent = (ViewGroup) view2.getParent(); + if (view2Parent != null) { + view2Parent.removeView(view2); + } + } + + // exit动画播放完成后保留view1 + finalView.setIsAnimationRun(false); + finalView.invalidate(); + } + }, 2000); + } + + if (mCheckBoxApplyActivity.isChecked() && mCheckBoxIsExit.isChecked()){ + AnimActivity.this.setDisableAllClick(true); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + // 选择 Activity的exit动画播放完成后finish掉 Activity + AnimActivity.this.finish(); + AnimActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); + + // 选择 Activity的exit动画播放完成后保留 Activity +// AnimActivity.this.setDisableAllClick(false); +// finalView.setIsAnimationRun(false); +// finalView.invalidate(); + } + }, 2000); + } + } + + + private boolean disableAllClick = false; + + //禁用所有触摸事件 + public Activity setDisableAllClick(boolean disableAllClick) { + this.disableAllClick = disableAllClick; + return this; + } + + public boolean dispatchTouchEvent(MotionEvent ev) { + if (!disableAllClick) { + return super.dispatchTouchEvent(ev); + } else { + return true; + } + + } + +} diff --git a/app/src/main/java/com/wangpm/enteranimation/EnterAnimLayout.java b/app/src/main/java/com/wangpm/enteranimation/EnterAnimLayout.java index 679aea2..3403996 100644 --- a/app/src/main/java/com/wangpm/enteranimation/EnterAnimLayout.java +++ b/app/src/main/java/com/wangpm/enteranimation/EnterAnimLayout.java @@ -7,8 +7,6 @@ import android.view.MotionEvent; import android.widget.FrameLayout; -import com.wangpm.enteranimation.R; - import anim.Anim; /** @@ -18,7 +16,7 @@ public class EnterAnimLayout extends FrameLayout { private Anim anim ; //需要播放的动画类型 private long startTime = 0;//开始时间 - private boolean mIsAnimaionRun = false;//开始播放动画的标志位,设置为true,然后invalidate即开始播放动画 + private boolean mIsAnimationRun = false;//开始播放动画的标志位,设置为true,然后invalidate即开始播放动画 private boolean mIsVisibleAtFirst = true;//view所在页面打开时是否显示此view public EnterAnimLayout(Context context) { @@ -58,12 +56,12 @@ public long getStartTime() { public void setStartTime(long startTime) { this.startTime = startTime; } - public boolean ismIsAnimaionRun() { - return mIsAnimaionRun; + public boolean isAnimationRun() { + return mIsAnimationRun; } - public void setmIsAnimaionRun(boolean mIsAnimaionRun) { - this.mIsAnimaionRun = mIsAnimaionRun; + public void setIsAnimationRun(boolean mIsAnimationRun) { + this.mIsAnimationRun = mIsAnimationRun; } @@ -71,16 +69,16 @@ public void setmIsAnimaionRun(boolean mIsAnimaionRun) { @Override protected void dispatchDraw(Canvas canvas) { //如果设置了打开页面时正常显示,并且未设置播放动画,则正常分发draw - if (mIsVisibleAtFirst && !mIsAnimaionRun) { + if (mIsVisibleAtFirst && !mIsAnimationRun) { super.dispatchDraw(canvas); return; } //如果设置了打开页面时控件先不可见,并且未设置播放动画,则不分发draw - if (!mIsVisibleAtFirst && !mIsAnimaionRun) { + if (!mIsVisibleAtFirst && !mIsAnimationRun) { return; } - //mIsAnimaionRun 为true,播放动画,自定义分发draw + //mIsAnimationRun 为true,播放动画,自定义分发draw //计算动画已播放时间比率rate=(当前时间-动画开始时间)/总共需要播放的时间 long currentTime = System.currentTimeMillis(); @@ -96,19 +94,19 @@ protected void dispatchDraw(Canvas canvas) { if (rate < 1) { invalidate(); } else { - mIsAnimaionRun = false; + mIsAnimationRun = false; mIsVisibleAtFirst = true; } } - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - //正在播放动画时点击才拦截 - if (ev.getAction() == MotionEvent.ACTION_DOWN && mIsAnimaionRun == true) { - mIsAnimaionRun = false; - return true; - } - return super.onInterceptTouchEvent(ev); - } +// @Override +// public boolean onInterceptTouchEvent(MotionEvent ev) { +// //正在播放动画时点击才拦截 +// if (ev.getAction() == MotionEvent.ACTION_DOWN && mIsAnimationRun == true) { +// mIsAnimationRun = false; +// return true; +// } +// return super.onInterceptTouchEvent(ev); +// } } diff --git a/app/src/main/java/com/wangpm/enteranimation/MainActivity.java b/app/src/main/java/com/wangpm/enteranimation/MainActivity.java index a2fc912..c9b99b8 100644 --- a/app/src/main/java/com/wangpm/enteranimation/MainActivity.java +++ b/app/src/main/java/com/wangpm/enteranimation/MainActivity.java @@ -1,145 +1,20 @@ package com.wangpm.enteranimation; import android.app.Activity; +import android.content.Intent; import android.os.Bundle; -import android.os.Handler; import android.view.View; -import android.widget.CheckBox; - -import anim.Anim; -import anim.AnimBaiYeChuang; -import anim.AnimCaChu; -import anim.AnimHeZhuang; -import anim.AnimJieTi; -import anim.AnimLunZi; -import anim.AnimPiLie; -import anim.AnimQiPan; -import anim.AnimQieRu; -import anim.AnimShanXingZhanKai; -import anim.AnimShiZiXingKuoZhan; -import anim.AnimSuiJiXianTiao; -import anim.AnimXiangNeiRongJie; -import anim.AnimYuanXingKuoZhan; -import anim.AnimLingXing; - - -public class MainActivity extends Activity implements View.OnClickListener { - private CheckBox mCheckBox; - - private EnterAnimLayout enterAnimLayout; - private EnterAnimLayout enterAnimRootView; +public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - mCheckBox = (CheckBox) findViewById(R.id.check_box); - - enterAnimLayout = (EnterAnimLayout) findViewById(R.id.anim_layout); - enterAnimRootView = (EnterAnimLayout) findViewById(R.id.activity_main); - - //打开页面时给anim_layout播放百叶窗效果 - new Handler().postDelayed(new Runnable() { - @Override - public void run() { - Anim anim = new AnimBaiYeChuang(enterAnimLayout); - anim.startAnimation(); - } - }, 1000); - - findViewById(R.id.btn_baiyechuang).setOnClickListener(this); - findViewById(R.id.btn_cachu).setOnClickListener(this); - findViewById(R.id.btn_hezhuang).setOnClickListener(this); - findViewById(R.id.btn_jieti).setOnClickListener(this); - findViewById(R.id.btn_lingxing).setOnClickListener(this); - findViewById(R.id.btn_lunzi).setOnClickListener(this); - findViewById(R.id.btn_pilie).setOnClickListener(this); - findViewById(R.id.btn_qipan).setOnClickListener(this); - findViewById(R.id.btn_qieru).setOnClickListener(this); - findViewById(R.id.btn_shanxingzhankai).setOnClickListener(this); - findViewById(R.id.btn_shizixingkuozhan).setOnClickListener(this); - findViewById(R.id.btn_suijixiantiao).setOnClickListener(this); - findViewById(R.id.btn_xiangneirongjie).setOnClickListener(this); - findViewById(R.id.btn_yuanxingkuozhan).setOnClickListener(this); } - @Override - public void onClick(View view) { - Anim anim1 =null; - Anim anim2 =null; - EnterAnimLayout view1 = enterAnimLayout; - EnterAnimLayout view2 = (EnterAnimLayout) view.getParent(); - //如果选中了checkbox,则播放整个页面,把activity的根view赋给view1,否则 view1为anim_layout - if (mCheckBox.isChecked()) { - view1 = enterAnimRootView; - } - switch (view.getId()) { - case R.id.btn_baiyechuang: - anim1 = new AnimBaiYeChuang(view1); - anim2 = new AnimBaiYeChuang(view2); - break; - case R.id.btn_cachu: - anim1 = new AnimCaChu(view1); - anim2 = new AnimCaChu(view2); - break; - case R.id.btn_hezhuang: - anim1 = new AnimHeZhuang(view1); - anim2 = new AnimHeZhuang(view2); - break; - case R.id.btn_jieti: - anim1 = new AnimJieTi(view1); - anim2 = new AnimJieTi(view2); - break; - case R.id.btn_lingxing: - anim1 = new AnimLingXing(view1); - anim2 = new AnimLingXing(view2); - break; - case R.id.btn_lunzi: - anim1 = new AnimLunZi(view1); - anim2 = new AnimLunZi(view2); - break; - case R.id.btn_pilie: - anim1 = new AnimPiLie(view1); - anim2 = new AnimPiLie(view2); - break; - case R.id.btn_qipan: - anim1 = new AnimQiPan(view1); - anim2 = new AnimQiPan(view2); - break; - case R.id.btn_qieru: - anim1 = new AnimQieRu(view1); - anim2 = new AnimQieRu(view2); - break; - case R.id.btn_shanxingzhankai: - anim1 = new AnimShanXingZhanKai(view1); - anim2 = new AnimShanXingZhanKai(view2); - break; - case R.id.btn_shizixingkuozhan: - anim1 = new AnimShiZiXingKuoZhan(view1); - anim2 = new AnimShiZiXingKuoZhan(view2); - break; - case R.id.btn_suijixiantiao: - anim1 = new AnimSuiJiXianTiao(view1); - anim2 = new AnimSuiJiXianTiao(view2); - break; - case R.id.btn_xiangneirongjie: - anim1 = new AnimXiangNeiRongJie(view1); - anim2 = new AnimXiangNeiRongJie(view2); - break; - case R.id.btn_yuanxingkuozhan: - anim1 = new AnimYuanXingKuoZhan(view1); - anim2 = new AnimYuanXingKuoZhan(view2); - break; - } - //如果选中了checkbox,则只播放anim1,anim1绑定的view为view1,view1之前赋值为acitivity的根view - //否则播放anim_layout和当前button的动画 - //参数为动画播放总时间 - if (mCheckBox.isChecked()) { - anim1.startAnimation(2000); - } else { - anim1.startAnimation(2000); - anim2.startAnimation(2000); - } - + public void goAnimActivity(View view) { + Intent intent = new Intent(this, AnimActivity.class); + this.startActivity(intent); } + } diff --git a/app/src/main/res/layout/activity_anims.xml b/app/src/main/res/layout/activity_anims.xml new file mode 100644 index 0000000..2bf0222 --- /dev/null +++ b/app/src/main/res/layout/activity_anims.xml @@ -0,0 +1,278 @@ + + + + + + + + + +