diff --git a/Demo.gif b/Demo.gif
deleted file mode 100644
index 1fbe171..0000000
Binary files a/Demo.gif and /dev/null differ
diff --git a/README.md b/README.md
index c49596f..66885b0 100644
--- a/README.md
+++ b/README.md
@@ -1,15 +1,21 @@
+# PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED
+
+* * *
+
+[](https://android-arsenal.com/details/1/2686)
+
AVLoadingIndicatorView
===================
+> **Now AVLoadingIndicatorView was updated version to 2.X , If you have any question or suggestion with this library , welcome to tell me !**
+
## Introduction
AVLoadingIndicatorView is a collection of nice loading animations for Android.
-You can also find IOS version of this [here](https://github.com/ninjaprox/NVActivityIndicatorView).
+You can also find iOS version of this [here](https://github.com/ninjaprox/NVActivityIndicatorView).
## Demo
-
-
-[Download Apk](https://github.com/81813780/AVLoadingIndicatorView/releases/download/getSampleApk/app-debug.apk)
+
## Usage
@@ -17,65 +23,147 @@ You can also find IOS version of this [here](https://github.com/ninjaprox/NVActi
Add dependencies in build.gradle.
```groovy
- dependencies {
- compile 'com.wang.avi:library:1.0.0'
- compile 'com.nineoldandroids:library:2.4.0'
- }
+ dependencies {
+ compile 'com.wang.avi:library:2.1.3'
+ }
```
### Step 2
Add the AVLoadingIndicatorView to your layout:
+
+Simple
+
```java
```
+Advance
+
+```java
+
+```
+
+### Step 3
+
+It's very simple use just like .
+```java
+ void startAnim(){
+ avi.show();
+ // or avi.smoothToShow();
+ }
+
+ void stopAnim(){
+ avi.hide();
+ // or avi.smoothToHide();
+ }
+
+```
+
+## Custom Indicator
+
+See [MyCustomIndicator](https://github.com/81813780/AVLoadingIndicatorView/blob/master/app/src/main/java/com/wang/avi/sample/MyCustomIndicator.java) in Sample .
+
+## Proguard
+
+When using proguard need add rules:
+
+```
+-keep class com.wang.avi.** { *; }
+-keep class com.wang.avi.indicators.** { *; }
+```
+
+Indicators is load from class names, proguard may change it (rename).
+
## Indicators
-Here they are
-
- * `BallPulse`
- * `BallGridPulse`
- * `BallClipRotate`
- * `BallClipRotatePulse`
- * `SquareSpin`
- * `BallClipRotateMultiple`
- * `BallPulseRise`
- * `BallRotate`
- * `CubeTransition`
- * `BallZigZag`
- * `BallZigZagDeflect`
- * `BallTrianglePath`
- * `BallScale`
- * `LineScale`
- * `LineScaleParty`
- * `BallScaleMultiple`
- * `BallPulseSync`
- * `BallBeat`
- * `LineScalePulseOut`
- * `LineScalePulseOutRapid`
- * `BallScaleRipple`
- * `BallScaleRippleMultiple`
- * `BallSpinFadeLoader`
- * `LineSpinFadeLoader`
- * `TriangleSkewSpin`
- * `Pacman`
- * `BallGridBeat`
- * `SemiCircleSpin`
+As seen above in the **Demo**, the indicators are as follows:
+
+**Row 1**
+ * `BallPulseIndicator`
+ * `BallGridPulseIndicator`
+ * `BallClipRotateIndicator`
+ * `BallClipRotatePulseIndicator`
+
+**Row 2**
+ * `SquareSpinIndicator`
+ * `BallClipRotateMultipleIndicator`
+ * `BallPulseRiseIndicator`
+ * `BallRotateIndicator`
+
+**Row 3**
+ * `CubeTransitionIndicator`
+ * `BallZigZagIndicator`
+ * `BallZigZagDeflectIndicator`
+ * `BallTrianglePathIndicator`
+
+**Row 4**
+ * `BallScaleIndicator`
+ * `LineScaleIndicator`
+ * `LineScalePartyIndicator`
+ * `BallScaleMultipleIndicator`
+
+**Row 5**
+ * `BallPulseSyncIndicator`
+ * `BallBeatIndicator`
+ * `LineScalePulseOutIndicator`
+ * `LineScalePulseOutRapidIndicator`
+
+**Row 6**
+ * `BallScaleRippleIndicator`
+ * `BallScaleRippleMultipleIndicator`
+ * `BallSpinFadeLoaderIndicator`
+ * `LineSpinFadeLoaderIndicator`
+
+**Row 7**
+ * `TriangleSkewSpinIndicator`
+ * `PacmanIndicator`
+ * `BallGridBeatIndicator`
+ * `SemiCircleSpinIndicator`
+
+**Row 8**
+ * `com.wang.avi.sample.MyCustomIndicator`
## Thanks
-- [nineoldandroids](https://github.com/JakeWharton/NineOldAndroids)
- [NVActivityIndicatorView](https://github.com/ninjaprox/NVActivityIndicatorView)
+- [Connor Atherton](https://github.com/ConnorAtherton)
-##Contact me
+## Contact me
- if you have a better idea or way on this project, please let me know, thanks:)
+ If you have a better idea or way on this project, please let me know, thanks :)
[Email](mailto:81813780@qq.com)
[Weibo](http://weibo.com/601265161)
+
+[My Blog](http://hlong.xyz)
+
+### License
+```
+Copyright 2015 jack wang
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+```
+
diff --git a/apk/app-debug.apk b/apk/app-debug.apk
new file mode 100644
index 0000000..3dfbfd5
Binary files /dev/null and b/apk/app-debug.apk differ
diff --git a/app-debug.apk b/app-debug.apk
deleted file mode 100644
index 04031bd..0000000
Binary files a/app-debug.apk and /dev/null differ
diff --git a/app/build.gradle b/app/build.gradle
index ce04e33..8807715 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,15 +1,15 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
+ compileSdkVersion 23
+ buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.wang.avi.sample"
- minSdkVersion 9
- targetSdkVersion 22
- versionCode 1
- versionName "1.0"
+ minSdkVersion 14
+ targetSdkVersion 23
+ versionCode 33
+ versionName "2.1.3"
}
buildTypes {
release {
@@ -21,6 +21,7 @@ android {
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
- compile 'com.android.support:appcompat-v7:22.2.0'
+ compile 'com.android.support:appcompat-v7:23.2.0'
+ compile 'com.android.support:recyclerview-v7:23.2.0'
compile project(':library')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ab87e26..342ead3 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
android:label="@string/app_name"
android:theme="@style/AppTheme" >
@@ -16,6 +16,7 @@
+
diff --git a/app/src/main/java/com/wang/avi/sample/IndicatorActivity.java b/app/src/main/java/com/wang/avi/sample/IndicatorActivity.java
new file mode 100644
index 0000000..94073c6
--- /dev/null
+++ b/app/src/main/java/com/wang/avi/sample/IndicatorActivity.java
@@ -0,0 +1,37 @@
+package com.wang.avi.sample;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+
+import com.wang.avi.AVLoadingIndicatorView;
+
+/**
+ * Created by Jack Wang on 2016/8/5.
+ */
+
+public class IndicatorActivity extends AppCompatActivity{
+
+ private AVLoadingIndicatorView avi;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_indicator);
+
+ String indicator=getIntent().getStringExtra("indicator");
+ avi= (AVLoadingIndicatorView) findViewById(R.id.avi);
+ avi.setIndicator(indicator);
+ }
+
+ public void hideClick(View view) {
+ avi.hide();
+ // or avi.smoothToHide();
+ }
+
+ public void showClick(View view) {
+ avi.show();
+ // or avi.smoothToShow();
+ }
+}
diff --git a/app/src/main/java/com/wang/avi/sample/MainActivity.java b/app/src/main/java/com/wang/avi/sample/MainActivity.java
deleted file mode 100644
index 48c2b1a..0000000
--- a/app/src/main/java/com/wang/avi/sample/MainActivity.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.wang.avi.sample;
-
-import android.support.v7.app.AppCompatActivity;
-import android.os.Bundle;
-
-
-public class MainActivity extends AppCompatActivity {
-
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_loading);
- }
-
-
-}
diff --git a/app/src/main/java/com/wang/avi/sample/MyCustomIndicator.java b/app/src/main/java/com/wang/avi/sample/MyCustomIndicator.java
new file mode 100644
index 0000000..56fe1a0
--- /dev/null
+++ b/app/src/main/java/com/wang/avi/sample/MyCustomIndicator.java
@@ -0,0 +1,72 @@
+package com.wang.avi.sample;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack Wang on 2016/8/5.
+ */
+
+public class MyCustomIndicator extends Indicator{
+
+
+ public static final float SCALE=1.0f;
+
+ //scale x ,y
+ private float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE};
+
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(Math.min(getWidth(),getHeight())-circleSpacing*2)/12;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ float y=getHeight() / 2;
+ for (int i = 0; i < 4; i++) {
+ canvas.save();
+ float translateX=x+(radius*2)*i+circleSpacing*i;
+ canvas.translate(translateX, y);
+ canvas.scale(scaleFloats[i], scaleFloats[i]);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+ int[] delays=new int[]{120,240,360,480};
+ for (int i = 0; i < 4; i++) {
+ final int index=i;
+
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);
+
+ scaleAnim.setDuration(750);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+
+ }
+ });
+ animators.add(scaleAnim);
+ }
+ return animators;
+ }
+
+
+}
diff --git a/app/src/main/java/com/wang/avi/sample/SampleActivity.java b/app/src/main/java/com/wang/avi/sample/SampleActivity.java
new file mode 100644
index 0000000..f6f2d8d
--- /dev/null
+++ b/app/src/main/java/com/wang/avi/sample/SampleActivity.java
@@ -0,0 +1,104 @@
+package com.wang.avi.sample;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.wang.avi.AVLoadingIndicatorView;
+
+/**
+ * Created by Jack Wang on 2016/8/5.
+ */
+
+public class SampleActivity extends AppCompatActivity{
+
+ private RecyclerView mRecycler;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_sample);
+
+ mRecycler= (RecyclerView) findViewById(R.id.recycler);
+
+ GridLayoutManager layoutManager=new GridLayoutManager(this,4);
+ mRecycler.setLayoutManager(layoutManager);
+ mRecycler.setAdapter(new RecyclerView.Adapter() {
+ @Override
+ public IndicatorHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View itemView=getLayoutInflater().inflate(R.layout.item_indicator,parent,false);
+ return new IndicatorHolder(itemView);
+ }
+
+ @Override
+ public void onBindViewHolder(IndicatorHolder holder, final int position) {
+ holder.indicatorView.setIndicator(INDICATORS[position]);
+ holder.itemLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ Intent intent=new Intent(SampleActivity.this,IndicatorActivity.class);
+ intent.putExtra("indicator",INDICATORS[position]);
+ startActivity(intent);
+ }
+ });
+ }
+
+ @Override
+ public int getItemCount() {
+ return INDICATORS.length;
+ }
+ });
+ }
+
+ final static class IndicatorHolder extends RecyclerView.ViewHolder{
+
+ public AVLoadingIndicatorView indicatorView;
+ public View itemLayout;
+
+ public IndicatorHolder(View itemView) {
+ super(itemView);
+ itemLayout= itemView.findViewById(R.id.itemLayout);
+ indicatorView= (AVLoadingIndicatorView) itemView.findViewById(R.id.indicator);
+ }
+ }
+
+
+
+ private static final String[] INDICATORS=new String[]{
+ "BallPulseIndicator",
+ "BallGridPulseIndicator",
+ "BallClipRotateIndicator",
+ "BallClipRotatePulseIndicator",
+ "SquareSpinIndicator",
+ "BallClipRotateMultipleIndicator",
+ "BallPulseRiseIndicator",
+ "BallRotateIndicator",
+ "CubeTransitionIndicator",
+ "BallZigZagIndicator",
+ "BallZigZagDeflectIndicator",
+ "BallTrianglePathIndicator",
+ "BallScaleIndicator",
+ "LineScaleIndicator",
+ "LineScalePartyIndicator",
+ "BallScaleMultipleIndicator",
+ "BallPulseSyncIndicator",
+ "BallBeatIndicator",
+ "LineScalePulseOutIndicator",
+ "LineScalePulseOutRapidIndicator",
+ "BallScaleRippleIndicator",
+ "BallScaleRippleMultipleIndicator",
+ "BallSpinFadeLoaderIndicator",
+ "LineSpinFadeLoaderIndicator",
+ "TriangleSkewSpinIndicator",
+ "PacmanIndicator",
+ "BallGridBeatIndicator",
+ "SemiCircleSpinIndicator",
+ "com.wang.avi.sample.MyCustomIndicator"
+ };
+
+}
diff --git a/app/src/main/res/layout/activity_indicator.xml b/app/src/main/res/layout/activity_indicator.xml
new file mode 100644
index 0000000..7c87600
--- /dev/null
+++ b/app/src/main/res/layout/activity_indicator.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_loading.xml b/app/src/main/res/layout/activity_loading.xml
deleted file mode 100644
index 810e9f0..0000000
--- a/app/src/main/res/layout/activity_loading.xml
+++ /dev/null
@@ -1,482 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/activity_sample.xml b/app/src/main/res/layout/activity_sample.xml
new file mode 100644
index 0000000..faae082
--- /dev/null
+++ b/app/src/main/res/layout/activity_sample.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_indicator.xml b/app/src/main/res/layout/item_indicator.xml
new file mode 100644
index 0000000..9bde9c5
--- /dev/null
+++ b/app/src/main/res/layout/item_indicator.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
index a459e0a..8df598c 100644
--- a/app/src/main/res/menu/menu_main.xml
+++ b/app/src/main/res/menu/menu_main.xml
@@ -1,9 +1,9 @@
diff --git a/build.gradle b/build.gradle
index 7bdca16..db9bae3 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:1.3.0'
+ classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.3.1'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 0d0e710..d084daa 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
diff --git a/library/build.gradle b/library/build.gradle
index 84863d1..db93c09 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -1,14 +1,14 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 22
- buildToolsVersion "22.0.1"
+ compileSdkVersion 23
+ buildToolsVersion "23.0.2"
defaultConfig {
- minSdkVersion 9
- targetSdkVersion 22
- versionCode 1
- versionName "1.0"
+ minSdkVersion 14
+ targetSdkVersion 23
+ versionCode 33
+ versionName "2.1.3"
}
buildTypes {
release {
@@ -20,13 +20,11 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:22.2.0'
- compile 'com.nineoldandroids:library:2.4.0'
}
ext {
PUBLISH_GROUP_ID = 'com.wang.avi'
- PUBLISH_VERSION = '1.0.0'
+ PUBLISH_VERSION = '2.1.3'
PUBLISH_DES = 'Nice loading animations for Android'
LIB_NAME = 'AVLoadingIndicatorView'
diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml
index 4147dcc..58b5b1a 100644
--- a/library/src/main/AndroidManifest.xml
+++ b/library/src/main/AndroidManifest.xml
@@ -1,10 +1,3 @@
-
-
-
-
-
diff --git a/library/src/main/java/com/wang/avi/AVLoadingIndicatorView.java b/library/src/main/java/com/wang/avi/AVLoadingIndicatorView.java
index 8d9c1d5..a5f4abf 100644
--- a/library/src/main/java/com/wang/avi/AVLoadingIndicatorView.java
+++ b/library/src/main/java/com/wang/avi/AVLoadingIndicatorView.java
@@ -5,326 +5,413 @@
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
-import android.graphics.Paint;
+import android.graphics.Rect;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
import android.os.Build;
-import android.support.annotation.IntDef;
+import android.text.TextUtils;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
-import com.wang.avi.indicator.BallBeatIndicator;
-import com.wang.avi.indicator.BallClipRotateIndicator;
-import com.wang.avi.indicator.BallClipRotateMultipleIndicator;
-import com.wang.avi.indicator.BallClipRotatePulseIndicator;
-import com.wang.avi.indicator.BallGridBeatIndicator;
-import com.wang.avi.indicator.BallGridPulseIndicator;
-import com.wang.avi.indicator.BallPulseIndicator;
-import com.wang.avi.indicator.BallPulseRiseIndicator;
-import com.wang.avi.indicator.BallPulseSyncIndicator;
-import com.wang.avi.indicator.BallRotateIndicator;
-import com.wang.avi.indicator.BallScaleIndicator;
-import com.wang.avi.indicator.BallScaleMultipleIndicator;
-import com.wang.avi.indicator.BallScaleRippleIndicator;
-import com.wang.avi.indicator.BallScaleRippleMultipleIndicator;
-import com.wang.avi.indicator.BallSpinFadeLoaderIndicator;
-import com.wang.avi.indicator.BallTrianglePathIndicator;
-import com.wang.avi.indicator.BallZigZagDeflectIndicator;
-import com.wang.avi.indicator.BallZigZagIndicator;
-import com.wang.avi.indicator.BaseIndicatorController;
-import com.wang.avi.indicator.CubeTransitionIndicator;
-import com.wang.avi.indicator.LineScaleIndicator;
-import com.wang.avi.indicator.LineScalePartyIndicator;
-import com.wang.avi.indicator.LineScalePulseOutIndicator;
-import com.wang.avi.indicator.LineScalePulseOutRapidIndicator;
-import com.wang.avi.indicator.LineSpinFadeLoaderIndicator;
-import com.wang.avi.indicator.PacmanIndicator;
-import com.wang.avi.indicator.SemiCircleSpinIndicator;
-import com.wang.avi.indicator.SquareSpinIndicator;
-import com.wang.avi.indicator.TriangleSkewSpinIndicator;
-
-
-/**
- * Created by Jack on 2015/10/15
- *
- .BallPulse,
- .BallGridPulse,
- .BallClipRotate,
- .BallClipRotatePulse,
- .SquareSpin,
- .BallClipRotateMultiple,
- .BallPulseRise,
- .BallRotate,
- .CubeTransition,
- .BallZigZag,
- .BallZigZagDeflect,
- .BallTrianglePath,
- .BallScale,
- .LineScale,
- .LineScaleParty,
- .BallScaleMultiple,
- .BallPulseSync,
- .BallBeat,
- .LineScalePulseOut,
- .LineScalePulseOutRapid,
- .BallScaleRipple,
- .BallScaleRippleMultiple,
- .BallSpinFadeLoader,
- .LineSpinFadeLoader,
- .TriangleSkewSpin,
- .Pacman,
- .BallGridBeat,
- .SemiCircleSpin
- *
- */
-public class AVLoadingIndicatorView extends View{
-
-
- //indicators
- public static final int BallPulse=0;
- public static final int BallGridPulse=1;
- public static final int BallClipRotate=2;
- public static final int BallClipRotatePulse=3;
- public static final int SquareSpin=4;
- public static final int BallClipRotateMultiple=5;
- public static final int BallPulseRise=6;
- public static final int BallRotate=7;
- public static final int CubeTransition=8;
- public static final int BallZigZag=9;
- public static final int BallZigZagDeflect=10;
- public static final int BallTrianglePath=11;
- public static final int BallScale=12;
- public static final int LineScale=13;
- public static final int LineScaleParty=14;
- public static final int BallScaleMultiple=15;
- public static final int BallPulseSync=16;
- public static final int BallBeat=17;
- public static final int LineScalePulseOut=18;
- public static final int LineScalePulseOutRapid=19;
- public static final int BallScaleRipple=20;
- public static final int BallScaleRippleMultiple=21;
- public static final int BallSpinFadeLoader=22;
- public static final int LineSpinFadeLoader=23;
- public static final int TriangleSkewSpin=24;
- public static final int Pacman=25;
- public static final int BallGridBeat=26;
- public static final int SemiCircleSpin=27;
-
-
- @IntDef(flag = true,
- value = {
- BallPulse,
- BallGridPulse,
- BallClipRotate,
- BallClipRotatePulse,
- SquareSpin,
- BallClipRotateMultiple,
- BallPulseRise,
- BallRotate,
- CubeTransition,
- BallZigZag,
- BallZigZagDeflect,
- BallTrianglePath,
- BallScale,
- LineScale,
- LineScaleParty,
- BallScaleMultiple,
- BallPulseSync,
- BallBeat,
- LineScalePulseOut,
- LineScalePulseOutRapid,
- BallScaleRipple,
- BallScaleRippleMultiple,
- BallSpinFadeLoader,
- LineSpinFadeLoader,
- TriangleSkewSpin,
- Pacman,
- BallGridBeat,
- SemiCircleSpin
- })
- public @interface Indicator{}
-
- //Sizes (with defaults in DP)
- public static final int DEFAULT_SIZE=45;
-
- //attrs
- int mIndicatorId;
- int mIndicatorColor;
-
- Paint mPaint;
-
- BaseIndicatorController mIndicatorController;
-
- private boolean mHasAnimation;
+import android.view.animation.AnimationUtils;
+import com.wang.avi.indicators.BallPulseIndicator;
+
+public class AVLoadingIndicatorView extends View {
+
+ private static final String TAG="AVLoadingIndicatorView";
+
+ private static final BallPulseIndicator DEFAULT_INDICATOR=new BallPulseIndicator();
+
+ private static final int MIN_SHOW_TIME = 500; // ms
+ private static final int MIN_DELAY = 500; // ms
+
+ private long mStartTime = -1;
+
+ private boolean mPostedHide = false;
+
+ private boolean mPostedShow = false;
+
+ private boolean mDismissed = false;
+
+ private final Runnable mDelayedHide = new Runnable() {
+
+ @Override
+ public void run() {
+ mPostedHide = false;
+ mStartTime = -1;
+ setVisibility(View.GONE);
+ }
+ };
+
+ private final Runnable mDelayedShow = new Runnable() {
+
+ @Override
+ public void run() {
+ mPostedShow = false;
+ if (!mDismissed) {
+ mStartTime = System.currentTimeMillis();
+ setVisibility(View.VISIBLE);
+ }
+ }
+ };
+
+ int mMinWidth;
+ int mMaxWidth;
+ int mMinHeight;
+ int mMaxHeight;
+
+ private Indicator mIndicator;
+ private int mIndicatorColor;
+
+ private boolean mShouldStartAnimationDrawable;
public AVLoadingIndicatorView(Context context) {
super(context);
- init(null, 0);
+ init(context, null,0,0);
}
public AVLoadingIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
- init(attrs, 0);
+ init(context, attrs,0,R.style.AVLoadingIndicatorView);
}
public AVLoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(attrs, defStyleAttr);
+ init(context, attrs,defStyleAttr,R.style.AVLoadingIndicatorView);
}
-
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public AVLoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- init(attrs, defStyleAttr);
+ init(context,attrs,defStyleAttr,R.style.AVLoadingIndicatorView);
}
- private void init(AttributeSet attrs, int defStyle) {
- TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.AVLoadingIndicatorView);
- mIndicatorId=a.getInt(R.styleable.AVLoadingIndicatorView_indicator, BallPulse);
- mIndicatorColor=a.getColor(R.styleable.AVLoadingIndicatorView_indicator_color, Color.WHITE);
+ private void init(Context context,AttributeSet attrs,int defStyleAttr, int defStyleRes) {
+ mMinWidth = 24;
+ mMaxWidth = 48;
+ mMinHeight = 24;
+ mMaxHeight = 48;
+
+ final TypedArray a = context.obtainStyledAttributes(
+ attrs, R.styleable.AVLoadingIndicatorView, defStyleAttr, defStyleRes);
+
+ mMinWidth = a.getDimensionPixelSize(R.styleable.AVLoadingIndicatorView_minWidth, mMinWidth);
+ mMaxWidth = a.getDimensionPixelSize(R.styleable.AVLoadingIndicatorView_maxWidth, mMaxWidth);
+ mMinHeight = a.getDimensionPixelSize(R.styleable.AVLoadingIndicatorView_minHeight, mMinHeight);
+ mMaxHeight = a.getDimensionPixelSize(R.styleable.AVLoadingIndicatorView_maxHeight, mMaxHeight);
+ String indicatorName=a.getString(R.styleable.AVLoadingIndicatorView_indicatorName);
+ mIndicatorColor=a.getColor(R.styleable.AVLoadingIndicatorView_indicatorColor, Color.WHITE);
+ setIndicator(indicatorName);
+ if (mIndicator==null){
+ setIndicator(DEFAULT_INDICATOR);
+ }
a.recycle();
- mPaint=new Paint();
- mPaint.setColor(mIndicatorColor);
- mPaint.setStyle(Paint.Style.FILL);
- mPaint.setAntiAlias(true);
- applyIndicator();
}
- private void applyIndicator(){
- switch (mIndicatorId){
- case BallPulse:
- mIndicatorController=new BallPulseIndicator();
- break;
- case BallGridPulse:
- mIndicatorController=new BallGridPulseIndicator();
- break;
- case BallClipRotate:
- mIndicatorController=new BallClipRotateIndicator();
- break;
- case BallClipRotatePulse:
- mIndicatorController=new BallClipRotatePulseIndicator();
- break;
- case SquareSpin:
- mIndicatorController=new SquareSpinIndicator();
- break;
- case BallClipRotateMultiple:
- mIndicatorController=new BallClipRotateMultipleIndicator();
- break;
- case BallPulseRise:
- mIndicatorController=new BallPulseRiseIndicator();
- break;
- case BallRotate:
- mIndicatorController=new BallRotateIndicator();
- break;
- case CubeTransition:
- mIndicatorController=new CubeTransitionIndicator();
- break;
- case BallZigZag:
- mIndicatorController=new BallZigZagIndicator();
- break;
- case BallZigZagDeflect:
- mIndicatorController=new BallZigZagDeflectIndicator();
- break;
- case BallTrianglePath:
- mIndicatorController=new BallTrianglePathIndicator();
- break;
- case BallScale:
- mIndicatorController=new BallScaleIndicator();
- break;
- case LineScale:
- mIndicatorController=new LineScaleIndicator();
- break;
- case LineScaleParty:
- mIndicatorController=new LineScalePartyIndicator();
- break;
- case BallScaleMultiple:
- mIndicatorController=new BallScaleMultipleIndicator();
- break;
- case BallPulseSync:
- mIndicatorController=new BallPulseSyncIndicator();
- break;
- case BallBeat:
- mIndicatorController=new BallBeatIndicator();
- break;
- case LineScalePulseOut:
- mIndicatorController=new LineScalePulseOutIndicator();
- break;
- case LineScalePulseOutRapid:
- mIndicatorController=new LineScalePulseOutRapidIndicator();
- break;
- case BallScaleRipple:
- mIndicatorController=new BallScaleRippleIndicator();
- break;
- case BallScaleRippleMultiple:
- mIndicatorController=new BallScaleRippleMultipleIndicator();
- break;
- case BallSpinFadeLoader:
- mIndicatorController=new BallSpinFadeLoaderIndicator();
- break;
- case LineSpinFadeLoader:
- mIndicatorController=new LineSpinFadeLoaderIndicator();
- break;
- case TriangleSkewSpin:
- mIndicatorController=new TriangleSkewSpinIndicator();
- break;
- case Pacman:
- mIndicatorController=new PacmanIndicator();
- break;
- case BallGridBeat:
- mIndicatorController=new BallGridBeatIndicator();
- break;
- case SemiCircleSpin:
- mIndicatorController=new SemiCircleSpinIndicator();
- break;
+ public Indicator getIndicator() {
+ return mIndicator;
+ }
+
+ public void setIndicator(Indicator d) {
+ if (mIndicator != d) {
+ if (mIndicator != null) {
+ mIndicator.setCallback(null);
+ unscheduleDrawable(mIndicator);
+ }
+
+ mIndicator = d;
+ //need to set indicator color again if you didn't specified when you update the indicator .
+ setIndicatorColor(mIndicatorColor);
+ if (d != null) {
+ d.setCallback(this);
+ }
+ postInvalidate();
+ }
+ }
+
+
+ /**
+ * setIndicatorColor(0xFF00FF00)
+ * or
+ * setIndicatorColor(Color.BLUE)
+ * or
+ * setIndicatorColor(Color.parseColor("#FF4081"))
+ * or
+ * setIndicatorColor(0xFF00FF00)
+ * or
+ * setIndicatorColor(getResources().getColor(android.R.color.black))
+ * @param color
+ */
+ public void setIndicatorColor(int color){
+ this.mIndicatorColor=color;
+ mIndicator.setColor(color);
+ }
+
+
+ /**
+ * You should pay attention to pass this parameter with two way:
+ * for example:
+ * 1. Only class Name,like "SimpleIndicator".(This way would use default package name with
+ * "com.wang.avi.indicators")
+ * 2. Class name with full package,like "com.my.android.indicators.SimpleIndicator".
+ * @param indicatorName the class must be extend Indicator .
+ */
+ public void setIndicator(String indicatorName){
+ if (TextUtils.isEmpty(indicatorName)){
+ return;
+ }
+ StringBuilder drawableClassName=new StringBuilder();
+ if (!indicatorName.contains(".")){
+ String defaultPackageName=getClass().getPackage().getName();
+ drawableClassName.append(defaultPackageName)
+ .append(".indicators")
+ .append(".");
+ }
+ drawableClassName.append(indicatorName);
+ try {
+ Class> drawableClass = Class.forName(drawableClassName.toString());
+ Indicator indicator = (Indicator) drawableClass.newInstance();
+ setIndicator(indicator);
+ } catch (ClassNotFoundException e) {
+ Log.e(TAG,"Didn't find your class , check the name again !");
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void smoothToShow(){
+ startAnimation(AnimationUtils.loadAnimation(getContext(),android.R.anim.fade_in));
+ setVisibility(VISIBLE);
+ }
+
+ public void smoothToHide(){
+ startAnimation(AnimationUtils.loadAnimation(getContext(),android.R.anim.fade_out));
+ setVisibility(GONE);
+ }
+
+ public void hide() {
+ mDismissed = true;
+ removeCallbacks(mDelayedShow);
+ long diff = System.currentTimeMillis() - mStartTime;
+ if (diff >= MIN_SHOW_TIME || mStartTime == -1) {
+ // The progress spinner has been shown long enough
+ // OR was not shown yet. If it wasn't shown yet,
+ // it will just never be shown.
+ setVisibility(View.GONE);
+ } else {
+ // The progress spinner is shown, but not long enough,
+ // so put a delayed message in to hide it when its been
+ // shown long enough.
+ if (!mPostedHide) {
+ postDelayed(mDelayedHide, MIN_SHOW_TIME - diff);
+ mPostedHide = true;
+ }
+ }
+ }
+
+ public void show() {
+ // Reset the start time.
+ mStartTime = -1;
+ mDismissed = false;
+ removeCallbacks(mDelayedHide);
+ if (!mPostedShow) {
+ postDelayed(mDelayedShow, MIN_DELAY);
+ mPostedShow = true;
}
- mIndicatorController.setTarget(this);
}
@Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int width = measureDimension(dp2px(DEFAULT_SIZE), widthMeasureSpec);
- int height = measureDimension(dp2px(DEFAULT_SIZE), heightMeasureSpec);
- setMeasuredDimension(width, height);
+ protected boolean verifyDrawable(Drawable who) {
+ return who == mIndicator
+ || super.verifyDrawable(who);
}
- private int measureDimension(int defaultSize,int measureSpec){
- int result = defaultSize;
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- if (specMode == MeasureSpec.EXACTLY) {
- result = specSize;
- } else if (specMode == MeasureSpec.AT_MOST) {
- result = Math.min(defaultSize, specSize);
+ void startAnimation() {
+ if (getVisibility() != VISIBLE) {
+ return;
+ }
+
+ if (mIndicator instanceof Animatable) {
+ mShouldStartAnimationDrawable = true;
+ }
+ postInvalidate();
+ }
+
+ void stopAnimation() {
+ if (mIndicator instanceof Animatable) {
+ mIndicator.stop();
+ mShouldStartAnimationDrawable = false;
+ }
+ postInvalidate();
+ }
+
+ @Override
+ public void setVisibility(int v) {
+ if (getVisibility() != v) {
+ super.setVisibility(v);
+ if (v == GONE || v == INVISIBLE) {
+ stopAnimation();
+ } else {
+ startAnimation();
+ }
+ }
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ if (visibility == GONE || visibility == INVISIBLE) {
+ stopAnimation();
+ } else {
+ startAnimation();
+ }
+ }
+
+ @Override
+ public void invalidateDrawable(Drawable dr) {
+ if (verifyDrawable(dr)) {
+ final Rect dirty = dr.getBounds();
+ final int scrollX = getScrollX() + getPaddingLeft();
+ final int scrollY = getScrollY() + getPaddingTop();
+
+ invalidate(dirty.left + scrollX, dirty.top + scrollY,
+ dirty.right + scrollX, dirty.bottom + scrollY);
} else {
- result = defaultSize;
+ super.invalidateDrawable(dr);
+ }
+ }
+
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ updateDrawableBounds(w, h);
+ }
+
+ private void updateDrawableBounds(int w, int h) {
+ // onDraw will translate the canvas so we draw starting at 0,0.
+ // Subtract out padding for the purposes of the calculations below.
+ w -= getPaddingRight() + getPaddingLeft();
+ h -= getPaddingTop() + getPaddingBottom();
+
+ int right = w;
+ int bottom = h;
+ int top = 0;
+ int left = 0;
+
+ if (mIndicator != null) {
+ // Maintain aspect ratio. Certain kinds of animated drawables
+ // get very confused otherwise.
+ final int intrinsicWidth = mIndicator.getIntrinsicWidth();
+ final int intrinsicHeight = mIndicator.getIntrinsicHeight();
+ final float intrinsicAspect = (float) intrinsicWidth / intrinsicHeight;
+ final float boundAspect = (float) w / h;
+ if (intrinsicAspect != boundAspect) {
+ if (boundAspect > intrinsicAspect) {
+ // New width is larger. Make it smaller to match height.
+ final int width = (int) (h * intrinsicAspect);
+ left = (w - width) / 2;
+ right = left + width;
+ } else {
+ // New height is larger. Make it smaller to match width.
+ final int height = (int) (w * (1 / intrinsicAspect));
+ top = (h - height) / 2;
+ bottom = top + height;
+ }
+ }
+ mIndicator.setBounds(left, top, right, bottom);
}
- return result;
}
@Override
- protected void onDraw(Canvas canvas) {
+ protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
- drawIndicator(canvas);
+ drawTrack(canvas);
+ }
+
+ void drawTrack(Canvas canvas) {
+ final Drawable d = mIndicator;
+ if (d != null) {
+ // Translate canvas so a indeterminate circular progress bar with padding
+ // rotates properly in its animation
+ final int saveCount = canvas.save();
+
+ canvas.translate(getPaddingLeft(), getPaddingTop());
+
+ d.draw(canvas);
+ canvas.restoreToCount(saveCount);
+
+ if (mShouldStartAnimationDrawable && d instanceof Animatable) {
+ ((Animatable) d).start();
+ mShouldStartAnimationDrawable = false;
+ }
+ }
}
@Override
- protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
- super.onLayout(changed, left, top, right, bottom);
- if (!mHasAnimation){
- mHasAnimation=true;
- applyAnimation();
+ protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int dw = 0;
+ int dh = 0;
+
+ final Drawable d = mIndicator;
+ if (d != null) {
+ dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth()));
+ dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight()));
}
+
+ updateDrawableState();
+
+ dw += getPaddingLeft() + getPaddingRight();
+ dh += getPaddingTop() + getPaddingBottom();
+
+ final int measuredWidth = resolveSizeAndState(dw, widthMeasureSpec, 0);
+ final int measuredHeight = resolveSizeAndState(dh, heightMeasureSpec, 0);
+ setMeasuredDimension(measuredWidth, measuredHeight);
}
- void drawIndicator(Canvas canvas){
- mIndicatorController.draw(canvas,mPaint);
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ updateDrawableState();
}
- void applyAnimation(){
- mIndicatorController.createAnimation();
+ private void updateDrawableState() {
+ final int[] state = getDrawableState();
+ if (mIndicator != null && mIndicator.isStateful()) {
+ mIndicator.setState(state);
+ }
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ @Override
+ public void drawableHotspotChanged(float x, float y) {
+ super.drawableHotspotChanged(x, y);
+
+ if (mIndicator != null) {
+ mIndicator.setHotspot(x, y);
+ }
+ }
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ startAnimation();
+ removeCallbacks();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ stopAnimation();
+ // This should come after stopAnimation(), otherwise an invalidate message remains in the
+ // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation
+ super.onDetachedFromWindow();
+ removeCallbacks();
}
- private int dp2px(int dpValue) {
- return (int) getContext().getResources().getDisplayMetrics().density * dpValue;
+ private void removeCallbacks() {
+ removeCallbacks(mDelayedHide);
+ removeCallbacks(mDelayedShow);
}
diff --git a/library/src/main/java/com/wang/avi/CubicBezierInterpolator.java b/library/src/main/java/com/wang/avi/CubicBezierInterpolator.java
deleted file mode 100644
index a1d9512..0000000
--- a/library/src/main/java/com/wang/avi/CubicBezierInterpolator.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.wang.avi;
-import android.graphics.PointF;
-import android.view.animation.Interpolator;
-
-/**
- * Derived from: https://github.com/rdallasgray/bez
- * and Thanks for provide such good code.
- */
-public class CubicBezierInterpolator implements Interpolator {
-
- protected PointF start;
- protected PointF end;
- protected PointF a = new PointF();
- protected PointF b = new PointF();
- protected PointF c = new PointF();
-
- public CubicBezierInterpolator(PointF start, PointF end) throws IllegalArgumentException {
- if (start.x < 0 || start.x > 1) {
- throw new IllegalArgumentException("startX value must be in the range [0, 1]");
- }
- if (end.x < 0 || end.x > 1) {
- throw new IllegalArgumentException("endX value must be in the range [0, 1]");
- }
- this.start = start;
- this.end = end;
- }
-
- public CubicBezierInterpolator(float startX, float startY, float endX, float endY) {
- this(new PointF(startX, startY), new PointF(endX, endY));
- }
-
- public CubicBezierInterpolator(double startX, double startY, double endX, double endY) {
- this((float) startX, (float) startY, (float) endX, (float) endY);
- }
-
- @Override
- public float getInterpolation(float time) {
- return getBezierCoordinateY(getXForTime(time));
- }
-
- protected float getBezierCoordinateY(float time) {
- c.y = 3 * start.y;
- b.y = 3 * (end.y - start.y) - c.y;
- a.y = 1 - c.y - b.y;
- return time * (c.y + time * (b.y + time * a.y));
- }
-
- protected float getXForTime(float time) {
- float x = time;
- float z;
- for (int i = 1; i < 14; i++) {
- z = getBezierCoordinateX(x) - time;
- if (Math.abs(z) < 1e-3) {
- break;
- }
- x -= z / getXDerivate(x);
- }
- return x;
- }
-
- private float getXDerivate(float t) {
- return c.x + t * (2 * b.x + 3 * a.x * t);
- }
-
- private float getBezierCoordinateX(float time) {
- c.x = 3 * start.x;
- b.x = 3 * (end.x - start.x) - c.x;
- a.x = 1 - c.x - b.x;
- return time * (c.x + time * (b.x + time * a.x));
- }
-}
diff --git a/library/src/main/java/com/wang/avi/Indicator.java b/library/src/main/java/com/wang/avi/Indicator.java
new file mode 100644
index 0000000..dfac444
--- /dev/null
+++ b/library/src/main/java/com/wang/avi/Indicator.java
@@ -0,0 +1,201 @@
+package com.wang.avi;
+
+import android.animation.ValueAnimator;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.Rect;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * Created by Jack Wang on 2016/8/5.
+ */
+
+public abstract class Indicator extends Drawable implements Animatable {
+
+ private HashMap mUpdateListeners=new HashMap<>();
+
+ private ArrayList mAnimators;
+ private int alpha = 255;
+ private static final Rect ZERO_BOUNDS_RECT = new Rect();
+ protected Rect drawBounds = ZERO_BOUNDS_RECT;
+
+ private boolean mHasAnimators;
+
+ private Paint mPaint=new Paint();
+
+ public Indicator(){
+ mPaint.setColor(Color.WHITE);
+ mPaint.setStyle(Paint.Style.FILL);
+ mPaint.setAntiAlias(true);
+ }
+
+ public int getColor() {
+ return mPaint.getColor();
+ }
+
+ public void setColor(int color) {
+ mPaint.setColor(color);
+ }
+
+ @Override
+ public void setAlpha(int alpha) {
+ this.alpha = alpha;
+ }
+
+ @Override
+ public int getAlpha() {
+ return alpha;
+ }
+
+ @Override
+ public int getOpacity() {
+ return PixelFormat.OPAQUE;
+ }
+
+ @Override
+ public void setColorFilter(ColorFilter colorFilter) {
+
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ draw(canvas,mPaint);
+ }
+
+ public abstract void draw(Canvas canvas, Paint paint);
+
+ public abstract ArrayList onCreateAnimators();
+
+ @Override
+ public void start() {
+ ensureAnimators();
+
+ if (mAnimators == null) {
+ return;
+ }
+
+ // If the animators has not ended, do nothing.
+ if (isStarted()) {
+ return;
+ }
+ startAnimators();
+ invalidateSelf();
+ }
+
+ private void startAnimators() {
+ for (int i = 0; i < mAnimators.size(); i++) {
+ ValueAnimator animator = mAnimators.get(i);
+
+ //when the animator restart , add the updateListener again because they
+ // was removed by animator stop .
+ ValueAnimator.AnimatorUpdateListener updateListener=mUpdateListeners.get(animator);
+ if (updateListener!=null){
+ animator.addUpdateListener(updateListener);
+ }
+
+ animator.start();
+ }
+ }
+
+ private void stopAnimators() {
+ if (mAnimators!=null){
+ for (ValueAnimator animator : mAnimators) {
+ if (animator != null && animator.isStarted()) {
+ animator.removeAllUpdateListeners();
+ animator.end();
+ }
+ }
+ }
+ }
+
+ private void ensureAnimators() {
+ if (!mHasAnimators) {
+ mAnimators = onCreateAnimators();
+ mHasAnimators = true;
+ }
+ }
+
+ @Override
+ public void stop() {
+ stopAnimators();
+ }
+
+ private boolean isStarted() {
+ for (ValueAnimator animator : mAnimators) {
+ return animator.isStarted();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isRunning() {
+ for (ValueAnimator animator : mAnimators) {
+ return animator.isRunning();
+ }
+ return false;
+ }
+
+ /**
+ * Your should use this to add AnimatorUpdateListener when
+ * create animator , otherwise , animator doesn't work when
+ * the animation restart .
+ * @param updateListener
+ */
+ public void addUpdateListener(ValueAnimator animator, ValueAnimator.AnimatorUpdateListener updateListener){
+ mUpdateListeners.put(animator,updateListener);
+ }
+
+ @Override
+ protected void onBoundsChange(Rect bounds) {
+ super.onBoundsChange(bounds);
+ setDrawBounds(bounds);
+ }
+
+ public void setDrawBounds(Rect drawBounds) {
+ setDrawBounds(drawBounds.left, drawBounds.top, drawBounds.right, drawBounds.bottom);
+ }
+
+ public void setDrawBounds(int left, int top, int right, int bottom) {
+ this.drawBounds = new Rect(left, top, right, bottom);
+ }
+
+ public void postInvalidate(){
+ invalidateSelf();
+ }
+
+ public Rect getDrawBounds() {
+ return drawBounds;
+ }
+
+ public int getWidth(){
+ return drawBounds.width();
+ }
+
+ public int getHeight(){
+ return drawBounds.height();
+ }
+
+ public int centerX(){
+ return drawBounds.centerX();
+ }
+
+ public int centerY(){
+ return drawBounds.centerY();
+ }
+
+ public float exactCenterX(){
+ return drawBounds.exactCenterX();
+ }
+
+ public float exactCenterY(){
+ return drawBounds.exactCenterY();
+ }
+
+}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallPulseRiseIndicator.java b/library/src/main/java/com/wang/avi/indicator/BallPulseRiseIndicator.java
deleted file mode 100644
index 7f2e62c..0000000
--- a/library/src/main/java/com/wang/avi/indicator/BallPulseRiseIndicator.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.wang.avi.indicator;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.view.animation.LinearInterpolator;
-
-import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.animation.PropertyValuesHolder;
-
-/**
- * Created by Jack on 2015/10/17.
- */
-public class BallPulseRiseIndicator extends BaseIndicatorController{
-
- @Override
- public void draw(Canvas canvas, Paint paint) {
- float radius=getWidth()/10;
- canvas.drawCircle(getWidth()/4,radius*2,radius,paint);
- canvas.drawCircle(getWidth()*3/4,radius*2,radius,paint);
-
- canvas.drawCircle(radius,getHeight()-2*radius,radius,paint);
- canvas.drawCircle(getWidth()/2,getHeight()-2*radius,radius,paint);
- canvas.drawCircle(getWidth()-radius,getHeight()-2*radius,radius,paint);
- }
-
- @Override
- public void createAnimation() {
- PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat("rotationX",0,360);
- ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6);
- animator.setInterpolator(new LinearInterpolator());
- animator.setRepeatCount(-1);
- animator.setDuration(1500);
- animator.start();
- }
-}
diff --git a/library/src/main/java/com/wang/avi/indicator/BaseIndicatorController.java b/library/src/main/java/com/wang/avi/indicator/BaseIndicatorController.java
deleted file mode 100644
index 0c2d39b..0000000
--- a/library/src/main/java/com/wang/avi/indicator/BaseIndicatorController.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.wang.avi.indicator;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.view.View;
-
-/**
- * Created by Jack on 2015/10/15.
- */
-public abstract class BaseIndicatorController {
-
- private View mTarget;
-
-
- public void setTarget(View target){
- this.mTarget=target;
- }
-
- public View getTarget(){
- return mTarget;
- }
-
-
- public int getWidth(){
- return mTarget.getWidth();
- }
-
- public int getHeight(){
- return mTarget.getHeight();
- }
-
- public void postInvalidate(){
- mTarget.postInvalidate();
- }
-
- /**
- * draw indicator what ever
- * you want to draw
- * @param canvas
- * @param paint
- */
- public abstract void draw(Canvas canvas,Paint paint);
-
- /**
- * create animation or animations
- * ,and add to your indicator.
- */
- public abstract void createAnimation();
-
-
-}
diff --git a/library/src/main/java/com/wang/avi/indicator/SemiCircleSpinIndicator.java b/library/src/main/java/com/wang/avi/indicator/SemiCircleSpinIndicator.java
deleted file mode 100644
index 982a6c5..0000000
--- a/library/src/main/java/com/wang/avi/indicator/SemiCircleSpinIndicator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.wang.avi.indicator;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.view.animation.LinearInterpolator;
-
-import com.nineoldandroids.animation.ObjectAnimator;
-
-/**
- * Created by Jack on 2015/10/20.
- */
-public class SemiCircleSpinIndicator extends BaseIndicatorController {
-
-
- @Override
- public void draw(Canvas canvas, Paint paint) {
- RectF rectF=new RectF(0,0,getWidth(),getHeight());
- canvas.drawArc(rectF,-60,120,false,paint);
- }
-
- @Override
- public void createAnimation() {
- ObjectAnimator rotateAnim=ObjectAnimator.ofFloat(getTarget(),"rotation",0,180,360);
- rotateAnim.setDuration(600);
- rotateAnim.setRepeatCount(-1);
- rotateAnim.start();
- }
-
-
-}
diff --git a/library/src/main/java/com/wang/avi/indicator/SquareSpinIndicator.java b/library/src/main/java/com/wang/avi/indicator/SquareSpinIndicator.java
deleted file mode 100644
index 47ed9e8..0000000
--- a/library/src/main/java/com/wang/avi/indicator/SquareSpinIndicator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.wang.avi.indicator;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.animation.PropertyValuesHolder;
-
-/**
- * Created by Jack on 2015/10/16.
- */
-public class SquareSpinIndicator extends BaseIndicatorController {
-
- @Override
- public void draw(Canvas canvas, Paint paint) {
- canvas.drawRect(new RectF(getWidth()/5,getHeight()/5,getWidth()*4/5,getHeight()*4/5),paint);
-
- /*Path path=new Path();
- path.moveTo(0,getHeight());
- path.lineTo(getWidth(), getHeight());
- path.lineTo(getWidth()/2,0);
- path.close();
- canvas.drawPath(path, paint);*/
- }
-
- @Override
- public void createAnimation() {
- /*ObjectAnimator rotationXAnimation=ObjectAnimator.ofFloat(getTarget(), "rotationX",0,180,180,0,0);
- rotationXAnimation.setDuration(3000);
-
- ObjectAnimator rotationYAnimation=ObjectAnimator.ofFloat(getTarget(), "rotationY",0,0,180,180,0);
- rotationYAnimation.setDuration(3000);
-
- final AnimatorSet animatorSet=new AnimatorSet();
- animatorSet.playTogether(rotationXAnimation,rotationYAnimation);
- animatorSet.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationRepeat(Animator animation) {
- super.onAnimationRepeat(animation);
- System.out.println("onAnimationRepeat");
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- System.out.println("onAnimationEnd(");
- animatorSet.start();
- }
- });
- animatorSet.start();*/
-
-
- /*PropertyValuesHolder rotation1=PropertyValuesHolder.ofFloat("rotationX",0,180,0,0,0);
- PropertyValuesHolder rotation2=PropertyValuesHolder.ofFloat("rotationX",0,0,180,0,0);
- PropertyValuesHolder rotation3=PropertyValuesHolder.ofFloat("rotationY",0,0,180,0,0);
- PropertyValuesHolder rotation4=PropertyValuesHolder.ofFloat("rotationY",0,0,0,180,0);*/
-
- PropertyValuesHolder rotation5=PropertyValuesHolder.ofFloat("rotationX",0,180,180,0,0);
- PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat("rotationY",0,0,180,180,0);
- ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6,rotation5);
- animator.setInterpolator(new LinearInterpolator());
- animator.setRepeatCount(-1);
- animator.setDuration(2500);
- animator.start();
- }
-}
diff --git a/library/src/main/java/com/wang/avi/indicator/TriangleSkewSpinIndicator.java b/library/src/main/java/com/wang/avi/indicator/TriangleSkewSpinIndicator.java
deleted file mode 100644
index 1848877..0000000
--- a/library/src/main/java/com/wang/avi/indicator/TriangleSkewSpinIndicator.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.wang.avi.indicator;
-
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.Path;
-import android.view.animation.LinearInterpolator;
-
-import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.animation.PropertyValuesHolder;
-
-/**
- * Created by Jack on 2015/10/20.
- */
-public class TriangleSkewSpinIndicator extends BaseIndicatorController {
-
- @Override
- public void draw(Canvas canvas, Paint paint) {
- Path path=new Path();
- path.moveTo(getWidth()/5,getHeight()*4/5);
- path.lineTo(getWidth()*4/5, getHeight()*4/5);
- path.lineTo(getWidth()/2,getHeight()/5);
- path.close();
- canvas.drawPath(path, paint);
- }
-
- @Override
- public void createAnimation() {
- /*ObjectAnimator rotationXAnimation=ObjectAnimator.ofFloat(getTarget(), "rotationX",0,180,180,0,0);
- rotationXAnimation.setDuration(3000);
-
- ObjectAnimator rotationYAnimation=ObjectAnimator.ofFloat(getTarget(), "rotationY",0,0,180,180,0);
- rotationYAnimation.setDuration(3000);
-
- final AnimatorSet animatorSet=new AnimatorSet();
- animatorSet.playTogether(rotationXAnimation,rotationYAnimation);
- animatorSet.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationRepeat(Animator animation) {
- super.onAnimationRepeat(animation);
- System.out.println("onAnimationRepeat");
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- System.out.println("onAnimationEnd(");
- animatorSet.start();
- }
- });
- animatorSet.start();*/
-
-
- /*PropertyValuesHolder rotation1=PropertyValuesHolder.ofFloat("rotationX",0,180,0,0,0);
- PropertyValuesHolder rotation2=PropertyValuesHolder.ofFloat("rotationX",0,0,180,0,0);
- PropertyValuesHolder rotation3=PropertyValuesHolder.ofFloat("rotationY",0,0,180,0,0);
- PropertyValuesHolder rotation4=PropertyValuesHolder.ofFloat("rotationY",0,0,0,180,0);*/
-
- PropertyValuesHolder rotation5=PropertyValuesHolder.ofFloat("rotationX",0,180,180,0,0);
- PropertyValuesHolder rotation6=PropertyValuesHolder.ofFloat("rotationY",0,0,180,180,0);
- ObjectAnimator animator=ObjectAnimator.ofPropertyValuesHolder(getTarget(), rotation6,rotation5);
- animator.setInterpolator(new LinearInterpolator());
- animator.setRepeatCount(-1);
- animator.setDuration(2500);
- animator.start();
- }
-
-}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallBeatIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java
similarity index 79%
rename from library/src/main/java/com/wang/avi/indicator/BallBeatIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java
index c019d0e..a8a6e15 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallBeatIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java
@@ -1,14 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallBeatIndicator extends BaseIndicatorController {
+public class BallBeatIndicator extends Indicator {
public static final float SCALE=1.0f;
@@ -40,7 +43,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
int[] delays=new int[]{350,0,350};
for (int i = 0; i < 3; i++) {
final int index=i;
@@ -48,28 +52,30 @@ public void createAnimation() {
scaleAnim.setDuration(700);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255,51,255);
alphaAnim.setDuration(700);
alphaAnim.setRepeatCount(-1);
alphaAnim.setStartDelay(delays[i]);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphas[index] = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
}
+ return animators;
}
+
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallClipRotateIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java
similarity index 73%
rename from library/src/main/java/com/wang/avi/indicator/BallClipRotateIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java
index 30ed32e..5d65321 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallClipRotateIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/16.
*/
-public class BallClipRotateIndicator extends BaseIndicatorController {
+public class BallClipRotateIndicator extends Indicator {
float scaleFloat=1,degrees;
@@ -29,30 +32,31 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,0.5f,1);
scaleAnim.setDuration(750);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
-
ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360);
rotateAnim.setDuration(750);
rotateAnim.setRepeatCount(-1);
- rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim.start();
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallClipRotateMultipleIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java
similarity index 79%
rename from library/src/main/java/com/wang/avi/indicator/BallClipRotateMultipleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java
index e74bdf4..2c59506 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallClipRotateMultipleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/17.
*/
-public class BallClipRotateMultipleIndicator extends BaseIndicatorController{
+public class BallClipRotateMultipleIndicator extends Indicator {
float scaleFloat=1,degrees;
@@ -49,30 +52,32 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,1);
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);
rotateAnim.setDuration(1000);
rotateAnim.setRepeatCount(-1);
- rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim.start();
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallClipRotatePulseIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java
similarity index 77%
rename from library/src/main/java/com/wang/avi/indicator/BallClipRotatePulseIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java
index c2d84c9..3687ed3 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallClipRotatePulseIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java
@@ -1,16 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
-import android.support.v4.view.animation.PathInterpolatorCompat;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/16.
*/
-public class BallClipRotatePulseIndicator extends BaseIndicatorController {
+public class BallClipRotatePulseIndicator extends Indicator {
float scaleFloat1,scaleFloat2,degrees;
@@ -46,42 +48,45 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat1 = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator scaleAnim2=ValueAnimator.ofFloat(1,0.6f,1);
scaleAnim2.setDuration(1000);
scaleAnim2.setRepeatCount(-1);
- scaleAnim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim2,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat2 = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim2.start();
ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);
rotateAnim.setDuration(1000);
rotateAnim.setRepeatCount(-1);
- rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim.start();
+ ArrayList animators=new ArrayList<>();
+ animators.add(scaleAnim);
+ animators.add(scaleAnim2);
+ animators.add(rotateAnim);
+ return animators;
}
+
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallGridBeatIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java
similarity index 80%
rename from library/src/main/java/com/wang/avi/indicator/BallGridBeatIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java
index 23ec95e..c115c6a 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallGridBeatIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java
@@ -1,14 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/20.
*/
-public class BallGridBeatIndicator extends BaseIndicatorController {
+public class BallGridBeatIndicator extends Indicator {
public static final int ALPHA=255;
@@ -43,7 +46,9 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+
int[] durations={960, 930, 1190, 1130, 1340, 940, 1200, 820, 1190};
int[] delays= {360, 400, 680, 410, 710, -150, -120, 10, 320};
@@ -53,17 +58,19 @@ public void createAnimation() {
alphaAnim.setDuration(durations[i]);
alphaAnim.setRepeatCount(-1);
alphaAnim.setStartDelay(delays[i]);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphas[index] = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+ animators.add(alphaAnim);
}
+ return animators;
}
+
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallGridPulseIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java
similarity index 82%
rename from library/src/main/java/com/wang/avi/indicator/BallGridPulseIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java
index ea81eb6..e0f043f 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallGridPulseIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java
@@ -1,14 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/16.
*/
-public class BallGridPulseIndicator extends BaseIndicatorController{
+public class BallGridPulseIndicator extends Indicator {
public static final int ALPHA=255;
@@ -58,7 +61,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
int[] durations={720, 1020, 1280, 1420, 1450, 1180, 870, 1450, 1060};
int[] delays= {-60, 250, -170, 480, 310, 30, 460, 780, 450};
@@ -68,29 +72,29 @@ public void createAnimation() {
scaleAnim.setDuration(durations[i]);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 210, 122, 255);
alphaAnim.setDuration(durations[i]);
alphaAnim.setRepeatCount(-1);
alphaAnim.setStartDelay(delays[i]);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphas[index] = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
}
+ return animators;
}
-
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallPulseIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java
similarity index 59%
rename from library/src/main/java/com/wang/avi/indicator/BallPulseIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java
index 4fcbe66..eef80b0 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallPulseIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java
@@ -1,14 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/16.
*/
-public class BallPulseIndicator extends BaseIndicatorController{
+public class BallPulseIndicator extends Indicator {
public static final float SCALE=1.0f;
@@ -36,36 +39,29 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
int[] delays=new int[]{120,240,360};
for (int i = 0; i < 3; i++) {
final int index=i;
-/* Keyframe k1=Keyframe.ofFloat(0,1);
- *//*k1.setInterpolator(new CubicBezierInterpolator(0.2, 0.68,0.18, 1.08));*//*
- k1.setInterpolator(new LinearInterpolator());
- *//*k1.setInterpolator(PathInterpolatorCompat.create(0.2f, 0.68f, 0.18f, 1.08f));*//*
- Keyframe k2=Keyframe.ofFloat(0.3f,0.3f);
- *//*k2.setInterpolator(PathInterpolatorCompat.create(0.2f, 0.68f,0.18f, 1.08f));*//*
- k2.setInterpolator(new LinearInterpolator());
- Keyframe k3=Keyframe.ofFloat(1, 1);
- PropertyValuesHolder holder=PropertyValuesHolder.ofKeyframe("scale", k1, k2, k3);
- ValueAnimator scaleAnim=ValueAnimator.ofPropertyValuesHolder(holder);*/
-
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);
+
scaleAnim.setDuration(750);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
-
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
+
}
diff --git a/library/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java
new file mode 100644
index 0000000..afc48ce
--- /dev/null
+++ b/library/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java
@@ -0,0 +1,69 @@
+package com.wang.avi.indicators;
+
+import android.animation.ValueAnimator;
+import android.graphics.Camera;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/17.
+ */
+public class BallPulseRiseIndicator extends Indicator {
+
+ private Camera mCamera;
+ private Matrix mMatrix;
+
+ private float degress;
+
+ public BallPulseRiseIndicator(){
+ mCamera=new Camera();
+ mMatrix=new Matrix();
+ }
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+
+ mMatrix.reset();
+ mCamera.save();
+ mCamera.rotateX(degress);
+ mCamera.getMatrix(mMatrix);
+ mCamera.restore();
+
+ mMatrix.preTranslate(-centerX(), -centerY());
+ mMatrix.postTranslate(centerX(), centerY());
+ canvas.concat(mMatrix);
+
+ float radius=getWidth()/10;
+ canvas.drawCircle(getWidth()/4,radius*2,radius,paint);
+ canvas.drawCircle(getWidth()*3/4,radius*2,radius,paint);
+
+ canvas.drawCircle(radius,getHeight()-2*radius,radius,paint);
+ canvas.drawCircle(getWidth()/2,getHeight()-2*radius,radius,paint);
+ canvas.drawCircle(getWidth()-radius,getHeight()-2*radius,radius,paint);
+ }
+
+ @Override
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+ ValueAnimator animator=ValueAnimator.ofFloat(0,360);
+ addUpdateListener(animator,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degress = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animator.setInterpolator(new LinearInterpolator());
+ animator.setRepeatCount(-1);
+ animator.setDuration(1500);
+ animators.add(animator);
+ return animators;
+ }
+
+}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallPulseSyncIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java
similarity index 76%
rename from library/src/main/java/com/wang/avi/indicator/BallPulseSyncIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java
index a6e1fb5..862f92d 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallPulseSyncIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java
@@ -1,14 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallPulseSyncIndicator extends BaseIndicatorController {
+public class BallPulseSyncIndicator extends Indicator {
float[] translateYFloats=new float[3];
@@ -27,7 +30,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float circleSpacing=4;
float radius=(getWidth()-circleSpacing*2)/6;
int[] delays=new int[]{70,140,210};
@@ -37,15 +41,17 @@ public void createAnimation() {
scaleAnim.setDuration(600);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateYFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
+
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallRotateIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java
similarity index 52%
rename from library/src/main/java/com/wang/avi/indicator/BallRotateIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java
index 61e1d52..de4d25b 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallRotateIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java
@@ -1,20 +1,28 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
+import android.animation.ValueAnimator;
import android.graphics.Canvas;
+import android.graphics.Matrix;
import android.graphics.Paint;
-import android.view.animation.AccelerateDecelerateInterpolator;
-import android.view.animation.OvershootInterpolator;
-import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/17.
*/
-public class BallRotateIndicator extends BaseIndicatorController{
+public class BallRotateIndicator extends Indicator {
float scaleFloat=0.5f;
+ float degress;
+
+ private Matrix mMatrix;
+
+ public BallRotateIndicator(){
+ mMatrix=new Matrix();
+ }
@Override
public void draw(Canvas canvas, Paint paint) {
@@ -22,6 +30,13 @@ public void draw(Canvas canvas, Paint paint) {
float x = getWidth()/ 2;
float y=getHeight()/2;
+ /*mMatrix.preTranslate(-centerX(), -centerY());
+ mMatrix.preRotate(degress,centerX(),centerY());
+ mMatrix.postTranslate(centerX(), centerY());
+ canvas.concat(mMatrix);*/
+
+ canvas.rotate(degress,centerX(),centerY());
+
canvas.save();
canvas.translate(x - radius * 2 - radius, y);
canvas.scale(scaleFloat, scaleFloat);
@@ -42,25 +57,33 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
ValueAnimator scaleAnim=ValueAnimator.ofFloat(0.5f,1,0.5f);
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
- ObjectAnimator rotateAnim=ObjectAnimator.ofFloat(getTarget(),"rotation",0,180,360);
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degress = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
rotateAnim.setDuration(1000);
rotateAnim.setRepeatCount(-1);
- rotateAnim.start();
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
}
-
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallScaleIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java
similarity index 72%
rename from library/src/main/java/com/wang/avi/indicator/BallScaleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java
index 504cfc3..3e52f7c 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallScaleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallScaleIndicator extends BaseIndicatorController {
+public class BallScaleIndicator extends Indicator {
float scale=1;
int alpha=255;
@@ -24,33 +27,34 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
scaleAnim.setInterpolator(new LinearInterpolator());
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scale = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 0);
alphaAnim.setInterpolator(new LinearInterpolator());
alphaAnim.setDuration(1000);
alphaAnim.setRepeatCount(-1);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alpha = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ return animators;
}
-
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallScaleMultipleIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java
similarity index 77%
rename from library/src/main/java/com/wang/avi/indicator/BallScaleMultipleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java
index beee535..43d4aaa 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallScaleMultipleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallScaleMultipleIndicator extends BaseIndicatorController {
+public class BallScaleMultipleIndicator extends Indicator {
float[] scaleFloats=new float[]{1,1,1};
int[] alphaInts=new int[]{255,255,255};
@@ -25,7 +28,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] delays=new long[]{0, 200, 400};
for (int i = 0; i < 3; i++) {
final int index=i;
@@ -33,7 +37,7 @@ public void createAnimation() {
scaleAnim.setInterpolator(new LinearInterpolator());
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
@@ -41,13 +45,12 @@ public void onAnimationUpdate(ValueAnimator animation) {
}
});
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255,0);
alphaAnim.setInterpolator(new LinearInterpolator());
alphaAnim.setDuration(1000);
alphaAnim.setRepeatCount(-1);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphaInts[index] = (int) animation.getAnimatedValue();
@@ -55,8 +58,11 @@ public void onAnimationUpdate(ValueAnimator animation) {
}
});
scaleAnim.setStartDelay(delays[i]);
- alphaAnim.start();
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallScaleRippleIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java
similarity index 74%
rename from library/src/main/java/com/wang/avi/indicator/BallScaleRippleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java
index a9c9cb1..d791f71 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallScaleRippleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java
@@ -1,10 +1,12 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
@@ -20,32 +22,35 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
scaleAnim.setInterpolator(new LinearInterpolator());
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scale = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(0, 255);
alphaAnim.setInterpolator(new LinearInterpolator());
alphaAnim.setDuration(1000);
alphaAnim.setRepeatCount(-1);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alpha = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallScaleRippleMultipleIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java
similarity index 77%
rename from library/src/main/java/com/wang/avi/indicator/BallScaleRippleMultipleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java
index 2f1c1b5..5dc132b 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallScaleRippleMultipleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java
@@ -1,16 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.view.animation.AccelerateInterpolator;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallScaleRippleMultipleIndicator extends BallScaleMultipleIndicator{
+public class BallScaleRippleMultipleIndicator extends BallScaleMultipleIndicator {
@Override
@@ -21,7 +22,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] delays=new long[]{0, 200, 400};
for (int i = 0; i < 3; i++) {
final int index=i;
@@ -29,7 +31,7 @@ public void createAnimation() {
scaleAnim.setInterpolator(new LinearInterpolator());
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
@@ -37,13 +39,12 @@ public void onAnimationUpdate(ValueAnimator animation) {
}
});
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(0,255);
scaleAnim.setInterpolator(new LinearInterpolator());
alphaAnim.setDuration(1000);
alphaAnim.setRepeatCount(-1);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphaInts[index] = (int) animation.getAnimatedValue();
@@ -51,8 +52,11 @@ public void onAnimationUpdate(ValueAnimator animation) {
}
});
scaleAnim.setStartDelay(delays[i]);
- alphaAnim.start();
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallSpinFadeLoaderIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java
similarity index 83%
rename from library/src/main/java/com/wang/avi/indicator/BallSpinFadeLoaderIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java
index c554a75..d93fbb3 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallSpinFadeLoaderIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java
@@ -1,15 +1,17 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import com.nineoldandroids.animation.PropertyValuesHolder;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/20.
*/
-public class BallSpinFadeLoaderIndicator extends BaseIndicatorController {
+public class BallSpinFadeLoaderIndicator extends Indicator {
public static final float SCALE=1.0f;
@@ -48,23 +50,9 @@ public void draw(Canvas canvas, Paint paint) {
}
}
- /**
- * 圆O的圆心为(a,b),半径为R,点A与到X轴的为角α.
- *则点A的坐标为(a+R*cosα,b+R*sinα)
- * @param width
- * @param height
- * @param radius
- * @param angle
- * @return
- */
- Point circleAt(int width,int height,float radius,double angle){
- float x= (float) (width/2+radius*(Math.cos(angle)));
- float y= (float) (height/2+radius*(Math.sin(angle)));
- return new Point(x,y);
- }
-
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
int[] delays= {0, 120, 240, 360, 480, 600, 720, 780, 840};
for (int i = 0; i < 8; i++) {
final int index=i;
@@ -72,28 +60,44 @@ public void createAnimation() {
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 77, 255);
alphaAnim.setDuration(1000);
alphaAnim.setRepeatCount(-1);
alphaAnim.setStartDelay(delays[i]);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alphas[index] = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
}
+ return animators;
+ }
+
+ /**
+ * 圆O的圆心为(a,b),半径为R,点A与到X轴的为角α.
+ *则点A的坐标为(a+R*cosα,b+R*sinα)
+ * @param width
+ * @param height
+ * @param radius
+ * @param angle
+ * @return
+ */
+ Point circleAt(int width,int height,float radius,double angle){
+ float x= (float) (width/2+radius*(Math.cos(angle)));
+ float y= (float) (height/2+radius*(Math.sin(angle)));
+ return new Point(x,y);
}
final class Point{
diff --git a/library/src/main/java/com/wang/avi/indicator/BallTrianglePathIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java
similarity index 81%
rename from library/src/main/java/com/wang/avi/indicator/BallTrianglePathIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java
index 8d78e16..1a3a9ba 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallTrianglePathIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallTrianglePathIndicator extends BaseIndicatorController {
+public class BallTrianglePathIndicator extends Indicator {
float[] translateX=new float[3],translateY=new float[3];
@@ -26,7 +29,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float startX=getWidth()/5;
float startY=getWidth()/5;
for (int i = 0; i < 3; i++) {
@@ -47,27 +51,29 @@ public void createAnimation() {
translateXAnim.setDuration(2000);
translateXAnim.setInterpolator(new LinearInterpolator());
translateXAnim.setRepeatCount(-1);
- translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateX [index]= (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateXAnim.start();
translateYAnim.setDuration(2000);
translateYAnim.setInterpolator(new LinearInterpolator());
translateYAnim.setRepeatCount(-1);
- translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateY [index]= (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateYAnim.start();
+
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
}
+ return animators;
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallZigZagDeflectIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java
similarity index 79%
rename from library/src/main/java/com/wang/avi/indicator/BallZigZagDeflectIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java
index 4a6accf..93aec2e 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallZigZagDeflectIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java
@@ -1,9 +1,9 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.view.animation.LinearInterpolator;
-
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
@@ -14,7 +14,8 @@ public class BallZigZagDeflectIndicator extends BallZigZagIndicator {
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float startX=getWidth()/6;
float startY=getWidth()/6;
for (int i = 0; i < 2; i++) {
@@ -31,27 +32,29 @@ public void createAnimation() {
translateXAnim.setDuration(2000);
translateXAnim.setInterpolator(new LinearInterpolator());
translateXAnim.setRepeatCount(-1);
- translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateX [index]= (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateXAnim.start();
translateYAnim.setDuration(2000);
translateYAnim.setInterpolator(new LinearInterpolator());
translateYAnim.setRepeatCount(-1);
- translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateY [index]= (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateYAnim.start();
+
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/BallZigZagIndicator.java b/library/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java
similarity index 74%
rename from library/src/main/java/com/wang/avi/indicator/BallZigZagIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java
index 93480c5..d01c8ff 100644
--- a/library/src/main/java/com/wang/avi/indicator/BallZigZagIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class BallZigZagIndicator extends BaseIndicatorController {
+public class BallZigZagIndicator extends Indicator {
float[] translateX=new float[2],translateY=new float[2];
@@ -25,7 +28,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float startX=getWidth()/6;
float startY=getWidth()/6;
for (int i = 0; i < 2; i++) {
@@ -42,27 +46,28 @@ public void createAnimation() {
translateXAnim.setDuration(1000);
translateXAnim.setInterpolator(new LinearInterpolator());
translateXAnim.setRepeatCount(-1);
- translateXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- translateX [index]= (float) animation.getAnimatedValue();
+ translateX[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateXAnim.start();
translateYAnim.setDuration(1000);
translateYAnim.setInterpolator(new LinearInterpolator());
translateYAnim.setRepeatCount(-1);
- translateYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- translateY [index]= (float) animation.getAnimatedValue();
+ translateY[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translateYAnim.start();
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/CubeTransitionIndicator.java b/library/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java
similarity index 83%
rename from library/src/main/java/com/wang/avi/indicator/CubeTransitionIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java
index 9044fa8..181024f 100644
--- a/library/src/main/java/com/wang/avi/indicator/CubeTransitionIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java
@@ -1,16 +1,19 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/18.
*/
-public class CubeTransitionIndicator extends BaseIndicatorController {
+public class CubeTransitionIndicator extends Indicator {
float[] translateX=new float[2],translateY=new float[2];
float degrees,scaleFloat=1.0f;
@@ -31,7 +34,8 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float startX=getWidth()/5;
float startY=getHeight()/5;
for (int i = 0; i < 2; i++) {
@@ -51,7 +55,6 @@ public void onAnimationUpdate(ValueAnimator animation) {
postInvalidate();
}
});
- translationXAnim.start();
translateY[index]=startY;
ValueAnimator translationYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()-startY,getHeight()- startY,startY);
if (i==1){
@@ -60,40 +63,44 @@ public void onAnimationUpdate(ValueAnimator animation) {
translationYAnim.setDuration(1600);
translationYAnim.setInterpolator(new LinearInterpolator());
translationYAnim.setRepeatCount(-1);
- translationYAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translationYAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateY[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translationYAnim.start();
+
+ animators.add(translationXAnim);
+ animators.add(translationYAnim);
}
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.5f,1,0.5f,1);
scaleAnim.setDuration(1600);
scaleAnim.setInterpolator(new LinearInterpolator());
scaleAnim.setRepeatCount(-1);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloat = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360,1.5f*360,2*360);
rotateAnim.setDuration(1600);
rotateAnim.setInterpolator(new LinearInterpolator());
rotateAnim.setRepeatCount(-1);
- rotateAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim.start();
+
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/LineScaleIndicator.java b/library/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java
similarity index 63%
rename from library/src/main/java/com/wang/avi/indicator/LineScaleIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java
index fd804c2..83bfe86 100644
--- a/library/src/main/java/com/wang/avi/indicator/LineScaleIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java
@@ -1,15 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class LineScaleIndicator extends BaseIndicatorController {
+public class LineScaleIndicator extends Indicator {
public static final float SCALE=1.0f;
@@ -34,33 +37,25 @@ public void draw(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] delays=new long[]{100,200,300,400,500};
for (int i = 0; i < 5; i++) {
final int index=i;
-
- /*Keyframe k1=Keyframe.ofFloat(0,1);
- k1.setInterpolator(new CubicBezierInterpolator(0.2, 0.68,0.18, 1.08));
- Keyframe k2=Keyframe.ofFloat(0.5f,0.4f);
- k2.setInterpolator(new CubicBezierInterpolator(0.2, 0.68,0.18, 1.08));
- Keyframe k3=Keyframe.ofFloat(1,1);
- PropertyValuesHolder holder=PropertyValuesHolder.ofKeyframe("scale", k1, k2, k3);
- ValueAnimator scaleAnim=ValueAnimator.ofPropertyValuesHolder(holder);
- scaleAnim.setInterpolator(new CubicBezierInterpolator(0.2, 0.68,0.18, 1.08));*/
-
ValueAnimator scaleAnim=ValueAnimator.ofFloat(1, 0.4f, 1);
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleYFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/LineScalePartyIndicator.java b/library/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java
similarity index 77%
rename from library/src/main/java/com/wang/avi/indicator/LineScalePartyIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java
index 376df77..b316e23 100644
--- a/library/src/main/java/com/wang/avi/indicator/LineScalePartyIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java
@@ -1,16 +1,18 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.Rect;
import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
*/
-public class LineScalePartyIndicator extends BaseIndicatorController {
+public class LineScalePartyIndicator extends Indicator {
public static final float SCALE=1.0f;
@@ -34,8 +36,10 @@ public void draw(Canvas canvas, Paint paint) {
}
}
+
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] durations=new long[]{1260, 430, 1010, 730};
long[] delays=new long[]{770, 290, 280, 740};
for (int i = 0; i < 4; i++) {
@@ -44,15 +48,16 @@ public void createAnimation() {
scaleAnim.setDuration(durations[i]);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
diff --git a/library/src/main/java/com/wang/avi/indicator/LineScalePulseOutIndicator.java b/library/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java
similarity index 67%
rename from library/src/main/java/com/wang/avi/indicator/LineScalePulseOutIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java
index 1580d2e..2b02150 100644
--- a/library/src/main/java/com/wang/avi/indicator/LineScalePulseOutIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java
@@ -1,10 +1,9 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
@@ -12,7 +11,8 @@
public class LineScalePulseOutIndicator extends LineScaleIndicator {
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] delays=new long[]{500,250,0,250,500};
for (int i = 0; i < 5; i++) {
final int index=i;
@@ -20,15 +20,16 @@ public void createAnimation() {
scaleAnim.setDuration(900);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleYFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/LineScalePulseOutRapidIndicator.java b/library/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java
similarity index 68%
rename from library/src/main/java/com/wang/avi/indicator/LineScalePulseOutRapidIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java
index b175124..51cfcdc 100644
--- a/library/src/main/java/com/wang/avi/indicator/LineScalePulseOutRapidIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java
@@ -1,10 +1,9 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.RectF;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/19.
@@ -12,7 +11,8 @@
public class LineScalePulseOutRapidIndicator extends LineScaleIndicator {
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
long[] delays=new long[]{400,200,0,200,400};
for (int i = 0; i < 5; i++) {
final int index=i;
@@ -20,15 +20,16 @@ public void createAnimation() {
scaleAnim.setDuration(1000);
scaleAnim.setRepeatCount(-1);
scaleAnim.setStartDelay(delays[i]);
- scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
scaleYFloats[index] = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- scaleAnim.start();
+ animators.add(scaleAnim);
}
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicator/LineSpinFadeLoaderIndicator.java b/library/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java
similarity index 90%
rename from library/src/main/java/com/wang/avi/indicator/LineSpinFadeLoaderIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java
index 24c52c0..32df75b 100644
--- a/library/src/main/java/com/wang/avi/indicator/LineSpinFadeLoaderIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java
@@ -1,4 +1,4 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
@@ -22,7 +22,6 @@ public void draw(Canvas canvas, Paint paint) {
canvas.rotate(i*45);
paint.setAlpha(alphas[i]);
RectF rectF=new RectF(-radius,-radius/1.5f,1.5f*radius,radius/1.5f);
- /*RectF rectF=new RectF(0,0,2*radius,1f*radius);*/
canvas.drawRoundRect(rectF,5,5,paint);
canvas.restore();
}
diff --git a/library/src/main/java/com/wang/avi/indicator/PacmanIndicator.java b/library/src/main/java/com/wang/avi/indicators/PacmanIndicator.java
similarity index 80%
rename from library/src/main/java/com/wang/avi/indicator/PacmanIndicator.java
rename to library/src/main/java/com/wang/avi/indicators/PacmanIndicator.java
index dd9ba73..9a3a2e6 100644
--- a/library/src/main/java/com/wang/avi/indicator/PacmanIndicator.java
+++ b/library/src/main/java/com/wang/avi/indicators/PacmanIndicator.java
@@ -1,16 +1,19 @@
-package com.wang.avi.indicator;
+package com.wang.avi.indicators;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.animation.LinearInterpolator;
-import com.nineoldandroids.animation.ValueAnimator;
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
/**
* Created by Jack on 2015/10/16.
*/
-public class PacmanIndicator extends BaseIndicatorController{
+public class PacmanIndicator extends Indicator {
private float translateX;
@@ -55,55 +58,58 @@ private void drawCircle(Canvas canvas, Paint paint) {
}
@Override
- public void createAnimation() {
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
float startT=getWidth()/11;
ValueAnimator translationAnim=ValueAnimator.ofFloat(getWidth()-startT,getWidth()/2);
translationAnim.setDuration(650);
translationAnim.setInterpolator(new LinearInterpolator());
translationAnim.setRepeatCount(-1);
- translationAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(translationAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
translateX = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- translationAnim.start();
ValueAnimator alphaAnim=ValueAnimator.ofInt(255,122);
alphaAnim.setDuration(650);
alphaAnim.setRepeatCount(-1);
- alphaAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
alpha = (int) animation.getAnimatedValue();
postInvalidate();
}
});
- alphaAnim.start();
ValueAnimator rotateAnim1=ValueAnimator.ofFloat(0, 45, 0);
rotateAnim1.setDuration(650);
rotateAnim1.setRepeatCount(-1);
- rotateAnim1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim1,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees1 = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim1.start();
ValueAnimator rotateAnim2=ValueAnimator.ofFloat(0,-45,0);
rotateAnim2.setDuration(650);
rotateAnim2.setRepeatCount(-1);
- rotateAnim2.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ addUpdateListener(rotateAnim2,new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
degrees2 = (float) animation.getAnimatedValue();
postInvalidate();
}
});
- rotateAnim2.start();
+
+ animators.add(translationAnim);
+ animators.add(alphaAnim);
+ animators.add(rotateAnim1);
+ animators.add(rotateAnim2);
+ return animators;
}
}
diff --git a/library/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java b/library/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java
new file mode 100644
index 0000000..53a0b70
--- /dev/null
+++ b/library/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java
@@ -0,0 +1,43 @@
+package com.wang.avi.indicators;
+
+import android.animation.ValueAnimator;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/20.
+ */
+public class SemiCircleSpinIndicator extends Indicator {
+
+ private float degress;
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ canvas.rotate(degress,centerX(),centerY());
+ RectF rectF=new RectF(0,0,getWidth(),getHeight());
+ canvas.drawArc(rectF,-60,120,false,paint);
+ }
+
+ @Override
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degress= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ rotateAnim.setDuration(600);
+ rotateAnim.setRepeatCount(-1);
+ animators.add(rotateAnim);
+ return animators;
+ }
+
+}
diff --git a/library/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java b/library/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java
new file mode 100644
index 0000000..e2b8ae9
--- /dev/null
+++ b/library/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java
@@ -0,0 +1,80 @@
+package com.wang.avi.indicators;
+
+import android.animation.ValueAnimator;
+import android.graphics.Camera;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.view.animation.LinearInterpolator;
+
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class SquareSpinIndicator extends Indicator {
+
+ private float rotateX;
+ private float rotateY;
+
+ private Camera mCamera;
+ private Matrix mMatrix;
+
+ public SquareSpinIndicator(){
+ mCamera=new Camera();
+ mMatrix=new Matrix();
+ }
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+
+ mMatrix.reset();
+ mCamera.save();
+ mCamera.rotateX(rotateX);
+ mCamera.rotateY(rotateY);
+ mCamera.getMatrix(mMatrix);
+ mCamera.restore();
+
+ mMatrix.preTranslate(-centerX(), -centerY());
+ mMatrix.postTranslate(centerX(), centerY());
+ canvas.concat(mMatrix);
+
+ canvas.drawRect(new RectF(getWidth()/5,getHeight()/5,getWidth()*4/5,getHeight()*4/5),paint);
+ }
+
+ @Override
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+ ValueAnimator animator=ValueAnimator.ofFloat(0,180,180,0,0);
+ addUpdateListener(animator,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ rotateX= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animator.setInterpolator(new LinearInterpolator());
+ animator.setRepeatCount(-1);
+ animator.setDuration(2500);
+
+ ValueAnimator animator1=ValueAnimator.ofFloat(0,0,180,180,0);
+ addUpdateListener(animator1,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ rotateY= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animator1.setInterpolator(new LinearInterpolator());
+ animator1.setRepeatCount(-1);
+ animator1.setDuration(2500);
+
+ animators.add(animator);
+ animators.add(animator1);
+ return animators;
+ }
+
+}
diff --git a/library/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java b/library/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java
new file mode 100644
index 0000000..93364cd
--- /dev/null
+++ b/library/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java
@@ -0,0 +1,86 @@
+package com.wang.avi.indicators;
+
+import android.animation.ValueAnimator;
+import android.graphics.Camera;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Path;
+import android.view.animation.LinearInterpolator;
+
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/20.
+ */
+public class TriangleSkewSpinIndicator extends Indicator {
+
+ private float rotateX;
+ private float rotateY;
+
+ private Camera mCamera;
+ private Matrix mMatrix;
+
+ public TriangleSkewSpinIndicator(){
+ mCamera=new Camera();
+ mMatrix=new Matrix();
+ }
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+
+
+ mMatrix.reset();
+ mCamera.save();
+ mCamera.rotateX(rotateX);
+ mCamera.rotateY(rotateY);
+ mCamera.getMatrix(mMatrix);
+ mCamera.restore();
+
+ mMatrix.preTranslate(-centerX(), -centerY());
+ mMatrix.postTranslate(centerX(), centerY());
+ canvas.concat(mMatrix);
+
+ Path path=new Path();
+ path.moveTo(getWidth()/5,getHeight()*4/5);
+ path.lineTo(getWidth()*4/5, getHeight()*4/5);
+ path.lineTo(getWidth()/2,getHeight()/5);
+ path.close();
+ canvas.drawPath(path, paint);
+ }
+
+ @Override
+ public ArrayList onCreateAnimators() {
+ ArrayList animators=new ArrayList<>();
+ ValueAnimator animator=ValueAnimator.ofFloat(0,180,180,0,0);
+ addUpdateListener(animator,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ rotateX= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animator.setInterpolator(new LinearInterpolator());
+ animator.setRepeatCount(-1);
+ animator.setDuration(2500);
+
+ ValueAnimator animator1=ValueAnimator.ofFloat(0,0,180,180,0);
+ addUpdateListener(animator1,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ rotateY= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animator1.setInterpolator(new LinearInterpolator());
+ animator1.setRepeatCount(-1);
+ animator1.setDuration(2500);
+
+ animators.add(animator);
+ animators.add(animator1);
+ return animators;
+ }
+
+}
diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml
index 96d1b7d..7a23b1a 100644
--- a/library/src/main/res/values/attrs.xml
+++ b/library/src/main/res/values/attrs.xml
@@ -2,37 +2,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/src/main/res/values/style.xml b/library/src/main/res/values/style.xml
new file mode 100644
index 0000000..bdc5352
--- /dev/null
+++ b/library/src/main/res/values/style.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/screenshots/avi.gif b/screenshots/avi.gif
new file mode 100644
index 0000000..63e63d2
Binary files /dev/null and b/screenshots/avi.gif differ