From fc2ef73b174feab9d3db4c2ff4fb283747104ad4 Mon Sep 17 00:00:00 2001 From: xuxinjiang <897743058@qq.com> Date: Sun, 18 Aug 2019 08:50:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 + .../com/skl/permissiontool/MainActivity.java | 34 ++-- .../springyanimator/SpringAnimationType.java | 17 ++ .../SpringyAdapterAnimationType.java | 12 ++ .../SpringyAdapterAnimator.java | 183 +++++++++++++++++ .../springyanimator/SpringyAnimator.java | 190 ++++++++++++++++++ .../springyanimator/SpringyListener.java | 19 ++ app/src/main/res/layout/activity_main.xml | 6 +- 8 files changed, 450 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/skl/permissiontool/springyanimator/SpringAnimationType.java create mode 100644 app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimationType.java create mode 100644 app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimator.java create mode 100644 app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAnimator.java create mode 100644 app/src/main/java/com/skl/permissiontool/springyanimator/SpringyListener.java diff --git a/app/build.gradle b/app/build.gradle index 5ac665b..f60a4ed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,4 +27,8 @@ dependencies { androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(path: ':permissionlib') + implementation 'pub.devrel:easypermissions:1.2.0' + implementation 'com.android.support:recyclerview-v7:29.0.0' + //动画 + implementation 'com.facebook.rebound:rebound:0.3.8' } diff --git a/app/src/main/java/com/skl/permissiontool/MainActivity.java b/app/src/main/java/com/skl/permissiontool/MainActivity.java index 2f353c0..076871a 100644 --- a/app/src/main/java/com/skl/permissiontool/MainActivity.java +++ b/app/src/main/java/com/skl/permissiontool/MainActivity.java @@ -5,15 +5,23 @@ import android.Manifest; import android.os.Bundle; import android.util.Log; +import android.view.View; import com.skl.permissionlib.PermissionUtil; import com.skl.permissionlib.PermissionsInterface; +import com.skl.permissiontool.springyanimator.SpringAnimationType; +import com.skl.permissiontool.springyanimator.SpringyAnimator; -import java.util.ArrayList; -import java.util.List; public class MainActivity extends AppCompatActivity { + + //可以传数组,还可以传单个多个 + String[] array = new String[]{ + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.READ_PHONE_STATE}; + /** * @param savedInstanceState */ @@ -22,18 +30,9 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - //可以传数组,还可以传单个多个 - String[] array = new String[]{ - Manifest.permission.ACCESS_COARSE_LOCATION, - Manifest.permission.ACCESS_FINE_LOCATION, - Manifest.permission.READ_PHONE_STATE}; - - //可以传list集合 - List list = new ArrayList<>(); - list.add(Manifest.permission.ACCESS_COARSE_LOCATION); - list.add(Manifest.permission.ACCESS_COARSE_LOCATION); - list.add(Manifest.permission.ACCESS_COARSE_LOCATION); + } + public void helloClick(View view) { PermissionUtil.builder(this).addPermissions(array).addPerName("定位").execute(new PermissionsInterface() { @Override public void allAgree() { @@ -60,6 +59,15 @@ public void refusAndNotPrompt(String permission) { Log.e("yyy", "-----------被拒绝且选择了不再提示的权限---------->" + permission); } }); + } + /** + * 点击缩放动画 + */ + public static void animateView(View view) { + SpringyAnimator springHelper = new SpringyAnimator(SpringAnimationType.SCALEXY, 500, 4, 0, 1); + springHelper.startSpring(view); } + + } diff --git a/app/src/main/java/com/skl/permissiontool/springyanimator/SpringAnimationType.java b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringAnimationType.java new file mode 100644 index 0000000..3157b98 --- /dev/null +++ b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringAnimationType.java @@ -0,0 +1,17 @@ +package com.skl.permissiontool.springyanimator; + +/** + * Created by salman on 21/11/16. + */ + +public enum SpringAnimationType { + TRANSLATEX, + TRANSLATEY, + ROTATEX, + ROTATEY, + SCALEXY, + SCALEX, + SCALEY, + ALPHA, + ROTATION +} diff --git a/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimationType.java b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimationType.java new file mode 100644 index 0000000..8ff8869 --- /dev/null +++ b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimationType.java @@ -0,0 +1,12 @@ +package com.skl.permissiontool.springyanimator; + +/** + * Created by Zach on 7/1/2017. + */ + +public enum SpringyAdapterAnimationType { + SLIDE_FROM_BOTTOM, + SLIDE_FROM_RIGHT, + SLIDE_FROM_LEFT, + SCALE +} diff --git a/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimator.java b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimator.java new file mode 100644 index 0000000..d831d3c --- /dev/null +++ b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAdapterAnimator.java @@ -0,0 +1,183 @@ +package com.skl.permissiontool.springyanimator; + + +import android.view.View; + +import androidx.recyclerview.widget.RecyclerView; + +import com.facebook.rebound.SimpleSpringListener; +import com.facebook.rebound.Spring; +import com.facebook.rebound.SpringConfig; +import com.facebook.rebound.SpringSystem; +import com.facebook.rebound.SpringUtil; + + +/** + * Created by Zach on 6/30/2017. + */ + +public class SpringyAdapterAnimator { + + private static final int INIT_DELAY = 100; + + private static final int INIT_TENSION = 200; + private static final int INIT_FRICTION = 20; + + private int tension; + private int fraction ; + + + private static final int PER_ITEM_GAPE = 100; + + private int parentHeight; + private int parentWidth; + private RecyclerView parent; + private SpringSystem mSpringSystem; + private SpringyAdapterAnimationType animationType; + private boolean mFirstViewInit = true; + private int mLastPosition = -1; + private int mStartDelay; + + public SpringyAdapterAnimator(RecyclerView recyclerView) { + parent = recyclerView; + mSpringSystem = SpringSystem.create(); + animationType = SpringyAdapterAnimationType.SLIDE_FROM_BOTTOM; + parentHeight = parent.getResources().getDisplayMetrics().heightPixels; + parentWidth = parent.getResources().getDisplayMetrics().widthPixels; + mStartDelay = INIT_DELAY; + tension = INIT_TENSION; + fraction= INIT_FRICTION; + } +/* +* setInitDelay @param initDelay for set delay at screen creation +* */ + public void setInitDelay(int initDelay){ + mStartDelay = initDelay; + } + + public void setSpringAnimationType(SpringyAdapterAnimationType type){ + animationType = type; + } + + + public void addConfig(int tension,int fraction){ + this.tension = tension; + this.fraction = fraction; + } + + /** + * onSpringyItemCreate call in Adapter's Constructor method + * @param item itemView instance from RecyclerView's OnCreateView method + * **/ + public void onSpringItemCreate(View item) { + + if (mFirstViewInit) { + setAnimation(item, mStartDelay, tension, fraction); + mStartDelay += PER_ITEM_GAPE; + } + } + + + /** + * * onSpringyItemBind call in RecyclerView's onBind for scroll effects + * @param item itemView instance from RecyclerView's onBind method + * @param position from RecyclerView's onBind method + * **/ + public void onSpringItemBind(View item, int position) { + + if (!mFirstViewInit && position > mLastPosition) { + setAnimation(item, 0, tension - tension/4, fraction); + mLastPosition = position; + } + } + + + private void setAnimation(final View item, final int delay, + final int tension, final int friction) { + setInitValue(item); + Runnable startAnimation = new Runnable() { + @Override + public void run() { + SpringConfig config = new SpringConfig(tension, friction); + Spring spring = mSpringSystem.createSpring(); + spring.setSpringConfig(config); + spring.addListener(new SimpleSpringListener() { + @Override + public void onSpringUpdate(Spring spring) { + switch (animationType) { + case SLIDE_FROM_BOTTOM: + item.setTranslationY(getMappedValue(spring)); + break; + case SLIDE_FROM_LEFT: + item.setTranslationX(getMappedValue(spring)); + break; + case SLIDE_FROM_RIGHT: + item.setTranslationX(getMappedValue(spring)); + break; + case SCALE: + item.setScaleX(getMappedValue(spring)); + item.setScaleY(getMappedValue(spring)); + break; + } + + } + + @Override + public void onSpringEndStateChange(Spring spring) { + mFirstViewInit = false; + } + }); + spring.setEndValue(1); + + } + }; + + parent.postDelayed(startAnimation, delay); + } + + private void setInitValue(View item) { + + switch (animationType) { + case SLIDE_FROM_BOTTOM: + item.setTranslationY(parentHeight); + break; + case SLIDE_FROM_LEFT: + item.setTranslationX(-parentWidth); + break; + case SLIDE_FROM_RIGHT: + item.setTranslationX(parentWidth); + break; + case SCALE: + item.setScaleX(0); + item.setScaleY(0); + break; + default: + item.setTranslationY(parentHeight); + break; + } + } + + private float getMappedValue(Spring spring) { + + float value; + switch (animationType) { + case SLIDE_FROM_BOTTOM: + value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, parentHeight, 0); + break; + case SLIDE_FROM_LEFT: + value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, -parentWidth, 0); + break; + case SLIDE_FROM_RIGHT: + value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, parentWidth, 0); + break; + case SCALE: + value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, 0, 1); + break; + default: + value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, parentHeight, 0); + break; + } + return value; + } + +} diff --git a/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAnimator.java b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAnimator.java new file mode 100644 index 0000000..0988a00 --- /dev/null +++ b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyAnimator.java @@ -0,0 +1,190 @@ +package com.skl.permissiontool.springyanimator; + +import android.view.View; + +import com.facebook.rebound.SimpleSpringListener; +import com.facebook.rebound.Spring; +import com.facebook.rebound.SpringConfig; +import com.facebook.rebound.SpringSystem; +import com.facebook.rebound.SpringUtil; + + +/** + * Created by salman on 17/11/16. + */ + +public class SpringyAnimator { + private float startValue, endValue; + private static final float DEFAULT_TENSION = 40; + private static final float DEFAULT_FRACTION = 7; + private double tension,fraction; + private SpringSystem springSystem; + private SpringAnimationType animationType; + private SpringyListener springAnimatorListener; + private int delay = 0; + + + /** + * Constructor for with Animation Type + Spring config + animation Values + * * @param springConfig config class for the spring + * @param type SpringyAnimationType instance for animation type + * @param tension Spring tension for animation type + * @param fraction Spring fraction value for animation + * @param startValue where animation start from + * @param endValue where animation ends to + * **/ + + + public SpringyAnimator(SpringAnimationType type, double tension, + double fraction, float startValue, float endValue) { + this.tension = tension; + this.fraction = fraction; + this.startValue = startValue; + this.endValue = endValue; + springSystem = SpringSystem.create(); + animationType = type; + + } + + + + /** + * Constructor for with Animation Type + default config for spring + animation Values + * * @param springConfig config class for the spring + * @param type SpringyAnimationType instance for animation type + * @param startValue where animation start from + * @param endValue where animation ends to + * **/ + public SpringyAnimator(SpringAnimationType type, float startValue, + float endValue) { + this.tension = DEFAULT_TENSION; + this.fraction = DEFAULT_FRACTION; + this.startValue = startValue; + this.endValue = endValue; + springSystem = SpringSystem.create(); + animationType = type; + + } + + + + + /** + * @param delay int value for SpringyAnimation delay each item if we have multiple items in + * animation raw. + * **/ + public void setDelay(int delay) { + this.delay = delay; + } + + public void startSpring(final View view) { + setInitValue(view); + Runnable startAnimation = new Runnable() { + @Override + public void run() { + Spring spring = springSystem.createSpring(); + spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(tension, fraction)); + spring.addListener(new SimpleSpringListener() { + @Override + public void onSpringUpdate(Spring spring) { + view.setVisibility(View.VISIBLE); + final float value = (float) SpringUtil.mapValueFromRangeToRange(spring.getCurrentValue(), 0, 1, startValue, endValue); + switch (animationType) { + case TRANSLATEY: + view.setTranslationY(value); + break; + case TRANSLATEX: + view.setTranslationX(value); + break; + case ALPHA: + view.setAlpha(value); + break; + case SCALEY: + view.setScaleY(value); + break; + case SCALEX: + view.setScaleX(value); + break; + case SCALEXY: + view.setScaleY(value); + view.setScaleX(value); + break; + case ROTATEY: + view.setRotationY(value); + break; + case ROTATEX: + view.setRotationX(value); + break; + case ROTATION: + view.setRotation(value); + break; + } + } + + @Override + public void onSpringAtRest(Spring spring) { + if (springAnimatorListener != null){ + springAnimatorListener.onSpringStop(); + } + } + + @Override + public void onSpringActivate(Spring spring) { + if (springAnimatorListener != null){ + springAnimatorListener.onSpringStart(); + } + } + + }); + spring.setEndValue(1); + } + }; + view.postDelayed(startAnimation, delay); + + } + + /** + * @param view instance for set pre animation value + * **/ + private void setInitValue(View view) { + switch (animationType) { + case TRANSLATEY: + view.setTranslationY(startValue); + break; + case TRANSLATEX: + view.setTranslationX(startValue); + break; + case ALPHA: + view.setAlpha(startValue); + break; + case SCALEY: + view.setScaleY(startValue); + break; + case SCALEX: + view.setScaleX(startValue); + break; + case SCALEXY: + view.setScaleY(startValue); + view.setScaleX(startValue); + break; + case ROTATEY: + view.setRotationY(startValue); + break; + case ROTATEX: + view.setRotationX(startValue); + break; + case ROTATION: + view.setRotation(startValue); + break; + } + } + +/* +* Springy Listener to track the Spring +* */ + public void setSpringyListener(SpringyListener springyListener) { + this.springAnimatorListener = springyListener; + } + + +} diff --git a/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyListener.java b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyListener.java new file mode 100644 index 0000000..0bcc5ce --- /dev/null +++ b/app/src/main/java/com/skl/permissiontool/springyanimator/SpringyListener.java @@ -0,0 +1,19 @@ +package com.skl.permissiontool.springyanimator; + +/** + * Created by Salman_Zach on 11/25/2016. + */ + +public interface SpringyListener { + + /* + * hits when Spring is Active + * */ + void onSpringStart(); + + /* + * hits when Spring is inActive + * */ + + void onSpringStop(); +} diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc2444..3c01280 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,15 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + app:layout_constraintTop_toTopOf="parent" + tools:ignore="OnClick" /> \ No newline at end of file