diff --git a/README.markdown b/README.markdown
index 9c45e6d..78027e5 100644
--- a/README.markdown
+++ b/README.markdown
@@ -1,50 +1,106 @@
-#效果图先行#
+# 效果图先行
-
-
+
+# 地址:
-
-
-
-
-#地址:#
[github 直达](https://github.com/zzz40500/android-shapeLoadingView)
[](http://android-arsenal.com/details/1/1897)
-###gradle
-/build.gradle
-~~~
+
+# Usage
+
+## 配置
+
+在`/build.gralde`中添加如下内容:
+
+``` gradle
repositories {
maven {
url "https://jitpack.io"
}
}
-~~~
-/app/build.gradle
-~~~
+```
+
+在`/app/build.gradle`中添加如下内容:
+
+``` gradle
dependencies {
- compile 'com.github.zzz40500:android-shapeLoadingView:1.0.3.2'
- }
-~~~
-#usage#
+ compile 'com.github.zzz40500:android-shapeLoadingView:1.0.3.2'
+}
+```
-布局上
-~~~
+## 参数
+| 参数 | 说明 |
+| ---- | ----------------------- |
+| loadingText | 加载信息。 |
+| loadingTextAppearance | 字体样式。 |
+| delay | 暂停时间,单位为ms,默认为80ms。 |
+| textSize | 加载信息字体大小,默认为16sp。 |
+| textColor | 加载信息字体颜色。 |
+| distance | 动画弹跳的距离,单位为dp,默认为54dp。 |
+| acceleration | 动画弹跳的加速度,默认为1.2f。 |
+| duration | 动画持续时间,单位为ms,默认为383ms。 |
+
+## 使用
+
+使用LoadingView教程如下:
+
+``` xml
+ tools:context="com.mingle.ViewDemoActivity">
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerInParent="true"
+ app:distance="200dp"
+ app:textSize="24sp"
+ app:delay="3000"
+ app:acceleration="0.8"
+ app:duration="1000"
+ app:textColor="@color/triangle"
+ app:loadingText="加载中..." />
+
+```
+
+使用ShapeLoadingDialog教程如下:
-~~~
+``` java
+public class DialogDemoActivity extends AppCompatActivity {
-动画自动加载
+ private ShapeLoadingDialog shapeLoadingDialog;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_dialog_demo);
+ shapeLoadingDialog = new ShapeLoadingDialog.Builder(this)
+ .loadText("加载中...")
+ .delayMS(2333)
+ .distanceDP(66)
+ .loadTextSizeSP(18)
+ .acceleration(2.3f)
+ .loadTextColorID(getResources().getColor(R.color.colorText))
+ .build();
+ findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+
+ shapeLoadingDialog.show();
+ }
+ });
+ }
+}
+```
diff --git a/android-shapeLoadingView.iml b/android-shapeLoadingView.iml
index 27d504e..ea7dd32 100644
--- a/android-shapeLoadingView.iml
+++ b/android-shapeLoadingView.iml
@@ -1,5 +1,5 @@
-
+
diff --git a/app/app.iml b/app/app.iml
index 2ffb599..52de6ad 100644
--- a/app/app.iml
+++ b/app/app.iml
@@ -1,5 +1,5 @@
-
+
@@ -22,25 +22,26 @@
-
+
+
-
+
-
+
@@ -48,6 +49,13 @@
+
+
+
+
+
+
+
@@ -62,13 +70,6 @@
-
-
-
-
-
-
-
@@ -76,9 +77,18 @@
+
+
+
+
+
+
+
+
+
@@ -87,32 +97,38 @@
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 2b4202a..c16f3bb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,13 +1,13 @@
apply plugin: 'com.android.application'
android {
- compileSdkVersion 25
- buildToolsVersion '25.0.0'
+ compileSdkVersion 27
+ buildToolsVersion '26.0.2'
defaultConfig {
applicationId "com.mingle"
- minSdkVersion 9
- targetSdkVersion 25
+ minSdkVersion 14
+ targetSdkVersion 27
versionCode 1
versionName "1.0"
}
@@ -21,6 +21,6 @@ android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:appcompat-v7:25.3.1'
+ compile 'com.android.support:appcompat-v7:27.0.2'
compile project(':shapeloading')
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f798f0d..83c3197 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,15 +1,15 @@
+ package="com.mingle">
+ android:theme="@style/AppTheme">
+ android:label="@string/app_name">
@@ -18,12 +18,10 @@
-
+ android:label="@string/title_activity_view_demo" />
-
+ android:label="@string/title_activity_dialog_demo" />
diff --git a/app/src/main/java/com/mingle/DialogDemoActivity.java b/app/src/main/java/com/mingle/DialogDemoActivity.java
index 2181790..9aa154d 100644
--- a/app/src/main/java/com/mingle/DialogDemoActivity.java
+++ b/app/src/main/java/com/mingle/DialogDemoActivity.java
@@ -1,14 +1,12 @@
package com.mingle;
-import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.support.v7.app.AppCompatActivity;
import android.view.View;
import com.mingle.widget.ShapeLoadingDialog;
-public class DialogDemoActivity extends ActionBarActivity {
+public class DialogDemoActivity extends AppCompatActivity {
private ShapeLoadingDialog shapeLoadingDialog;
@@ -18,9 +16,12 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_dialog_demo);
shapeLoadingDialog = new ShapeLoadingDialog.Builder(this)
.loadText("加载中...")
+ .delayMS(2333)
+ .distanceDP(28)
+ .loadTextSizeSP(18)
+ .acceleration(1.3f)
+ .loadTextColorID(getResources().getColor(R.color.colorText))
.build();
-
-
findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -29,26 +30,4 @@ public void onClick(View v) {
}
});
}
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
-// getMenuInflater().inflate(R.menu.menu_dialog_demo, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
-
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
}
diff --git a/app/src/main/java/com/mingle/MainActivity.java b/app/src/main/java/com/mingle/MainActivity.java
index 5e86b3f..ada231b 100644
--- a/app/src/main/java/com/mingle/MainActivity.java
+++ b/app/src/main/java/com/mingle/MainActivity.java
@@ -1,21 +1,12 @@
package com.mingle;
import android.content.Intent;
-import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.support.v7.app.AppCompatActivity;
import android.view.View;
-import com.mingle.widget.ShapeLoadingDialog;
-
-
-public class MainActivity extends ActionBarActivity {
-
-
-
+public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -25,42 +16,16 @@ protected void onCreate(Bundle savedInstanceState) {
@Override
public void onClick(View v) {
- MainActivity.this.startActivity(new Intent(MainActivity.this,ViewDemoActivity.class));
+ MainActivity.this.startActivity(new Intent(MainActivity.this, ViewDemoActivity.class));
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- MainActivity.this.startActivity(new Intent(MainActivity.this,DialogDemoActivity.class));
+ MainActivity.this.startActivity(new Intent(MainActivity.this, DialogDemoActivity.class));
}
});
-
}
-
-
-
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.menu_main, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
-
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
}
diff --git a/app/src/main/java/com/mingle/ViewDemoActivity.java b/app/src/main/java/com/mingle/ViewDemoActivity.java
index 7840521..4dac270 100644
--- a/app/src/main/java/com/mingle/ViewDemoActivity.java
+++ b/app/src/main/java/com/mingle/ViewDemoActivity.java
@@ -1,37 +1,13 @@
package com.mingle;
-import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
+import android.support.v7.app.AppCompatActivity;
-public class ViewDemoActivity extends ActionBarActivity {
+public class ViewDemoActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_demo);
}
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
-// getMenuInflater().inflate(R.menu.menu_view_demo, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- // Handle action bar item clicks here. The action bar will
- // automatically handle clicks on the Home/Up button, so long
- // as you specify a parent activity in AndroidManifest.xml.
- int id = item.getItemId();
-
- //noinspection SimplifiableIfStatement
- if (id == R.id.action_settings) {
- return true;
- }
-
- return super.onOptionsItemSelected(item);
- }
}
diff --git a/app/src/main/res/layout/activity_dialog_demo.xml b/app/src/main/res/layout/activity_dialog_demo.xml
index cb55816..6041704 100644
--- a/app/src/main/res/layout/activity_dialog_demo.xml
+++ b/app/src/main/res/layout/activity_dialog_demo.xml
@@ -1,16 +1,18 @@
+ android:text="show" />
diff --git a/app/src/main/res/layout/activity_view_demo.xml b/app/src/main/res/layout/activity_view_demo.xml
index cce2d83..9e91e45 100644
--- a/app/src/main/res/layout/activity_view_demo.xml
+++ b/app/src/main/res/layout/activity_view_demo.xml
@@ -14,6 +14,12 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
+ app:distance="200dp"
+ app:textSize="24sp"
+ app:delay="3000"
+ app:acceleration="0.8"
+ app:duration="1000"
+ app:textColor="@color/triangle"
app:loadingText="加载中..." />
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
deleted file mode 100644
index b1cb908..0000000
--- a/app/src/main/res/menu/menu_main.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
diff --git a/build.gradle b/build.gradle
index 150656d..e9f7a57 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,22 +1,16 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
buildscript {
repositories {
jcenter()
+ google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.1'
-
- // NOTE: Do not place your application dependencies here; they belong
- // in the individual module build.gradle files
-
- classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
- classpath 'com.github.dcendents:android-maven-plugin:1.2'
+ classpath 'com.android.tools.build:gradle:3.0.1'
}
}
allprojects {
repositories {
jcenter()
+ google()
}
}
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1c09fa9..762e0d7 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri May 05 11:08:53 CST 2017
+#Sat Feb 10 20:50:22 CST 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
diff --git a/img/show.gif b/img/show.gif
new file mode 100644
index 0000000..21a190d
Binary files /dev/null and b/img/show.gif differ
diff --git a/shapeloading/build.gradle b/shapeloading/build.gradle
index dd5cbf4..1fa92eb 100644
--- a/shapeloading/build.gradle
+++ b/shapeloading/build.gradle
@@ -1,12 +1,12 @@
apply plugin: 'com.android.library'
android {
- compileSdkVersion 25
- buildToolsVersion '25.0.0'
+ compileSdkVersion 27
+ buildToolsVersion '26.0.2'
defaultConfig {
- minSdkVersion 9
- targetSdkVersion 25
+ minSdkVersion 14
+ targetSdkVersion 27
versionCode 1
versionName "1.0.3"
}
diff --git a/shapeloading/shapeloading.iml b/shapeloading/shapeloading.iml
index 44a74e6..d682598 100644
--- a/shapeloading/shapeloading.iml
+++ b/shapeloading/shapeloading.iml
@@ -1,5 +1,5 @@
-
+
@@ -23,25 +23,26 @@
-
+
+
-
+
-
+
@@ -56,6 +57,13 @@
+
+
+
+
+
+
+
@@ -77,12 +85,15 @@
-
+
+
+
+
@@ -90,217 +101,13 @@
+
-
+
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/shapeloading/src/main/java/com/mingle/widget/BaseLoadingView.java b/shapeloading/src/main/java/com/mingle/widget/BaseLoadingView.java
new file mode 100644
index 0000000..50ad5d1
--- /dev/null
+++ b/shapeloading/src/main/java/com/mingle/widget/BaseLoadingView.java
@@ -0,0 +1,395 @@
+package com.mingle.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.mingle.shapeloading.R;
+import com.mingle.widget.util.DimenUtil;
+import com.nineoldandroids.animation.Animator;
+import com.nineoldandroids.animation.AnimatorSet;
+import com.nineoldandroids.animation.ObjectAnimator;
+import com.nineoldandroids.view.ViewHelper;
+
+/**
+ * @author wangyu
+ * @date 18-2-10
+ * @describe TODO
+ */
+
+public abstract class BaseLoadingView extends RelativeLayout {
+ public static final String TAG = BaseLoadingView.class.getName();
+ /**
+ * 动画移动的距离
+ */
+ protected float mDistance;
+ /**
+ * 暂停的时间
+ */
+ protected int mDelay;
+ /**
+ * 加速度
+ */
+ protected float acceleration = 1.3f;
+ /**
+ * 动画的持续时间
+ */
+ protected int duration;
+ protected Context context;
+ protected TextView mLoadTextView;
+ protected ImageView mIndicationIm;
+ /**
+ * 上抛动画
+ */
+ private AnimatorSet mUpAnimatorSet;
+ /**
+ * 下落动画
+ */
+ private AnimatorSet mDownAnimatorSet;
+ private boolean mStopped = false;
+ private ShapeLoadingView mShapeLoadingView;
+ private Runnable mFreeFallRunnable = new Runnable() {
+ @Override
+ public void run() {
+ ViewHelper.setRotation(mShapeLoadingView, 270f);
+ ViewHelper.setTranslationY(mShapeLoadingView, 0f);
+ ViewHelper.setScaleX(mIndicationIm, 0.2f);
+ mStopped = false;
+ freeFall();
+ }
+ };
+
+ public BaseLoadingView(Context context) {
+ super(context);
+ init(context, null);
+ }
+
+ public BaseLoadingView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs);
+ }
+
+
+ @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public BaseLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(context, attrs);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public BaseLoadingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(context, attrs);
+ }
+
+ /**
+ * 初始化,引入布局和自定义属性
+ *
+ * @param context context
+ * @param attrs 属性
+ */
+ private void init(Context context, AttributeSet attrs) {
+ this.context = context;
+ // 导入布局
+ LayoutInflater.from(context).inflate(R.layout.load_view, this, true);
+
+ // 加载动画
+ mShapeLoadingView = findViewById(R.id.shapeLoadingView);
+ //
+ mIndicationIm = findViewById(R.id.indication);
+ // 加载文字
+ mLoadTextView = findViewById(R.id.promptTV);
+
+ ViewHelper.setScaleX(mIndicationIm, 0.2f);
+
+ // 获取自定义属性
+ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BaseLoadingView);
+
+ // 加载文字
+ String loadText = typedArray.getString(R.styleable.BaseLoadingView_loadingText);
+
+ // 加载文字的样式
+ int textAppearance = typedArray.getResourceId(R.styleable.BaseLoadingView_loadingText, -1);
+
+ // 延迟
+ mDelay = typedArray.getInteger(R.styleable.BaseLoadingView_delay, 80);
+
+ // 加载文字的大小
+ float textSize = typedArray.getDimension(R.styleable.BaseLoadingView_textSize,
+ DimenUtil.sp2px(context, 16));
+ mLoadTextView.setTextSize(DimenUtil.px2dp(context, textSize));
+
+ // 加载文字颜色
+ int color = typedArray.getColor(R.styleable.BaseLoadingView_textColor, getResources().getColor(R.color.colorText));
+ mLoadTextView.setTextColor(color);
+
+ // 设置LoadingView的跳动距离,默认是54dp
+ mDistance = typedArray.getDimension(R.styleable.BaseLoadingView_distance,
+ DimenUtil.dp2px(context, 54f));
+ setJumpDistanceDP((int) DimenUtil.px2dp(context, mDistance));
+
+ // 获取弹跳的加速度
+ acceleration = typedArray.getFloat(R.styleable.BaseLoadingView_acceleration, 1.2f);
+
+ // 设置动画的时间
+ duration = typedArray.getInt(R.styleable.BaseLoadingView_duration, 383);
+
+ typedArray.recycle();
+
+ if (textAppearance != -1) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ mLoadTextView.setTextAppearance(textAppearance);
+ } else {
+ mLoadTextView.setTextAppearance(getContext(), textAppearance);
+ }
+ }
+ setLoadText(loadText);
+
+ // 父布局宽高都设置为wrap_content
+ LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-2, -2);
+ this.setLayoutParams(params);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ if (getVisibility() == VISIBLE) {
+ startLoading(mDelay);
+ }
+ }
+
+ /**
+ * 启动动画(开始加载)
+ *
+ * @param delay 暂停时间
+ */
+ private void startLoading(long delay) {
+ if (mDownAnimatorSet != null && mDownAnimatorSet.isRunning()) {
+ return;
+ }
+ this.removeCallbacks(mFreeFallRunnable);
+ if (delay > 0) {
+ this.postDelayed(mFreeFallRunnable, delay);
+ } else {
+ this.post(mFreeFallRunnable);
+ }
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ stopLoading();
+ }
+
+ /**
+ * 停止动画
+ */
+ private void stopLoading() {
+ mStopped = true;
+ if (mUpAnimatorSet != null) {
+ if (mUpAnimatorSet.isRunning()) {
+ mUpAnimatorSet.cancel();
+ }
+ mUpAnimatorSet.removeAllListeners();
+ for (Animator animator : mUpAnimatorSet.getChildAnimations()) {
+ animator.removeAllListeners();
+ }
+ mUpAnimatorSet = null;
+ }
+ if (mDownAnimatorSet != null) {
+ if (mDownAnimatorSet.isRunning()) {
+ mDownAnimatorSet.cancel();
+ }
+ mDownAnimatorSet.removeAllListeners();
+ for (Animator animator : mDownAnimatorSet.getChildAnimations()) {
+ animator.removeAllListeners();
+ }
+ mDownAnimatorSet = null;
+ }
+ this.removeCallbacks(mFreeFallRunnable);
+ }
+
+ @Override
+ public void setVisibility(int visibility) {
+ this.setVisibility(visibility, mDelay);
+ }
+
+ /**
+ * 是否可见
+ *
+ * @param visibility GONE,VISIBLE,INVISIBLE
+ * @param delay 暂停时间
+ */
+ public void setVisibility(int visibility, int delay) {
+ super.setVisibility(visibility);
+ if (visibility == VISIBLE) {
+ startLoading(delay);
+ } else {
+ stopLoading();
+ }
+ }
+
+ /**
+ * 上抛
+ */
+ public void upThrow() {
+ // 因为每个Shape旋转的角度不一样,所以要先把Set清空,重新设置。
+ if (mUpAnimatorSet != null) {
+ if (mUpAnimatorSet.isRunning()) {
+ mUpAnimatorSet.cancel();
+ }
+ mUpAnimatorSet.removeAllListeners();
+ for (Animator animator : mUpAnimatorSet.getChildAnimations()) {
+ animator.removeAllListeners();
+ }
+ mUpAnimatorSet = null;
+ }
+
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mShapeLoadingView,
+ "translationY", mDistance, 0);
+ ObjectAnimator scaleIndication = ObjectAnimator.ofFloat(mIndicationIm,
+ "scaleX", 1f, 0.2f);
+ ObjectAnimator objectAnimator1 = null;
+ switch (mShapeLoadingView.getShape()) {
+ case SHAPE_RECT:
+ objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView,
+ "rotation", 0, -270);
+ break;
+ case SHAPE_CIRCLE:
+ objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView,
+ "rotation", 0, 180);
+ break;
+ case SHAPE_TRIANGLE:
+ objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView,
+ "rotation", 0, 270);
+ break;
+ default:
+ break;
+ }
+ mUpAnimatorSet = new AnimatorSet();
+ mUpAnimatorSet.playTogether(objectAnimator, objectAnimator1, scaleIndication);
+ mUpAnimatorSet.setDuration(duration);
+ mUpAnimatorSet.setInterpolator(new DecelerateInterpolator(acceleration));
+ mUpAnimatorSet.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!mStopped) {
+ freeFall();
+ }
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+ });
+ mUpAnimatorSet.start();
+ }
+
+ /**
+ * 下落
+ */
+ public void freeFall() {
+ if (mDownAnimatorSet == null) {
+ ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mShapeLoadingView,
+ "translationY", 0, mDistance);
+ ObjectAnimator scaleIndication = ObjectAnimator.ofFloat(mIndicationIm,
+ "scaleX", 0.2f, 1f);
+ mDownAnimatorSet = new AnimatorSet();
+ mDownAnimatorSet.playTogether(objectAnimator, scaleIndication);
+ mDownAnimatorSet.setDuration(duration);
+ mDownAnimatorSet.setInterpolator(new AccelerateInterpolator(acceleration));
+ mDownAnimatorSet.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (!mStopped) {
+ mShapeLoadingView.changeShape();
+ upThrow();
+ }
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animation) {
+
+ }
+ });
+ }
+ mDownAnimatorSet.start();
+ }
+
+ /**
+ * 设置某个View的margin
+ *
+ * @param view 需要设置的view
+ * @param isDp 需要设置的数值是否为DP
+ * @param top 上边距
+ */
+ public void setViewMargin(View view, boolean isDp, int top) {
+ if (view == null) {
+ return;
+ }
+ ViewGroup.LayoutParams params = view.getLayoutParams();
+ ViewGroup.MarginLayoutParams marginParams;
+
+ // 获取view的margin设置参数
+ if (params instanceof ViewGroup.MarginLayoutParams) {
+ marginParams = (ViewGroup.MarginLayoutParams) params;
+ } else {
+ // 不存在时创建一个新的参数
+ marginParams = new ViewGroup.MarginLayoutParams(params);
+ }
+
+ // 根据DP与PX转换计算值
+ if (isDp) {
+ top = (int) DimenUtil.px2dp(context, top);
+ }
+ // 设置margin
+ marginParams.setMargins(0, top, 0, 0);
+ view.setLayoutParams(marginParams);
+ }
+
+ /**
+ * 设置跳动距离
+ *
+ * @param distance 跳动的距离
+ */
+ public abstract void setJumpDistanceDP(int distance);
+
+ /**
+ * 设置加载信息字体的大小
+ *
+ * @param loadTextSize 字体大小,单位为sp
+ */
+ public abstract void setLoadText(String loadTextSize);
+}
diff --git a/shapeloading/src/main/java/com/mingle/widget/LoadingView.java b/shapeloading/src/main/java/com/mingle/widget/LoadingView.java
index db6b5c0..f8f2e56 100644
--- a/shapeloading/src/main/java/com/mingle/widget/LoadingView.java
+++ b/shapeloading/src/main/java/com/mingle/widget/LoadingView.java
@@ -2,311 +2,139 @@
import android.annotation.TargetApi;
import android.content.Context;
-import android.content.res.TypedArray;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.DecelerateInterpolator;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-import com.mingle.shapeloading.R;
-import com.nineoldandroids.animation.Animator;
-import com.nineoldandroids.animation.AnimatorSet;
-import com.nineoldandroids.animation.ObjectAnimator;
-import com.nineoldandroids.view.ViewHelper;
+import com.mingle.widget.util.DimenUtil;
/**
- * Created by zzz40500 on 15/4/6.
+ * @author zzz40500
+ * @date 15/4/6
*/
-public class LoadingView extends LinearLayout {
-
- private static final int ANIMATION_DURATION = 500;
-
- private static final float FACTOR = 1.2f;
-
- private static float mDistance = 200;
-
- private ShapeLoadingView mShapeLoadingView;
-
- private ImageView mIndicationIm;
-
- private TextView mLoadTextView;
- private int mTextAppearance;
-
- private String mLoadText;
- private AnimatorSet mUpAnimatorSet;
- private AnimatorSet mDownAnimatorSet;
-
- private boolean mStopped = false;
-
- private int mDelay;
+public class LoadingView extends BaseLoadingView {
public LoadingView(Context context) {
super(context);
- init(context, null);
}
public LoadingView(Context context, AttributeSet attrs) {
super(context, attrs);
- init(context, attrs);
-
}
-
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- init(context, attrs);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public LoadingView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
- init(context, attrs);
}
- private void init(Context context, AttributeSet attrs) {
-
- setOrientation(VERTICAL);
- mDistance = dip2px(context, 54f);
- LayoutInflater.from(context).inflate(R.layout.load_view, this, true);
- mShapeLoadingView = (ShapeLoadingView) findViewById(R.id.shapeLoadingView);
- mIndicationIm = (ImageView) findViewById(R.id.indication);
- mLoadTextView = (TextView) findViewById(R.id.promptTV);
- ViewHelper.setScaleX(mIndicationIm, 0.2f);
-
- TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.LoadingView);
- String loadText = typedArray.getString(R.styleable.LoadingView_loadingText);
- int textAppearance = typedArray.getResourceId(R.styleable.LoadingView_loadingText, -1);
- mDelay = typedArray.getInteger(R.styleable.LoadingView_delay, 80);
- typedArray.recycle();
-
- if (textAppearance != -1) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mLoadTextView.setTextAppearance(textAppearance);
- } else {
- mLoadTextView.setTextAppearance(getContext(), textAppearance);
- }
- }
- setLoadingText(loadText);
- }
-
- private int dip2px(Context context, float dipValue) {
- final float scale = context.getResources().getDisplayMetrics().density;
- return (int) (dipValue * scale + 0.5f);
- }
-
-
+ /**
+ * 设置加载信息
+ *
+ * @param loadingText 加载信息
+ */
@Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- if (getVisibility() == VISIBLE) {
- startLoading(mDelay);
- }
- }
-
- private Runnable mFreeFallRunnable = new Runnable() {
- @Override
- public void run() {
- ViewHelper.setRotation(mShapeLoadingView, 180f);
- ViewHelper.setTranslationY(mShapeLoadingView, 0f);
- ViewHelper.setScaleX(mIndicationIm, 0.2f);
- mStopped = false;
- freeFall();
- }
- };
-
- private void startLoading(long delay) {
- if (mDownAnimatorSet != null && mDownAnimatorSet.isRunning()) {
- return;
- }
- this.removeCallbacks(mFreeFallRunnable);
- if (delay > 0) {
- this.postDelayed(mFreeFallRunnable, delay);
+ public void setLoadText(String loadingText) {
+ if (TextUtils.isEmpty(loadingText)) {
+ mLoadTextView.setVisibility(GONE);
} else {
- this.post(mFreeFallRunnable);
+ mLoadTextView.setVisibility(VISIBLE);
}
+ this.mLoadTextView.setText(loadingText);
}
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- stopLoading();
- }
-
- private void stopLoading() {
- mStopped = true;
- if (mUpAnimatorSet != null) {
- if (mUpAnimatorSet.isRunning()) {
- mUpAnimatorSet.cancel();
- }
- mUpAnimatorSet.removeAllListeners();
- for (Animator animator : mUpAnimatorSet.getChildAnimations()) {
- animator.removeAllListeners();
- }
- mUpAnimatorSet = null;
- }
- if (mDownAnimatorSet != null) {
- if (mDownAnimatorSet.isRunning()) {
- mDownAnimatorSet.cancel();
- }
- mDownAnimatorSet.removeAllListeners();
- for (Animator animator : mDownAnimatorSet.getChildAnimations()) {
- animator.removeAllListeners();
- }
- mDownAnimatorSet = null;
- }
- this.removeCallbacks(mFreeFallRunnable);
+ /**
+ * 设置加载信息字体颜色
+ *
+ * @param textColor 字体的颜色
+ */
+ public void setLoadTextColorID(int textColor) {
+ this.mLoadTextView.setTextColor(textColor);
}
+ /**
+ * 设置跳动距离
+ *
+ * @param distance 跳动的距离
+ */
@Override
- public void setVisibility(int visibility) {
- this.setVisibility(visibility, mDelay);
- }
-
- public void setVisibility(int visibility, int delay) {
- super.setVisibility(visibility);
- if (visibility == View.VISIBLE) {
- startLoading(delay);
+ public void setJumpDistanceDP(int distance) {
+ // 默认最小的Distance为33dp
+ if (distance <= 33) {
+ mDistance = DimenUtil.dp2px(context, 33f);
} else {
- stopLoading();
+ mDistance = DimenUtil.dp2px(context, distance);
}
+ // 如果设置的distance大于默认高度的时候,取小
+ mDistance = Math.min(DimenUtil.defaultHeight(context), mDistance);
+ // 设置阴影的Margin,使得下方阴影始终在Shape下方
+ setViewMargin(mIndicationIm, false, (int) mDistance);
}
- public void setDelay(int delay) {
+ /**
+ * 获取暂停的时间,单位毫秒
+ */
+ public int getDelayMS() {
+ return mDelay;
+ }
+
+ /**
+ * 设置暂停时间,单位毫秒
+ */
+ public void setDelayMS(int delay) {
mDelay = delay;
}
- public int getDelay() {
- return mDelay;
+ /**
+ * 获取加载信息内容
+ */
+ public String getLoadingText() {
+ return mLoadTextView.getText().toString();
}
+ /**
+ * 设置加载信息
+ *
+ * @param loadingText 加载信息
+ */
public void setLoadingText(CharSequence loadingText) {
if (TextUtils.isEmpty(loadingText)) {
mLoadTextView.setVisibility(GONE);
} else {
mLoadTextView.setVisibility(VISIBLE);
}
-
mLoadTextView.setText(loadingText);
}
- public CharSequence getLoadingText(){
- return mLoadTextView.getText();
+ /**
+ * 设置加载信息字体的大小
+ *
+ * @param loadTextSize 字体大小,单位为sp
+ */
+ public void setLoadTextSizeSP(int loadTextSize) {
+ this.mLoadTextView.setTextSize(DimenUtil.sp2dp(context, loadTextSize));
}
/**
- * 上抛
+ * 设置弹跳的加速度
+ *
+ * @param acceleration 加速度,默认是1.2f
*/
- public void upThrow() {
-
- if (mUpAnimatorSet == null) {
- ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mShapeLoadingView, "translationY", mDistance, 0);
- ObjectAnimator scaleIndication = ObjectAnimator.ofFloat(mIndicationIm, "scaleX", 1f, 0.2f);
-
- ObjectAnimator objectAnimator1 = null;
- switch (mShapeLoadingView.getShape()) {
- case SHAPE_RECT:
-
- objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView, "rotation", 0, 180);
-
- break;
- case SHAPE_CIRCLE:
- objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView, "rotation", 0, 180);
-
- break;
- case SHAPE_TRIANGLE:
-
- objectAnimator1 = ObjectAnimator.ofFloat(mShapeLoadingView, "rotation", 0, 180);
-
- break;
- }
-
- mUpAnimatorSet = new AnimatorSet();
- mUpAnimatorSet.playTogether(objectAnimator, objectAnimator1, scaleIndication);
-
- mUpAnimatorSet.setDuration(ANIMATION_DURATION);
- mUpAnimatorSet.setInterpolator(new DecelerateInterpolator(FACTOR));
-
- mUpAnimatorSet.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
-
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mStopped) {
- freeFall();
- }
-
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
-
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
-
- }
- });
- }
- mUpAnimatorSet.start();
-
-
+ public void setAcceleration(float acceleration) {
+ this.acceleration = acceleration == 0 ? 1.2f : acceleration;
}
/**
- * 下落
+ * 设置动画的持续时间
+ *
+ * @param duration 动画持续时间,默认是383ms,单位毫秒
*/
- public void freeFall() {
-
- if (mDownAnimatorSet == null) {
- ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mShapeLoadingView, "translationY", 0, mDistance);
- ObjectAnimator scaleIndication = ObjectAnimator.ofFloat(mIndicationIm, "scaleX", 0.2f, 1f);
-
- mDownAnimatorSet = new AnimatorSet();
- mDownAnimatorSet.playTogether(objectAnimator, scaleIndication);
- mDownAnimatorSet.setDuration(ANIMATION_DURATION);
- mDownAnimatorSet.setInterpolator(new AccelerateInterpolator(FACTOR));
- mDownAnimatorSet.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
-
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mStopped) {
- mShapeLoadingView.changeShape();
- upThrow();
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
-
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
-
- }
- });
- }
- mDownAnimatorSet.start();
-
-
+ public void setDurationMS(int duration) {
+ this.duration = duration == 0 ? 383 : duration;
}
-
}
diff --git a/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingDialog.java b/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingDialog.java
index dd7b2b8..42dfcd6 100644
--- a/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingDialog.java
+++ b/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingDialog.java
@@ -3,17 +3,17 @@
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
-import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
-import android.view.LayoutInflater;
import android.view.View;
import com.mingle.shapeloading.R;
/**
- * Created by zzz40500 on 15/6/15.
+ * @author zzz40500
+ * @date 15/6/15
+ * @describe TODO
*/
-public class ShapeLoadingDialog extends Dialog{
+public class ShapeLoadingDialog extends Dialog {
private LoadingView mLoadingView;
@@ -31,10 +31,16 @@ protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_dialog);
- mLoadingView = (LoadingView) findViewById(R.id.loadView);
+ mLoadingView = findViewById(R.id.loadView);
- mLoadingView.setDelay(mBuilder.mDelay);
+ // 设置属性
+ mLoadingView.setDelayMS(mBuilder.mDelay);
+ mLoadingView.setDurationMS(mBuilder.mDuration);
mLoadingView.setLoadingText(mBuilder.mLoadText);
+ mLoadingView.setJumpDistanceDP(mBuilder.mDistance);
+ mLoadingView.setAcceleration(mBuilder.mAcceleration);
+ mLoadingView.setLoadTextSizeSP(mBuilder.mLoadTextSize);
+ mLoadingView.setLoadTextColorID(mBuilder.mLoadTextColor);
setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
@@ -54,13 +60,40 @@ public Builder getBuilder() {
return mBuilder;
}
- public static class Builder{
+ /**
+ * 使用建造者模式来构建Dialog
+ */
+ public static class Builder {
private Context mContext;
-
+ /**
+ * 暂停时间,默认暂停时间为80ms
+ */
private int mDelay = 80;
-
+ /**
+ * 加载信息
+ */
private CharSequence mLoadText;
+ /**
+ * 加载信息字体颜色
+ */
+ private int mLoadTextColor = 0xFF577FA1;
+ /**
+ * 加载信息字体大小,单位SP,默认为16sp
+ */
+ private int mLoadTextSize = 16;
+ /**
+ * 设置跳动的距离,默认最小的distance为33dp
+ */
+ private int mDistance = 0;
+ /**
+ * 设置弹跳的加速度
+ */
+ private float mAcceleration;
+ /**
+ * 设置动画的持续时间,最小为383ms
+ */
+ private int mDuration;
private boolean mCancelable = true;
@@ -70,7 +103,7 @@ public Builder(Context context) {
mContext = context;
}
- public Builder delay(int delay) {
+ public Builder delayMS(int delay) {
mDelay = delay;
return this;
}
@@ -85,6 +118,31 @@ public Builder loadText(int resId) {
return this;
}
+ public Builder loadTextColorID(int colorId) {
+ mLoadTextColor = colorId;
+ return this;
+ }
+
+ public Builder loadTextSizeSP(int spSize) {
+ mLoadTextSize = spSize;
+ return this;
+ }
+
+ public Builder distanceDP(int distance) {
+ mDistance = distance;
+ return this;
+ }
+
+ public Builder acceleration(float acceleration) {
+ mAcceleration = acceleration;
+ return this;
+ }
+
+ public Builder duration(int duration) {
+ mDuration = duration;
+ return this;
+ }
+
public Builder cancelable(boolean cancelable) {
mCancelable = cancelable;
mCanceledOnTouchOutside = cancelable;
@@ -96,11 +154,11 @@ public Builder canceledOnTouchOutside(boolean canceledOnTouchOutside) {
return this;
}
- public ShapeLoadingDialog build(){
+ public ShapeLoadingDialog build() {
return new ShapeLoadingDialog(this);
}
- public ShapeLoadingDialog show(){
+ public ShapeLoadingDialog show() {
ShapeLoadingDialog dialog = build();
dialog.show();
return dialog;
diff --git a/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingView.java b/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingView.java
index 77c2bf1..a7fef18 100644
--- a/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingView.java
+++ b/shapeloading/src/main/java/com/mingle/widget/ShapeLoadingView.java
@@ -7,31 +7,40 @@
import android.graphics.Path;
import android.os.Build;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.View;
import com.mingle.shapeloading.R;
import com.nineoldandroids.animation.ArgbEvaluator;
+import java.util.LinkedList;
+import java.util.Queue;
+
+import static com.mingle.widget.LoadingView.TAG;
+
/**
- * Created by zzz40500 on 15/4/4.
+ * @author zzz40500
+ * @date 15/4/4
*/
public class ShapeLoadingView extends View {
/**
- * 用赛贝尔曲线画圆
+ * 用贝塞尔曲线画圆
*/
private static final float mMagicNumber = 0.55228475f;
private static final float genhao3 = 1.7320508075689f;
- private static final float mTriangle2Circle =0.25555555f;
-
+ private static final float mTriangle2Circle = 0.25555555f;
+ public boolean mIsLoading = false;
+ private Queue shapes = new LinkedList<>();
private Shape mShape = Shape.SHAPE_CIRCLE;
-
- private ArgbEvaluator mArgbEvaluator=new ArgbEvaluator();
-
- private int mTriangleColor ;
- private int mCircleColor ;
- private int mRectColor ;
-
+ private ArgbEvaluator mArgbEvaluator = new ArgbEvaluator();
+ private int mTriangleColor;
+ private int mCircleColor;
+ private int mRectColor;
+ private Paint mPaint;
+ private float mControlX = 0;
+ private float mControlY = 0;
+ private float mAnimPercent;
public ShapeLoadingView(Context context) {
super(context);
@@ -55,75 +64,67 @@ public ShapeLoadingView(Context context, AttributeSet attrs, int defStyleAttr, i
}
private void init(Context context) {
+ shapes.add(Shape.SHAPE_CIRCLE);
+ shapes.add(Shape.SHAPE_RECT);
+ shapes.add(Shape.SHAPE_TRIANGLE);
+
mTriangleColor = getColor(context, R.color.triangle);
- mCircleColor =getColor(context, R.color.circle);
+ mCircleColor = getColor(context, R.color.circle);
mRectColor = getColor(context, R.color.rect);
mPaint = new Paint();
mPaint.setColor(mTriangleColor);
mPaint.setAntiAlias(true);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
-
}
- public boolean mIsLoading = false;
- private Paint mPaint;
- private float mControlX = 0;
- private float mControlY = 0;
- private float mAnimPercent;
-
-
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
-
- if(getVisibility()==GONE){
+ if (getVisibility() == GONE) {
return;
}
// FIXME: 15/6/15 动画待优化
switch (mShape) {
+ // 矩形
case SHAPE_TRIANGLE:
-
if (mIsLoading) {
mAnimPercent += 0.1611113;
- int color= (int) mArgbEvaluator.evaluate(mAnimPercent,mTriangleColor,mCircleColor);
+ int color = (int) mArgbEvaluator.evaluate(mAnimPercent, mTriangleColor, mCircleColor);
mPaint.setColor(color);
- // triangle to circle
+
Path path = new Path();
path.moveTo(relativeXFromView(0.5f), relativeYFromView(0f));
if (mAnimPercent >= 1) {
mShape = Shape.SHAPE_CIRCLE;
mIsLoading = false;
- mAnimPercent=1;
+ mAnimPercent = 1;
}
- float controlX = mControlX - relativeXFromView(mAnimPercent* mTriangle2Circle)
+ float controlX = mControlX - relativeXFromView(mAnimPercent * mTriangle2Circle)
* genhao3;
- float controlY = mControlY - relativeYFromView(mAnimPercent* mTriangle2Circle);
+ float controlY = mControlY - relativeYFromView(mAnimPercent * mTriangle2Circle);
path.quadTo(relativeXFromView(1) - controlX, controlY, relativeXFromView(0.5f + genhao3 / 4), relativeYFromView(0.75f));
- path.quadTo(relativeXFromView(0.5f), relativeYFromView(0.75f + 2 * mAnimPercent* mTriangle2Circle), relativeXFromView(0.5f - genhao3 / 4), relativeYFromView(0.75f));
+ path.quadTo(relativeXFromView(0.5f), relativeYFromView(0.75f + 2 * mAnimPercent * mTriangle2Circle), relativeXFromView(0.5f - genhao3 / 4), relativeYFromView(0.75f));
path.quadTo(controlX, controlY, relativeXFromView(0.5f), relativeYFromView(0f));
path.close();
canvas.drawPath(path, mPaint);
invalidate();
-
} else {
Path path = new Path();
mPaint.setColor(mTriangleColor);
path.moveTo(relativeXFromView(0.5f), relativeYFromView(0f));
path.lineTo(relativeXFromView(1), relativeYFromView(genhao3 / 2f));
- path.lineTo(relativeXFromView(0), relativeYFromView(genhao3/2f));
+ path.lineTo(relativeXFromView(0), relativeYFromView(genhao3 / 2f));
mControlX = relativeXFromView(0.5f - genhao3 / 8.0f);
mControlY = relativeYFromView(3 / 8.0f);
mAnimPercent = 0;
path.close();
canvas.drawPath(path, mPaint);
-
}
break;
+ // 圆形
case SHAPE_CIRCLE:
-
-
if (mIsLoading) {
float magicNumber = mMagicNumber + mAnimPercent;
mAnimPercent += 0.12;
@@ -131,7 +132,7 @@ protected void onDraw(Canvas canvas) {
mShape = Shape.SHAPE_RECT;
mIsLoading = false;
}
- int color= (int) mArgbEvaluator.evaluate(mAnimPercent,mCircleColor,mRectColor);
+ int color = (int) mArgbEvaluator.evaluate(mAnimPercent, mCircleColor, mRectColor);
mPaint.setColor(color);
Path path = new Path();
@@ -151,14 +152,11 @@ protected void onDraw(Canvas canvas) {
relativeXFromView(0.5f - magicNumber / 2), relativeYFromView(0),
relativeXFromView(0.5f), relativeYFromView(0f));
-
path.close();
canvas.drawPath(path, mPaint);
-
invalidate();
} else {
-
mPaint.setColor(mCircleColor);
Path path = new Path();
@@ -181,64 +179,53 @@ protected void onDraw(Canvas canvas) {
path.close();
canvas.drawPath(path, mPaint);
-
-
}
-
break;
+ // 三角形
case SHAPE_RECT:
-
-
if (mIsLoading) {
-
-
mAnimPercent += 0.15;
if (mAnimPercent >= 1) {
mShape = Shape.SHAPE_TRIANGLE;
mIsLoading = false;
mAnimPercent = 1;
}
- int color= (int) mArgbEvaluator.evaluate(mAnimPercent,mRectColor,mTriangleColor);
+ int color = (int) mArgbEvaluator.evaluate(mAnimPercent, mRectColor, mTriangleColor);
mPaint.setColor(color);
- Path path = new Path();
- path.moveTo(relativeXFromView(0.5f * mAnimPercent), 0);
- path.lineTo(relativeYFromView(1 - 0.5f * mAnimPercent), 0);
+
float distanceX = (mControlX) * mAnimPercent;
float distanceY = (relativeYFromView(1f) - mControlY) * mAnimPercent;
+ Path path = new Path();
+ path.moveTo(relativeXFromView(0.5f * mAnimPercent), 0);
+ path.lineTo(relativeYFromView(1 - 0.5f * mAnimPercent), 0);
path.lineTo(relativeXFromView(1f) - distanceX, relativeYFromView(1f) - distanceY);
path.lineTo(relativeXFromView(0f) + distanceX, relativeYFromView(1f) - distanceY);
-
path.close();
-
canvas.drawPath(path, mPaint);
invalidate();
-
} else {
mPaint.setColor(mRectColor);
mControlX = relativeXFromView(0.5f - genhao3 / 4);
mControlY = relativeYFromView(0.75f);
+
Path path = new Path();
path.moveTo(relativeXFromView(0f), relativeYFromView(0f));
path.lineTo(relativeXFromView(1f), relativeYFromView(0f));
path.lineTo(relativeXFromView(1f), relativeYFromView(1f));
path.lineTo(relativeXFromView(0f), relativeYFromView(1f));
path.close();
+
mAnimPercent = 0;
canvas.drawPath(path, mPaint);
-
}
-
-
break;
-
+ default:
+ break;
}
-
-
}
-
private float relativeXFromView(float percent) {
return getWidth() * percent;
}
@@ -247,28 +234,20 @@ private float relativeYFromView(float percent) {
return getHeight() * percent;
}
-
+ /**
+ * 变换形状
+ */
public void changeShape() {
mIsLoading = true;
+ mShape = shapes.poll();
+ shapes.add(mShape);
invalidate();
}
- public void setShape(Shape shape){
- mIsLoading = true;
- mShape = shape;
- invalidate();
- }
-
- public enum Shape {
- SHAPE_TRIANGLE, SHAPE_RECT, SHAPE_CIRCLE
- }
-
-
@Override
public void setVisibility(int visibility) {
super.setVisibility(visibility);
-
- if(visibility==VISIBLE){
+ if (visibility == VISIBLE) {
invalidate();
}
}
@@ -277,6 +256,12 @@ public Shape getShape() {
return mShape;
}
+ public void setShape(Shape shape) {
+ mIsLoading = true;
+ mShape = shape;
+ invalidate();
+ }
+
private int getColor(Context context, int id) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return context.getColor(id);
@@ -284,4 +269,19 @@ private int getColor(Context context, int id) {
return context.getResources().getColor(id);
}
}
+
+ public enum Shape {
+ /**
+ * 三角形
+ */
+ SHAPE_TRIANGLE,
+ /**
+ * 矩形
+ */
+ SHAPE_RECT,
+ /**
+ * 圆形
+ */
+ SHAPE_CIRCLE
+ }
}
diff --git a/shapeloading/src/main/java/com/mingle/widget/util/DimenUtil.java b/shapeloading/src/main/java/com/mingle/widget/util/DimenUtil.java
new file mode 100644
index 0000000..b68b02d
--- /dev/null
+++ b/shapeloading/src/main/java/com/mingle/widget/util/DimenUtil.java
@@ -0,0 +1,62 @@
+package com.mingle.widget.util;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.os.Build;
+import android.util.TypedValue;
+import android.view.WindowManager;
+
+/**
+ * @author wangyu
+ * @date 18-2-10
+ * @describe TODO
+ */
+
+public class DimenUtil {
+ public static int dp2px(Context context, float dpValue) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (int) (dpValue * scale + 0.5f);
+ }
+
+ public static float px2dp(Context context, float pxVal) {
+ final float scale = context.getResources().getDisplayMetrics().density;
+ return (pxVal / scale);
+ }
+
+ public static int sp2px(Context context, float spVal) {
+ return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
+ spVal, context.getResources().getDisplayMetrics());
+ }
+
+ public static int sp2dp(Context context, float spVal) {
+ return (int) px2dp(context, sp2px(context, spVal));
+ }
+
+ /**
+ * 获取屏幕的高度,单位是PX
+ *
+ * @param context context
+ */
+ private static int getScreenHeight(Context context) {
+ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ if (wm == null) {
+ return context.getResources().getDisplayMetrics().heightPixels;
+ }
+ Point point = new Point();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ wm.getDefaultDisplay().getRealSize(point);
+ } else {
+ wm.getDefaultDisplay().getSize(point);
+ }
+ return point.y;
+ }
+
+ /**
+ * 默认的高度
+ *
+ * @param context context
+ */
+ public static int defaultHeight(Context context) {
+ return (int) px2dp(context, DimenUtil.getScreenHeight(context) - DimenUtil.dp2px(context, 108));
+ }
+}
diff --git a/shapeloading/src/main/res/drawable/aa_dialog_bg.xml b/shapeloading/src/main/res/drawable/aa_dialog_bg.xml
index a785252..1d0259b 100644
--- a/shapeloading/src/main/res/drawable/aa_dialog_bg.xml
+++ b/shapeloading/src/main/res/drawable/aa_dialog_bg.xml
@@ -1,7 +1,7 @@
-
+
+
+
\ No newline at end of file
diff --git a/shapeloading/src/main/res/drawable/shadow.xml b/shapeloading/src/main/res/drawable/shadow.xml
index b5ef634..84c342c 100644
--- a/shapeloading/src/main/res/drawable/shadow.xml
+++ b/shapeloading/src/main/res/drawable/shadow.xml
@@ -1,8 +1,7 @@
- android:shape="oval"
- >
-
+
\ No newline at end of file
diff --git a/shapeloading/src/main/res/layout/load_view.xml b/shapeloading/src/main/res/layout/load_view.xml
index 77849ba..00b12ce 100644
--- a/shapeloading/src/main/res/layout/load_view.xml
+++ b/shapeloading/src/main/res/layout/load_view.xml
@@ -1,32 +1,37 @@
-
+ android:layout_marginTop="2dp" />
+ android:src="@drawable/shadow" />
+ tool:text="正在加载中..."
+ tool:visibility="visible" />
\ No newline at end of file
diff --git a/shapeloading/src/main/res/values/loading_attr.xml b/shapeloading/src/main/res/values/loading_attr.xml
index 20b4d48..35e51ad 100644
--- a/shapeloading/src/main/res/values/loading_attr.xml
+++ b/shapeloading/src/main/res/values/loading_attr.xml
@@ -1,9 +1,23 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/shapeloading/src/main/res/values/loading_color.xml b/shapeloading/src/main/res/values/loading_color.xml
index 0a3b404..948ce76 100644
--- a/shapeloading/src/main/res/values/loading_color.xml
+++ b/shapeloading/src/main/res/values/loading_color.xml
@@ -7,5 +7,6 @@
#00000000
#25808080
#f5f5f5
+ #577FA1
\ No newline at end of file