From 8521954fa97bdfc54123afb4a72755ece311db06 Mon Sep 17 00:00:00 2001
From: zuojincheng <lf_zuo@163.com>
Date: 星期五, 21 三月 2025 14:45:45 +0800
Subject: [PATCH] feat(general): 更新登录逻辑和用户信息展示
---
generallibrary/src/main/java/com/dayu/general/model/CardInfoModel.kt | 22
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java | 57
qiheonlinelibrary/build.gradle | 3
generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt | 7
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java | 83 +
qihealonelibrary/build.gradle | 2
generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt | 34
pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java | 35
generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt | 37
generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt | 10
gradlew.bat | 22
baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java | 13
generallibrary/build.gradle | 11
generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt | 7
generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt | 8
generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt | 11
generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt | 8
henanlibrary/build.gradle | 2
generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt | 7
generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt | 11
generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt | 8
pickerviewlibrary/src/main/res/values/attrs.xml | 9
gradlew | 7
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java | 100 +
generallibrary/src/main/java/com/dayu/general/view/ProjectDialog.kt | 16
pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java | 64 +
generallibrary/proguard-rules.pro | 10
generallibrary/src/main/java/com/dayu/general/BaseApplication.kt | 42
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java | 60
pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java | 30
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java | 80 +
README.md | 274 ++++
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java | 81 +
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java | 69 +
generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt | 3
pickerviewlibrary/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java | 106 +
generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt | 3
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java | 73 +
generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt | 1
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java | 62
app/proguard-rules.pro | 11
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java | 62
generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt | 2
pickerviewlibrary/src/main/java/com/wang/avi/Indicator.java | 201 +++
generallibrary/src/main/res/layout/fragment_my.xml | 117 +
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java | 60
app/src/main/java/com/dayu/recharge/activity/LoginActivity.java | 2
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java | 56
generallibrary/src/main/java/com/dayu/general/bean/net/LoginResult.kt | 9
pickerviewlibrary/src/main/java/com/wang/avi/AVLoadingIndicatorView.java | 419 ++++++
generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt | 7
generallibrary/src/main/AndroidManifest.xml | 10
generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt | 6
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java | 114 +
generallibrary/src/main/java/com/dayu/general/activity/LoginActivity.kt | 19
pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java | 61
pickerviewlibrary/src/main/java/com/wang/avi/indicators/PacmanIndicator.java | 115 +
generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt | 91 +
generallibrary/src/main/java/com/dayu/general/tool/CardCommon.kt | 2
generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt | 3
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java | 89 +
pickerviewlibrary/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java | 86 +
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java | 67 +
generallibrary/src/main/java/com/dayu/general/tool/BaseCommon.kt | 4
pickerviewlibrary/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java | 80 +
generallibrary/src/main/res/layout/activity_manage_list_ge.xml | 2
pickerviewlibrary/src/main/res/values/styles.xml | 24
/dev/null | 0
generallibrary/src/main/res/layout/activity_manager_read.xml | 126 ++
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java | 76 +
generallibrary/src/main/java/com/dayu/general/bean/net/UserInfoResult.kt | 26
generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt | 13
local.properties | 5
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java | 92 +
generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt | 47
henanlibrary/proguard-rules.pro | 11
pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java | 68 +
pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java | 35
pickerviewlibrary/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java | 43
79 files changed, 3,581 insertions(+), 168 deletions(-)
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7bbc25a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,274 @@
+# 鍏呭�肩郴缁� (Recharge System)
+
+杩欐槸涓�涓熀浜嶢ndroid鐨勫厖鍊肩郴缁熼」鐩紝閲囩敤妯″潡鍖栨灦鏋勮璁★紝浣跨敤Room鏁版嵁搴撹繘琛屾暟鎹寔涔呭寲瀛樺偍銆�
+
+## 椤圭洰缁撴瀯
+
+椤圭洰鍖呭惈浠ヤ笅妯″潡锛�
+
+- `app`: 涓诲簲鐢ㄦā鍧�
+- `baselibrary`: 鍩虹搴擄紝鍖呭惈鍩烘湰宸ュ叿绫诲拰閫氱敤缁勪欢
+- `generallibrary`: 閫氱敤鍔熻兘搴擄紝鍖呭惈鏁版嵁搴撴搷浣滅瓑閫氱敤鍔熻兘
+- `henanlibrary`: 娌冲崡鍦板尯鐗瑰畾鍔熻兘妯″潡
+- `qihealonelibrary`: 榻愭渤鍗曟満鐗堝姛鑳芥ā鍧�
+- `qiheonlinelibrary`: 榻愭渤鍦ㄧ嚎鐗堝姛鑳芥ā鍧�
+- `ocridcardlibrary`: 韬唤璇佽瘑鍒ā鍧�
+- `easysocket`: Socket閫氫俊妯″潡
+- `pickerviewlibrary`: 閫夋嫨鍣ㄨ鍥惧簱
+
+## 鎶�鏈爤
+
+- 寮�鍙戣瑷�锛欿otlin & Java
+- 鏁版嵁搴擄細Room
+- 缃戠粶閫氫俊锛歊etrofit & Socket
+- 渚濊禆娉ㄥ叆锛氭湭浣跨敤
+- 寮傛澶勭悊锛歊xJava
+- 鏉冮檺绠$悊锛歑XPermissions
+- 瑙嗗浘缁戝畾锛�
+ - ViewBinding锛氱敤浜庡畨鍏ㄩ珮鏁堝湴璁块棶瑙嗗浘
+ - DataBinding锛氱敤浜庢暟鎹┍鍔║I鐨凪VVM鏋舵瀯瀹炵幇
+
+## 瑙嗗浘缁戝畾閰嶇疆
+
+### ViewBinding
+鍦ㄦā鍧楃骇build.gradle涓惎鐢╒iewBinding锛�
+```gradle
+android {
+ buildFeatures {
+ viewBinding true
+ }
+}
+```
+
+浣跨敤绀轰緥锛�
+```kotlin
+class ExampleActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityExampleBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityExampleBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+
+ // 鐩存帴璁块棶瑙嗗浘
+ binding.textView.text = "Hello ViewBinding"
+ }
+}
+```
+
+### DataBinding
+鍦ㄦā鍧楃骇build.gradle涓惎鐢―ataBinding锛�
+```gradle
+android {
+ buildFeatures {
+ dataBinding true
+ }
+}
+```
+
+浣跨敤绀轰緥锛�
+1. 甯冨眬鏂囦欢锛�
+```xml
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+ <data>
+ <variable
+ name="user"
+ type="com.example.User" />
+ </data>
+ <LinearLayout>
+ <TextView
+ android:text="@{user.name}" />
+ </LinearLayout>
+</layout>
+```
+
+2. Activity涓娇鐢細
+```kotlin
+class ExampleActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityExampleBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = DataBindingUtil.setContentView(this, R.layout.activity_example)
+
+ binding.user = User("寮犱笁")
+ binding.lifecycleOwner = this
+ }
+}
+```
+
+### 鏈�浣冲疄璺�
+- ViewBinding锛�
+ - 鐢ㄤ簬绠�鍗曠殑瑙嗗浘璁块棶鍦烘櫙
+ - 鏇夸唬findViewById锛岄伩鍏嶇┖鎸囬拡寮傚父
+ - 缂栬瘧鏃剁被鍨嬪畨鍏�
+
+- DataBinding锛�
+ - 鐢ㄤ簬瀹炵幇MVVM鏋舵瀯
+ - 鏁版嵁椹卞姩UI鏇存柊
+ - 鍙屽悜缁戝畾鏀寔
+ - 鑷畾涔夌粦瀹氶�傞厤鍣�
+ - 琛ㄨ揪寮忔敮鎸�
+
+## 鏁版嵁搴撶粨鏋�
+
+### GeneralLibrary 鏁版嵁搴�
+```kotlin
+@Database(entities = [PassWordCardBean::class, CardData::class, ProjectDataBean::class], version = 1)
+```
+
+涓昏瀹炰綋锛�
+- PassWordCardBean: 瀵嗙爜鍗℃暟鎹�
+- CardData: 鍗$墖鏁版嵁
+- ProjectDataBean: 椤圭洰鏁版嵁
+
+## 寮�鍙戠幆澧冭姹�
+
+- Android Studio Arctic Fox鎴栨洿楂樼増鏈�
+- JDK 8鎴栨洿楂樼増鏈�
+- Android SDK API 23鎴栨洿楂樼増鏈�
+- Gradle 7.0鎴栨洿楂樼増鏈�
+
+## 鏋勫缓涓庤繍琛�
+
+1. 鍏嬮殕椤圭洰锛�
+```bash
+git clone [椤圭洰鍦板潃]
+```
+
+2. 鍦ˋndroid Studio涓墦寮�椤圭洰
+
+3. 鍚屾Gradle鏂囦欢
+
+4. 鏋勫缓椤圭洰锛�
+```bash
+./gradlew build
+```
+
+5. 杩愯搴旂敤锛�
+ - 閫氳繃Android Studio杩愯
+ - 鎴栦娇鐢ㄥ懡浠よ锛歚./gradlew installDebug`
+
+## 妯″潡璇存槑
+
+### BaseLibrary
+鍩虹鍔熻兘搴擄紝鎻愪緵锛�
+- 鍩虹Activity
+- 閫氱敤宸ュ叿绫�
+- 鍩虹UI缁勪欢
+
+### GeneralLibrary
+閫氱敤鍔熻兘妯″潡锛屽寘鍚細
+- Room鏁版嵁搴撳疄鐜�
+- 鏁版嵁璁块棶瀵硅薄锛圖AO锛�
+- 瀹炰綋绫诲畾涔�
+
+### 鍏朵粬妯″潡
+- HenanlLibrary: 娌冲崡鍦板尯鐗瑰畾鍔熻兘
+- QiheAloneLibrary: 榻愭渤鍗曟満鐗堢壒瀹氬姛鑳�
+- QiheOnlineLibrary: 榻愭渤鍦ㄧ嚎鐗堢壒瀹氬姛鑳�
+- OCRIDCardLibrary: 韬唤璇佽瘑鍒姛鑳�
+- EasySocket: Socket閫氫俊瀹炵幇
+- PickerViewLibrary: 閫夋嫨鍣ㄦ帶浠�
+
+## 鑷畾涔夌粍浠朵娇鐢ㄨ鏄�
+
+### TitleBar 鏍囬鏍忕粍浠�
+
+TitleBar鏄竴涓嚜瀹氫箟鐨勬爣棰樻爮缁勪欢锛屾彁渚涗簡宸︿腑鍙充笁涓綅缃殑鏂囨湰鍜屽浘鐗囪缃姛鑳姐��
+
+#### XML灞炴�ч厤缃�
+```xml
+<com.dayu.baselibrary.view.TitleBar
+ android:id="@+id/titleBar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/dimen_title_height"
+ app:leftText="杩斿洖"
+ app:leftImage="@drawable/ic_back"
+ app:centerText="鏍囬"
+ app:centerImage="@drawable/ic_logo"
+ app:rightText="鏇村"
+ app:rightImage="@drawable/ic_more"/>
+```
+
+#### 浠g爜涓娇鐢�
+
+1. 璁剧疆鏂囨湰鍜屽浘鐗�
+```kotlin
+titleBar.apply {
+ setLeftText("杩斿洖")
+ setLeftImage(R.drawable.ic_back)
+ setCenterText("鏍囬")
+ setRightText("鏇村")
+ setRightImage(R.drawable.ic_more)
+}
+```
+
+2. 鐐瑰嚮浜嬩欢鐩戝惉
+```kotlin
+// 鏂瑰紡1锛氫娇鐢ㄧ被鍨嬪父閲忥紙鎺ㄨ崘锛�
+titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE) { finish() }
+titleBar.setOnItemclickListner(TitleBar.ClickType_RIGHT_TEXT) { showMenu() }
+
+// 鏂瑰紡2锛氫娇鐢ㄤ綅缃拰绫诲瀷甯搁噺锛堝凡搴熷純锛�
+titleBar.setOnItemclickListner(TitleBar.IMAGE, TitleBar.LEFT) { finish() }
+```
+
+#### 鐐瑰嚮绫诲瀷甯搁噺璇存槑
+- `ClickType_LEFT_TEXT`: 宸︿晶鏂囨湰鐐瑰嚮
+- `ClickType_LEFT_IMAGE`: 宸︿晶鍥剧墖鐐瑰嚮
+- `ClickType_CENTER_TEXT`: 涓棿鏂囨湰鐐瑰嚮
+- `ClickType_CENTER_IMAGE`: 涓棿鍥剧墖鐐瑰嚮
+- `ClickType_RIGHT_TEXT`: 鍙充晶鏂囨湰鐐瑰嚮
+- `ClickType_RIGHT_IMAGE`: 鍙充晶鍥剧墖鐐瑰嚮
+
+#### 鍏朵粬鍔熻兘
+```kotlin
+// 璁剧疆鍙充晶鎸夐挳鐘舵��
+titleBar.setRightStatus(false) // 绂佺敤鍙充晶鎸夐挳
+
+// 璁剧疆鍙充晶鍥剧墖鍙鎬�
+titleBar.setRightIMGVisibility(View.GONE)
+
+// 鑾峰彇涓棿鐨凾extView
+val titleTextView = titleBar.getTitleTextView()
+
+// 鑾峰彇鍙充晶甯冨眬
+val rightLayout = titleBar.getLlRight()
+```
+
+#### 娉ㄦ剰浜嬮」
+1. 鐐瑰嚮浜嬩欢鍙湁鍦ㄥ搴旂殑瑙嗗浘鍙鏃舵墠浼氱敓鏁�
+2. 璁剧疆鏂囨湰鎴栧浘鐗囨椂锛屽鏋滀紶鍏ull鎴�0锛屽搴旂殑瑙嗗浘灏嗚闅愯棌
+3. 缁勪欢榛樿浣跨敤鍨傜洿绾挎�у竷灞�锛岀‘淇濆湪甯冨眬鏂囦欢涓缃悎閫傜殑楂樺害
+
+## 娉ㄦ剰浜嬮」
+
+1. 鏁版嵁搴撹縼绉�
+ - 褰撲慨鏀规暟鎹簱缁撴瀯鏃讹紝闇�瑕佹洿鏂扮増鏈彿
+ - 鎻愪緵鐩稿簲鐨凪igration绛栫暐
+
+2. 鏉冮檺澶勭悊
+ - 纭繚鍦ㄤ娇鐢ㄧ浉鍏冲姛鑳藉墠鐢宠蹇呰鏉冮檺
+ - 浣跨敤XXPermissions杩涜鏉冮檺绠$悊
+
+3. 鏁版嵁瀹夊叏
+ - 鏁忔劅鏁版嵁闇�瑕佸姞瀵嗗瓨鍌�
+ - 娉ㄦ剰鐢ㄦ埛鏁版嵁鐨勫畨鍏ㄥ鐞�
+
+## 璐$尞鎸囧崡
+
+1. Fork 椤圭洰
+2. 鍒涘缓鐗规�у垎鏀�
+3. 鎻愪氦鏇存敼
+4. 鎺ㄩ�佸埌鍒嗘敮
+5. 鍒涘缓Pull Request
+
+## 璁稿彲璇�
+
+[娣诲姞璁稿彲璇佷俊鎭痌
+
+## 鑱旂郴鏂瑰紡
+
+[娣诲姞鑱旂郴鏂瑰紡]
\ No newline at end of file
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index b536631..fb3619d 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -143,4 +143,13 @@
#鍏朵粬
-keep class com.contrarywind.** {*;}
-keep class com.bigkoo.** {*;}
--keep class org.** {*;}
\ No newline at end of file
+-keep class org.** {*;}
+
+# Room 鏁版嵁搴�
+-keep class * extends androidx.room.RoomDatabase
+-keep class * extends androidx.room.Entity
+-keep class * extends androidx.room.Dao
+-keep @androidx.room.Entity class *
+-keepclassmembers class * {
+ @androidx.room.* *;
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/dayu/recharge/activity/LoginActivity.java b/app/src/main/java/com/dayu/recharge/activity/LoginActivity.java
index 2bc4efd..95e798e 100644
--- a/app/src/main/java/com/dayu/recharge/activity/LoginActivity.java
+++ b/app/src/main/java/com/dayu/recharge/activity/LoginActivity.java
@@ -130,7 +130,7 @@
} else if (type == BaseCommon.Generalv1Library) {
binding.nameLL.setVisibility(View.VISIBLE);
getGeneralV1Permission();
- ProjectDialog projectDialog=new ProjectDialog(this);
+ ProjectDialog projectDialog=new ProjectDialog(this,MyApplication.myApplication);
projectDialog.show();
}
MyApplication.myApplication.initApplication();
diff --git a/baselibrary/libs/avi.library-2.1.3.aar b/baselibrary/libs/avi.library-2.1.3.aar
deleted file mode 100644
index c0527f4..0000000
--- a/baselibrary/libs/avi.library-2.1.3.aar
+++ /dev/null
Binary files differ
diff --git a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
index 95ac200..c7a5200 100644
--- a/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
+++ b/baselibrary/src/main/java/com/dayu/baselibrary/tools/nfc/NativeNfcReadHelper.java
@@ -386,12 +386,19 @@
mfc.connect();
//鑾峰彇褰撳墠鍗″彿
boolean isOpen = false;
- for (int i = 0; i < listKeyA.size(); i++) {
- if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+ if (!listKeyA.isEmpty()){
+ for (int i = 0; i < listKeyA.size(); i++) {
+ if (mfc.authenticateSectorWithKeyA(0, listKeyA.get(i))) {
+ isOpen = true;
+ break;
+ }
+ }
+ }else if (!listA_PS.isEmpty()){
+ if (mfc.authenticateSectorWithKeyA(0, listA_PS.get(0))){
isOpen = true;
- break;
}
}
+
if (isOpen) {
int bIndex = mfc.sectorToBlock(0);
byte[] data = mfc.readBlock(bIndex + 0);
diff --git a/generallibrary/build.gradle b/generallibrary/build.gradle
index 80bf8d8..a598a66 100644
--- a/generallibrary/build.gradle
+++ b/generallibrary/build.gradle
@@ -1,12 +1,13 @@
plugins {
id 'com.android.library'
id 'org.jetbrains.kotlin.android'
+ id 'kotlin-kapt'
}
android {
namespace 'com.dayu.general'
compileSdk 34
-
+ ndkVersion '21.0.6113669'
defaultConfig {
minSdk 23
@@ -46,16 +47,20 @@
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.11.0'
+ implementation "androidx.activity:activity-ktx:1.8.2"
+ implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0"
+ implementation "androidx.fragment:fragment-ktx:1.6.2"
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
+ compileOnly project(':pickerviewlibrary')
//鏁版嵁搴�
implementation "androidx.room:room-runtime:2.3.0"
implementation "androidx.room:room-ktx:2.3.0"
runtimeOnly("androidx.room:room-common:2.3.0")
- annotationProcessor "androidx.room:room-compiler:2.3.0"
+ kapt "androidx.room:room-compiler:2.3.0"
//鏉冮檺鐢宠
compileOnly 'com.github.getActivity:XXPermissions:18.5'
@@ -80,7 +85,7 @@
//寤鸿娣诲姞 ViewPager2 鐨勬槑纭緷璧�
implementation "androidx.viewpager2:viewpager2:1.1.0-beta01"
implementation "androidx.fragment:fragment:1.6.2"
- implementation files('../baselibrary/libs/avi.library-2.1.3.aar')
+
implementation 'com.tencent.bugly:crashreport:4.1.9.3'
}
\ No newline at end of file
diff --git a/generallibrary/proguard-rules.pro b/generallibrary/proguard-rules.pro
index 481bb43..965bfa3 100644
--- a/generallibrary/proguard-rules.pro
+++ b/generallibrary/proguard-rules.pro
@@ -18,4 +18,12 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
-#-renamesourcefileattribute SourceFile
\ No newline at end of file
+#-renamesourcefileattribute SourceFile
+# Room 鏁版嵁搴�
+-keep class * extends androidx.room.RoomDatabase
+-keep class * extends androidx.room.Entity
+-keep class * extends androidx.room.Dao
+-keep @androidx.room.Entity class *
+-keepclassmembers class * {
+ @androidx.room.* *;
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/AndroidManifest.xml b/generallibrary/src/main/AndroidManifest.xml
index 5f247eb..61b5501 100644
--- a/generallibrary/src/main/AndroidManifest.xml
+++ b/generallibrary/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+<manifest xmlns:tools="http://schemas.android.com/tools"
+ xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.NFC" />
<!--鐢ㄤ簬璁块棶缃戠粶锛岀綉缁滃畾浣嶉渶瑕佷笂缃�-->
@@ -50,7 +51,12 @@
<activity android:name="com.dayu.general.activity.ManageListActivity" />
<activity android:name="com.dayu.general.activity.SearchUserActivity"/>
<activity android:name="com.dayu.general.activity.NfcWreatActivity" />
- <activity android:name="com.dayu.general.activity.NewCardActivity"/>
+ <activity android:name=".activity.MainActivity"/>
+ <activity
+ android:name=".activity.ManagerReadActivity"
+ android:screenOrientation="portrait"
+ android:windowSoftInputMode="adjustResize"/>
+
<meta-data
diff --git a/generallibrary/src/main/java/com/dayu/general/BaseApplication.kt b/generallibrary/src/main/java/com/dayu/general/BaseApplication.kt
index 6349cfc..15842a8 100644
--- a/generallibrary/src/main/java/com/dayu/general/BaseApplication.kt
+++ b/generallibrary/src/main/java/com/dayu/general/BaseApplication.kt
@@ -3,6 +3,7 @@
import android.app.Application
import android.nfc.Tag
import com.dayu.general.dao.BaseDaoSingleton
+import com.dayu.general.dao.ProjectDataDao
class BaseApplication private constructor() {
@@ -15,29 +16,44 @@
@Volatile
private var myApplication: BaseApplication? = null
- private var Tag : String ?= ""
- var projectDataDao = BaseDaoSingleton.getInstance(application)?.projectDataDao()
+ var tag: String = ""
+ var token: String = ""
+ var userId: String = ""
+
+ var userName: String = ""
+ var userPhone: String = ""
+
+ //鐗囧尯淇℃伅
+ var blockId:String=""
+ var blockName:String=""
+
+
+ var projectDataDao: ProjectDataDao? = null
+
@JvmStatic
fun getInstance(application: Application): BaseApplication {
if (myApplication == null) {
- myApplication = BaseApplication()
BaseApplication.application = application
+ myApplication = BaseApplication().apply {
+ // 閫氳繃瀹炰緥璋冪敤 init()
+ init()
+ }
}
- return myApplication as BaseApplication
+ return myApplication as BaseApplication
}
+
}
-
-
- fun init() {
- if (projectDataDao!=null){
- val projectDataBean = projectDataDao?.findFirst()
- if (projectDataBean!=null){
- Tag = projectDataBean.projectTag
- }
- }
+ fun init() {
+ projectDataDao = application?.let { BaseDaoSingleton.getInstance(it)?.projectDataDao() }
+ if (projectDataDao != null) {
+ val projectDataBean = projectDataDao?.findFirst()
+ if (projectDataBean != null) {
+ tag = projectDataBean.projectTag
+ }
+ }
}
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/LoginActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/LoginActivity.kt
index 762fc90..4839223 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/LoginActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/LoginActivity.kt
@@ -1,8 +1,12 @@
package com.dayu.general.activity
+import android.app.Activity
import android.content.Context
+import android.content.Intent
import com.dayu.baselibrary.net.subscribers.SubscriberListener
import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.general.BaseApplication
+import com.dayu.general.bean.net.LoginResult
import com.dayu.general.bean.net.SearchUserResult
import com.dayu.general.net.ApiManager
import com.dayu.general.net.BaseResponse
@@ -16,7 +20,7 @@
companion object {
@JvmStatic
- fun login(phone: String, password: String, myContext: Context) {
+ fun login(phone: String, password: String, myContext: Activity) {
val map = mutableMapOf<String, Any>()
if (phone.isNotEmpty()) {
@@ -27,18 +31,21 @@
map["password"] = password
}
- map["orgTag"] = "ym"
+ map["orgTag"] = BaseApplication.tag
// 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
ApiManager.getInstance().requestPostLoading(
myContext,
"sso/sso/loginJson",
- SearchUserResult::class.java,
+ LoginResult::class.java,
map,
- object : SubscriberListener<BaseResponse<SearchUserResult>>() {
- override fun onNext(t: BaseResponse<SearchUserResult>) {
+ object : SubscriberListener<BaseResponse<LoginResult>>() {
+ override fun onNext(t: BaseResponse<LoginResult>) {
if (t.success) {
-
+ BaseApplication.token = t.content?.token ?: ""
+ BaseApplication.userId = t.content?.id ?: ""
+ val intent = Intent(myContext, MainActivity::class.java)
+ myContext.startActivity(intent)
} else {
// 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
ToastUtil.show(t.msg)
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
index 0f8a324..e589145 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MainActivity.kt
@@ -4,9 +4,16 @@
import android.view.LayoutInflater
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
+import com.dayu.baselibrary.net.subscribers.SubscriberListener
+import com.dayu.baselibrary.utils.ToastUtil
+import com.dayu.general.BaseApplication
import com.dayu.general.R
import com.dayu.general.adapter.TabAdapter
+import com.dayu.general.bean.net.LoginResult
+import com.dayu.general.bean.net.UserInfoResult
import com.dayu.general.databinding.ActivityMainBinding
+import com.dayu.general.net.ApiManager
+import com.dayu.general.net.BaseResponse
class MainActivity : BaseActivity() {
@@ -19,8 +26,35 @@
setupFragments()
initView()
initTab()
+ getUserInfo();
+ }
+ private fun getUserInfo() {
+ // 浣跨敤姝g‘鐨勭被鍨嬪弬鏁�
+ ApiManager.getInstance().requestGetLoading(
+ this,
+ "base/user/getUserInfos/" + BaseApplication.userId,
+ UserInfoResult::class.java,
+ null,
+ object : SubscriberListener<BaseResponse<UserInfoResult>>() {
+ override fun onNext(t: BaseResponse<UserInfoResult>) {
+ if (t.success) {
+ BaseApplication.userName = t.content?.userName ?: ""
+ BaseApplication.userPhone = t.content?.phone ?: ""
+ BaseApplication.blockName = t.content?.blockName ?: ""
+ } else {
+ // 澶勭悊鎼滅储澶辫触鐨勬儏鍐�
+ ToastUtil.show(t.msg)
+ }
+ }
+
+ override fun onError(e: Throwable?) {
+ super.onError(e)
+ ToastUtil.show("鎼滅储澶辫触: ${e?.message ?: "鏈煡閿欒"}")
+ }
+ }
+ )
}
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt
index e612834..956bdc4 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/ManageListActivity.kt
@@ -1,6 +1,7 @@
package com.dayu.general.activity
import android.os.Bundle
+import com.dayu.baselibrary.view.TitleBar.ClickType_LEFT_IMAGE
import com.dayu.general.databinding.ActivityManageListGeBinding
class ManageListActivity : BaseActivity() {
@@ -10,6 +11,11 @@
super.onCreate(savedInstanceState)
binding = ActivityManageListGeBinding.inflate(layoutInflater)
setContentView(binding?.root)
+ initView()
+ }
+
+ fun initView() {
+ binding?.titleBar?.setOnItemclickListner(ClickType_LEFT_IMAGE) { this.finish() }
}
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
index cafd478..fb43396 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/MyFragment.kt
@@ -1,10 +1,12 @@
package com.dayu.general.activity
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
+import com.dayu.general.BaseApplication
import com.dayu.general.databinding.FragmentMyBinding
class MyFragment : Fragment() {
@@ -17,4 +19,39 @@
binding = FragmentMyBinding.inflate(inflater, container, false)
return binding?.root
}
+
+ override fun onResume() {
+ super.onResume()
+ if (BaseApplication.userName.isNotEmpty()) {
+ binding?.myName?.text = BaseApplication.userName
+ } else {
+ binding?.myName?.text = "鏈櫥褰�"
+ }
+ if (BaseApplication.userPhone.isNotEmpty()) {
+ binding?.myPhone?.text = BaseApplication.userPhone
+ } else {
+ binding?.myPhone?.text = "鏈櫥褰�"
+ }
+ if (BaseApplication.blockName.isNotEmpty()) {
+ binding?.myAdName?.text = BaseApplication.blockName
+ } else {
+ binding?.myAdName?.text = "鏈櫥褰�"
+ }
+ }
+
+ fun logout() {
+ BaseApplication.userId = ""
+ BaseApplication.userName = ""
+ BaseApplication.userPhone = ""
+ BaseApplication.blockId = ""
+ BaseApplication.blockName = ""
+ binding?.myName?.text = "鏈櫥褰�"
+ binding?.myPhone?.text = "鏈櫥褰�"
+ binding?.myAdName?.text = "鏈櫥褰�"
+ var intent= Intent(activity,LoginActivity::class.java)
+ startActivity(intent)
+ activity?.finish()
+ }
+
+
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
index 202d43b..45d5bba 100644
--- a/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
+++ b/generallibrary/src/main/java/com/dayu/general/activity/NfcWreatActivity.kt
@@ -2,7 +2,7 @@
import android.content.Intent
import android.os.Bundle
-import com.dayu.general.bean.card.CardCommon
+import com.dayu.general.tool.CardCommon
import com.dayu.general.databinding.ActivityNfcWriteGeBinding
/**
@@ -40,9 +40,11 @@
}
override fun onNfcBack(intent: Intent?) {
TODO("Not yet implemented")
+ when(cardType){
+ CardCommon.CHECK_CARD->{
+ binding?.cardData?.text = "鍐欑敤鎴峰崱"
+ }
-
-
-
+ }
}
}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
index 4684ee3..6d3cfd3 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/AreaCard.kt
@@ -2,6 +2,7 @@
import com.dayu.baselibrary.tools.BcdUtil
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon
import java.io.Serializable
/**
@@ -10,11 +11,7 @@
*/
class AreaCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B0" // 鍗$被鍨嬪浐瀹氫负0xB0
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE = CardCommon.REGION_CARD // 鍗$被鍨嬪浐瀹氫负0xB0
}
var areaNumber: Int = 0 // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt
index 7e17509..7a8f09f 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/BaseCard.kt
@@ -1,14 +1,23 @@
package com.dayu.general.bean.card
-import com.dayu.baselibrary.dao.AppDatabase
import com.dayu.baselibrary.tools.HexUtil
import com.dayu.general.bean.db.CardData
import com.dayu.general.dao.AppDataBase
+import com.dayu.general.tool.CardCommon
import com.tencent.bugly.crashreport.CrashReport
open class BaseCard {
var cardData: String? = null //鏍囪瘑鐮�
+ companion object {
+
+ const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
+ const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
+ const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
+ const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ }
+
+
fun setCardData(baseDao: AppDataBase, cardType: String?) {
try {
val cardDataBean: CardData =
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt
index 728dba8..5295ff4 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/CheckCard.kt
@@ -1,6 +1,8 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.BaseCommon
+import com.dayu.general.tool.CardCommon
import java.io.Serializable
/**
@@ -9,11 +11,7 @@
*/
class CheckCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B3" // 鍗$被鍨嬶細妫�鏌ュ崱
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE = CardCommon.CHECK_CARD // 鍗$被鍨嬶細妫�鏌ュ崱
}
/**
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt
index 938e8f2..52ebe3a 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/ClearCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon
import java.io.Serializable
/**
@@ -9,11 +10,7 @@
*/
class ClearCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "C1" // 鍗$被鍨嬶細娓呴浂鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE = CardCommon.CLEAN_CARD_TYPE // 鍗$被鍨嬶細娓呴浂鍗�
}
/**
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt
index 845125c..84a419e 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/DebugCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon
import java.io.Serializable
/**
@@ -12,12 +13,7 @@
*/
class DebugCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B4" // 鍗$被鍨嬶細璋冭瘯鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
-
+ const val CARD_TYPE = CardCommon.DEBUG_CARD // 鍗$被鍨嬶細璋冭瘯鍗�
const val AUTO_CLOSE_TIMEOUT = 60_000L // 鑷姩鍏抽棴瓒呮椂鏃堕棿锛�1鍒嗛挓锛�
}
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt
index c337761..035ec3d 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/DomainSettingCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon
import java.io.Serializable
/**
@@ -9,12 +10,9 @@
*/
class DomainSettingCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B6" // 鍗$被鍨嬶細鍩熷悕璁剧疆鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
-
+ const val CARD_TYPE = CardCommon.AREA_CARD // 鍗$被鍨嬶細鍩熷悕璁剧疆鍗�
+
+
const val MAX_DOMAIN_ROUTE = 4 // 鏈�澶у煙鍚嶈矾鏁�
const val MAX_DOMAIN_LENGTH = 38 // 鏈�澶у煙鍚嶉暱搴�
}
@@ -31,8 +29,8 @@
return false
}
return data[0].contentEquals(getZeroBytes()) &&
- data[1].contentEquals(getOneBytes()) &&
- data[2].contentEquals(getTwoBytes())
+ data[1].contentEquals(getOneBytes()) &&
+ data[2].contentEquals(getTwoBytes())
}
/**
@@ -41,30 +39,31 @@
fun getBean(data: List<ByteArray>): DomainSettingCard? {
try {
val domainSettingCard = DomainSettingCard()
-
+
// 瑙f瀽绗�0鍧�
val zero = data[0]
-
+
// 楠岃瘉鍗$被鍨�(8浣�)
if (HexUtil.byteToHex(zero[8]) != CARD_TYPE) {
return null
}
-
+
// 楠岃瘉璇嗗埆鐮�(9-12浣�)
if (zero[9] != IDENTIFY_CODE_A0 ||
zero[10] != IDENTIFY_CODE_B1 ||
zero[11] != IDENTIFY_CODE_C2 ||
- zero[12] != IDENTIFY_CODE_89) {
+ zero[12] != IDENTIFY_CODE_89
+ ) {
return null
}
-
+
// 瑙f瀽鍩熷悕璺暟(13浣�)
val routeNumber = zero[13].toInt()
if (routeNumber !in 1..MAX_DOMAIN_ROUTE) {
return null
}
domainSettingCard.domainRouteNumber = routeNumber
-
+
// 瑙f瀽鍩熷悕闀垮害(14浣�)
domainSettingCard.domainLength = zero[14].toInt()
@@ -116,22 +115,22 @@
for (i in domain.length.coerceAtMost(8) until 8) {
data[i] = 0
}
-
+
// 璁剧疆鍗$被鍨�(8浣�)
data[8] = HexUtil.hexToByte(CARD_TYPE)
-
+
// 璁剧疆璇嗗埆鐮�(9-12浣�)
data[9] = IDENTIFY_CODE_A0
data[10] = IDENTIFY_CODE_B1
data[11] = IDENTIFY_CODE_C2
data[12] = IDENTIFY_CODE_89
-
+
// 璁剧疆鍩熷悕璺暟(13浣�)
data[13] = domainRouteNumber.toByte()
-
+
// 璁剧疆鍩熷悕闀垮害(14浣�)
data[14] = domain.length.toByte()
-
+
// 璁剧疆鏍¢獙鍜�(15浣�)
data[15] = getByteSum(data)
} catch (e: Exception) {
@@ -156,7 +155,7 @@
for (i in (domain.length - 8).coerceAtMost(15) until 15) {
data[i] = 0
}
-
+
// 璁剧疆鏍¢獙鍜�(15浣�)
data[15] = getByteSum(data)
} catch (e: Exception) {
@@ -181,7 +180,7 @@
for (i in (domain.length - 23).coerceAtMost(15) until 15) {
data[i] = 0
}
-
+
// 璁剧疆鏍¢獙鍜�(15浣�)
data[15] = getByteSum(data)
} catch (e: Exception) {
@@ -195,9 +194,9 @@
* 楠岃瘉鍩熷悕鏍煎紡鏄惁姝g‘
*/
fun isValidDomain(): Boolean {
- return domain.isNotEmpty() &&
- domain.length <= MAX_DOMAIN_LENGTH &&
- domain.matches(Regex("^[a-zA-Z0-9.-]+$"))
+ return domain.isNotEmpty() &&
+ domain.length <= MAX_DOMAIN_LENGTH &&
+ domain.matches(Regex("^[a-zA-Z0-9.-]+$"))
}
/**
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt
index 3d5d658..77aeb50 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/FetchDataCard.kt
@@ -2,6 +2,8 @@
import com.dayu.baselibrary.tools.BcdUtil
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon.Companion.ELECTRIC_PRICE_CARD
+import com.dayu.general.tool.CardCommon.Companion.MANAGE_CRAD
import java.io.Serializable
/**
@@ -10,12 +12,9 @@
*/
class FetchDataCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE_NEED_FETCH = "B1" // 闇�瑕佸埛鍗″彇鏁�
- const val CARD_TYPE_FETCH_SUCCESS = "B2" // 鍒峰崱鍙栨暟杩斿啓鎴愬姛
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE_NEED_FETCH = ELECTRIC_PRICE_CARD // 闇�瑕佸埛鍗″彇鏁�
+ const val CARD_TYPE_FETCH_SUCCESS = MANAGE_CRAD // 鍒峰崱鍙栨暟杩斿啓鎴愬姛
+
}
var areaNumber: Int = 0 // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt
index cb6edbf..34a54c3 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/GpsCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon.Companion.GPS_CARD
import java.io.Serializable
/**
@@ -9,11 +10,8 @@
*/
class GpsCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B7" // 鍗$被鍨嬶細GPS瀹氫綅鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE =GPS_CARD // 鍗$被鍨嬶細GPS瀹氫綅鍗�
+
}
/**
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt
index 7d52309..36c6a37 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/IpSettingCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon.Companion.IP_CARD
import java.io.Serializable
/**
@@ -9,11 +10,7 @@
*/
class IpSettingCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B5" // 鍗$被鍨嬶細IP璁剧疆鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE = IP_CARD // 鍗$被鍨嬶細IP璁剧疆鍗�
const val MAX_IP_ROUTE = 4 // 鏈�澶P璺暟
}
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
index 7aa0eed..243f3ea 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/UserCard.kt
@@ -3,6 +3,7 @@
import com.dayu.baselibrary.bean.BaseUserCardCard
import com.dayu.baselibrary.tools.BcdUtil
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon.Companion.USER_CARD_TYPE_1
import java.io.Serializable
import java.util.*
@@ -10,7 +11,7 @@
* 閫氱敤椤圭洰鐢ㄦ埛鍗$粨鏋�
*/
class UserCard : BaseCard(), Serializable {
- var cardType: String = "A1" // 鍗$被鍨嬶細A1缁堢鍐欏崱 A8鍒峰崱寮�娉靛悗鍊� A2鍙犲姞鍏呭��
+ var cardType: String = USER_CARD_TYPE_1 // 鍗$被鍨嬶細A1缁堢鍐欏崱 A8鍒峰崱寮�娉靛悗鍊� A2鍙犲姞鍏呭��
var areaNumber: Int = 0 // 鍥藉琛屾斂鍖哄煙鍙�(12浣岯CD,绮剧‘鍒版潙)
var userCode: String = "" // 鐢ㄦ埛缂栧彿BCD
var userCodeNumber: Int = 0 // 鐢ㄦ埛鍗$紪鍙�(HEX)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt b/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt
index a54298a..6ba51d4 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt
+++ b/generallibrary/src/main/java/com/dayu/general/bean/card/ValveTimeCard.kt
@@ -1,6 +1,7 @@
package com.dayu.general.bean.card
import com.dayu.baselibrary.tools.HexUtil
+import com.dayu.general.tool.CardCommon.Companion.VALVE_TIME_CARD
import java.io.Serializable
/**
@@ -9,11 +10,7 @@
*/
class ValveTimeCard : BaseCard(), Serializable {
companion object {
- const val CARD_TYPE = "B8" // 鍗$被鍨嬶細閰嶇疆寮�鍏抽榾鏃堕棿鍗�
- const val IDENTIFY_CODE_A0 = 0xA0.toByte() // 璇嗗埆鐮丄0
- const val IDENTIFY_CODE_B1 = 0xB1.toByte() // 璇嗗埆鐮丅1
- const val IDENTIFY_CODE_C2 = 0xC2.toByte() // 璇嗗埆鐮丆2
- const val IDENTIFY_CODE_89 = 0x89.toByte() // 璇嗗埆鐮�89
+ const val CARD_TYPE = VALVE_TIME_CARD // 鍗$被鍨嬶細閰嶇疆寮�鍏抽榾鏃堕棿鍗�
}
var valveTime: Int = 0 // 寮�鍏抽榾鏃堕棿(绉�)
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/LoginResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/LoginResult.kt
new file mode 100644
index 0000000..373e3ae
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/LoginResult.kt
@@ -0,0 +1,9 @@
+package com.dayu.general.bean.net
+
+class LoginResult(
+ var id: String,
+ var name: String,
+ var phone: String,
+ var token: String
+) {
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/net/UserInfoResult.kt b/generallibrary/src/main/java/com/dayu/general/bean/net/UserInfoResult.kt
new file mode 100644
index 0000000..04a2653
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/bean/net/UserInfoResult.kt
@@ -0,0 +1,26 @@
+package com.dayu.general.bean.net
+
+// 鐢ㄦ埛淇℃伅缁撴灉绫�
+class UserInfoResult(
+ // 鍖哄潡ID
+ var blockId: String,
+ // 鍖哄潡鍚嶇О
+ var blockName: String,
+ // 鐢ㄦ埛ID
+ var id: String,
+ // 鏉冮檺鍒楄〃
+ var permissions: List<String>,
+ // 鎵嬫満鍙�
+ var phone: String,
+ // 瑙掕壊ID鍒楄〃
+ var roleIds: List<String>,
+ // 瑙掕壊鍚嶇О鍒楄〃
+ var roleNames: List<String>,
+ // 鐘舵�両D
+ var stateId: String?,
+ // 鐘舵�佸悕绉�
+ var stateName: String,
+ // 鐢ㄦ埛鍚嶇О
+ var userName: String=""
+) {
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
index 45b77ff..b76c767 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/AppDataBase.kt
@@ -4,8 +4,9 @@
import androidx.room.RoomDatabase
import com.dayu.general.bean.db.CardData
import com.dayu.general.bean.db.PassWordCardBean
+import com.dayu.general.bean.db.ProjectDataBean
-@Database(entities = [PassWordCardBean::class, CardData::class], version = 1, exportSchema = false)
+@Database(entities = [PassWordCardBean::class, CardData::class, ProjectDataBean::class], version = 1, exportSchema = false)
abstract class AppDataBase : RoomDatabase() {
abstract fun cardDataDao(): CardDataDao
abstract fun projectDataDao(): ProjectDataDao
diff --git a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
index 1b4f9f8..1bcc754 100644
--- a/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
+++ b/generallibrary/src/main/java/com/dayu/general/dao/BaseDaoSingleton.kt
@@ -13,27 +13,20 @@
@JvmField
val SqlitePath: String =
Environment.getExternalStorageDirectory().absolutePath + File.separator + ".dayu" + File.separator + "data" + File.separator
- @JvmStatic
- fun getInstance(context: Context?): AppDataBase? {
+ fun getInstance(context: Context): AppDataBase {
if (baseDao == null) {
baseDao = Room.databaseBuilder<AppDataBase>(
- context!!,
+ context,
AppDataBase::class.java,
SqlitePath + "ConfigurationData_generalV1"
).allowMainThreadQueries().build()
}
- return baseDao
+ return baseDao as AppDataBase
}
}
-
-
var AsynchBaseDao: AppDataBase? = null
-
-
-
-
fun getAsynchInstance(context: Context?): AppDataBase? {
if (AsynchBaseDao == null) {
diff --git a/generallibrary/src/main/java/com/dayu/general/model/CardInfoModel.kt b/generallibrary/src/main/java/com/dayu/general/model/CardInfoModel.kt
new file mode 100644
index 0000000..8a0afb2
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/model/CardInfoModel.kt
@@ -0,0 +1,22 @@
+package com.dayu.general.model
+
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+
+class CardInfoModel : ViewModel() {
+ val cardNumber = MutableLiveData<String>()
+ val remark = MutableLiveData<String>()
+
+ init {
+ cardNumber.value = ""
+ remark.value = ""
+ }
+
+ fun setCardNumber(number: String) {
+ cardNumber.value = number
+ }
+
+ fun setRemark(remarkText: String) {
+ remark.value = remarkText
+ }
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
index 0667e86..ded47e8 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/ApiManager.kt
@@ -136,6 +136,7 @@
val response = BaseResponse<T>().apply {
code = temp.code
msg = temp.msg ?: ""
+ success = temp.success
}
// 澶勭悊token澶辨晥鐨勬儏鍐�
diff --git a/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt b/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
index 2d8c710..1c506e3 100644
--- a/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
+++ b/generallibrary/src/main/java/com/dayu/general/net/MyIntercepterApplication.kt
@@ -1,5 +1,6 @@
package com.dayu.general.net
+import com.dayu.general.BaseApplication
import com.tencent.bugly.crashreport.CrashReport
import okhttp3.Interceptor
import okhttp3.Protocol
@@ -48,6 +49,8 @@
} else {
}
+ builder.addHeader("tag", BaseApplication.tag)
+ builder.addHeader("token", BaseApplication.token)
return builder.build()
} catch (e: Exception) {
e.printStackTrace()
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/BaseCommon.kt b/generallibrary/src/main/java/com/dayu/general/tool/BaseCommon.kt
index 63d07b4..f4a4337 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/BaseCommon.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/BaseCommon.kt
@@ -9,6 +9,10 @@
companion object{
val YuanMo: Int = 1
val QiHe: Int = 2
+
+
+
+
}
diff --git a/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt b/generallibrary/src/main/java/com/dayu/general/tool/CardCommon.kt
similarity index 98%
rename from generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
rename to generallibrary/src/main/java/com/dayu/general/tool/CardCommon.kt
index 9031af7..e481610 100644
--- a/generallibrary/src/main/java/com/dayu/general/bean/card/CardCommon.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/CardCommon.kt
@@ -1,4 +1,4 @@
-package com.dayu.general.bean.card
+package com.dayu.general.tool
class CardCommon {
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
index c3e0916..1a80899 100644
--- a/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
+++ b/generallibrary/src/main/java/com/dayu/general/tool/GeBaseHelper.kt
@@ -8,7 +8,7 @@
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
-class GeBaseHelper(private val context: Context) : BaseNFCHelper() {
+open class GeBaseHelper(private val context: Context) : BaseNFCHelper() {
companion object {
diff --git a/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
new file mode 100644
index 0000000..7f2d7ab
--- /dev/null
+++ b/generallibrary/src/main/java/com/dayu/general/tool/NfcReadHelper.kt
@@ -0,0 +1,91 @@
+package com.dayu.general.tool
+
+import android.app.Activity
+import android.content.Intent
+import com.dayu.baselibrary.tools.nfc.BaseNfcReadHelper
+import com.dayu.baselibrary.tools.nfc.NfcReadAdapter
+
+/**
+ * NFC璇诲彇宸ュ叿绫荤殑Kotlin瀹炵幇
+ */
+class NfcReadHelper private constructor(intent: Intent, activity: Activity) : GeBaseHelper(activity) {
+
+ private val adapter: NfcReadAdapter = NfcReadAdapter(intent, activity)
+
+ companion object {
+ private var helper: NfcReadHelper? = null
+
+ /**
+ * 鍗曚緥鍒濆鍖�
+ */
+ @JvmStatic
+ fun getInstance(intent: Intent, activity: Activity): NfcReadHelper {
+ if (helper == null) {
+ helper = NfcReadHelper(intent, activity)
+ }
+ return helper!!
+ }
+ }
+
+
+
+ /**
+ * 鑾峰彇鍗″彿
+ */
+ fun getCardNumber(): String {
+ return try {
+ adapter.cardNumber
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ }
+
+ /**
+ * 鑾峰彇鍗$墖绫诲瀷鍜屽崱鍙�
+ */
+ fun getCardTypeAndCardNumber(): String {
+ return try {
+ adapter.cradTypeAndCardNumber
+ } catch (e: Exception) {
+ e.printStackTrace()
+ ""
+ }
+ }
+
+ /**
+ * 璇诲彇NFC鍗$殑鍏ㄩ儴淇℃伅
+ */
+ fun getAllData(callback: BaseNfcReadHelper.NFCCallMapback) {
+ try {
+ adapter.getAllData(callback)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+ /**
+ * 鑾峰彇涓�涓墖鍖虹殑鏁版嵁
+ */
+ fun getOneSectorData(): List<ByteArray>? {
+ return try {
+ adapter.onesectorData
+ } catch (e: Exception) {
+ e.printStackTrace()
+ null
+ }
+ }
+
+ /**
+ * 璇诲彇NFC鍗$殑鐗瑰畾鎵囧尯淇℃伅
+ */
+ fun getData(a: Int, b: Int, callback: BaseNfcReadHelper.NFCCallByteback) {
+ try {
+ adapter.getData(a, b, callback)
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+
+
+}
\ No newline at end of file
diff --git a/generallibrary/src/main/java/com/dayu/general/view/ProjectDialog.kt b/generallibrary/src/main/java/com/dayu/general/view/ProjectDialog.kt
index 557e677..e3fe009 100644
--- a/generallibrary/src/main/java/com/dayu/general/view/ProjectDialog.kt
+++ b/generallibrary/src/main/java/com/dayu/general/view/ProjectDialog.kt
@@ -1,5 +1,6 @@
package com.dayu.general.view
+import android.app.Application
import android.app.Dialog
import android.content.Context
import android.os.Bundle
@@ -8,6 +9,8 @@
import android.widget.RadioGroup
import android.widget.TextView
import com.dayu.baselibrary.view.ConfirmDialog
+import com.dayu.general.BaseApplication
+import com.dayu.general.BaseApplication.Companion.application
import com.dayu.general.R
import com.dayu.general.bean.db.ProjectDataBean
import com.dayu.general.dao.BaseDaoSingleton
@@ -18,12 +21,12 @@
* Author: zuo
* Date: 2025/3/17
*/
-class ProjectDialog(context: Context):Dialog(context,com.dayu.baselibrary.R.style.ws_pay_showSelfDialog){
+class ProjectDialog(private val mContext: Context,private val myApplication: Application):Dialog(mContext,com.dayu.baselibrary.R.style.ws_pay_showSelfDialog){
var confirmDialog: ConfirmDialog? = null
var mLibraryBack: LibraryBack? = null
var isChose: Boolean = false
- var projectDataDao = BaseDaoSingleton.getInstance(context)?.projectDataDao()
+ var projectDataDao = BaseDaoSingleton.getInstance(mContext)?.projectDataDao()
var projectBean: ProjectDataBean = ProjectDataBean()
var type: Int = 0
var data: String = ""
@@ -48,12 +51,14 @@
R.id.yuanMouLibrary -> {
type = BaseCommon.YuanMo
projectBean.projectType = type
- data = "纭閫夋嫨娌冲崡鐗堟湰鍚楋紵"
+ projectBean.projectTag="ym"
+ data = "纭閫夋嫨鍏冭皨椤圭洰鍚楋紵"
}
R.id.qiHeLibrary -> {
type = BaseCommon.QiHe
projectBean.projectType = type
- data = "纭閫夋嫨榻愭渤鍗曟満鐗堟湰鍚楋紵"
+ projectBean.projectTag="qh"
+ data = "纭閫夋嫨榻愭渤椤圭洰鍚楋紵"
}
}
@@ -63,8 +68,9 @@
okBtn.setOnClickListener {
if (isChose) {
// 浜屾纭
- confirmDialog = ConfirmDialog(context, data) {
+ confirmDialog = ConfirmDialog(mContext, data) {
projectDataDao?.insert(projectBean)
+ BaseApplication.getInstance(myApplication).init()
mLibraryBack?.listener(type)
dismiss()
confirmDialog?.dismiss()
diff --git a/generallibrary/src/main/res/layout/activity_manage_list_ge.xml b/generallibrary/src/main/res/layout/activity_manage_list_ge.xml
index ca29cf0..d8ab4b4 100644
--- a/generallibrary/src/main/res/layout/activity_manage_list_ge.xml
+++ b/generallibrary/src/main/res/layout/activity_manage_list_ge.xml
@@ -76,7 +76,7 @@
android:id="@+id/tv_clean_card"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="娓呯悊鍗�"
+ android:text="娓呴浂鍗�"
android:textSize="16sp"
android:textColor="#333333"
android:padding="16dp"
diff --git a/generallibrary/src/main/res/layout/activity_manager_read.xml b/generallibrary/src/main/res/layout/activity_manager_read.xml
new file mode 100644
index 0000000..19ef124
--- /dev/null
+++ b/generallibrary/src/main/res/layout/activity_manager_read.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ xmlns:app="http://schemas.android.com/apk/res-auto">
+
+ <data>
+ <variable
+ name="viewModel"
+ type="com.dayu.general.model.CardInfoModel" />
+ </data>
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <com.dayu.baselibrary.view.TitleBar
+ android:id="@+id/titleBar"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/dimen_title_height"
+ android:background="@color/title_bar_bg"
+ android:elevation="4dp"
+ app:centerText="鍒朵綔绠$悊鍗�"
+ tools:ignore="MissingConstraints" />
+
+ <LinearLayout
+ android:id="@+id/data_layout"
+ android:layout_width="match_parent"
+ android:layout_below="@+id/titleBar"
+ android:orientation="vertical"
+ android:layout_height="wrap_content">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:orientation="vertical"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="鍗″彿锛�"
+ android:textColor="#333333"
+ android:textSize="16sp"/>
+
+ <TextView
+ android:id="@+id/card_number_tv"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="#333333"
+ android:textSize="16sp"
+ android:text="@{viewModel.cardNumber}"/>
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="澶囨敞锛�"
+ android:textColor="#333333"
+ android:textSize="16sp"/>
+
+ <EditText
+ android:id="@+id/remark_et"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:background="@null"
+ android:hint="璇疯緭鍏ュ娉ㄤ俊鎭�"
+ android:textSize="16sp"
+ android:text="@={viewModel.remark}"/>
+ </LinearLayout>
+
+ </LinearLayout>
+
+ </LinearLayout>
+
+ <LinearLayout
+ android:id="@+id/recharge_read_LL"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@+id/data_layout"
+ android:orientation="vertical"
+ android:visibility="visible">
+
+ <androidx.cardview.widget.CardView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ app:cardCornerRadius="8dp"
+ app:cardElevation="2dp">
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="16dp"
+ android:gravity="center"
+ android:text="璇峰皢鍗¤创鍦ㄨ澶囦笂杩涜璇诲崱"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size"
+ android:textStyle="bold" />
+
+ <ImageView
+ android:layout_width="200dp"
+ android:layout_height="200dp"
+ android:layout_gravity="center"
+ android:scaleType="fitCenter"
+ android:src="@mipmap/nfc_write" />
+ </LinearLayout>
+ </androidx.cardview.widget.CardView>
+ </LinearLayout>
+ </RelativeLayout>
+</layout>
\ No newline at end of file
diff --git a/generallibrary/src/main/res/layout/fragment_my.xml b/generallibrary/src/main/res/layout/fragment_my.xml
index 014772c..1494651 100644
--- a/generallibrary/src/main/res/layout/fragment_my.xml
+++ b/generallibrary/src/main/res/layout/fragment_my.xml
@@ -3,8 +3,8 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:background="#F5F5F5">
+ android:background="#F5F5F5"
+ android:orientation="vertical">
<com.dayu.baselibrary.view.TitleBar
android:id="@+id/titleBar"
@@ -42,33 +42,73 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="12dp"
android:text="鍩烘湰淇℃伅"
android:textColor="#333333"
android:textSize="16sp"
- android:textStyle="bold"
- android:layout_marginBottom="12dp"/>
+ android:textStyle="bold" />
<LinearLayout
android:id="@+id/my_village"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp"
android:orientation="horizontal"
- android:visibility="gone"
- android:layout_marginBottom="8dp">
+ android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="璁惧缂栧彿锛�"
- android:textSize="@dimen/text_size"
- android:textColor="#666666" />
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
<TextView
android:id="@+id/my_villageNum"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:textSize="@dimen/text_size"
- android:textColor="#333333" />
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="鐢ㄦ埛鍚嶇О锛�"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/my_name"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginBottom="8dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="鎵嬫満鍙凤細"
+ android:textColor="#666666"
+ android:textSize="@dimen/text_size" />
+
+ <TextView
+ android:id="@+id/my_phone"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:textColor="#333333"
+ android:textSize="@dimen/text_size" />
</LinearLayout>
<LinearLayout
@@ -96,7 +136,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:visibility="gone">
<TextView
android:layout_width="wrap_content"
@@ -117,7 +158,8 @@
android:id="@+id/my_waterPriceLL"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
+ android:orientation="horizontal"
+ android:visibility="gone">
<TextView
android:layout_width="wrap_content"
@@ -153,18 +195,18 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="12dp"
android:text="璁板綍绠$悊"
android:textColor="#333333"
android:textSize="16sp"
- android:textStyle="bold"
- android:layout_marginBottom="12dp"/>
+ android:textStyle="bold" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
- android:padding="8dp"
- android:background="#F9F9F9">
+ android:background="#F9F9F9"
+ android:padding="8dp">
<ImageView
android:id="@+id/card_icon"
@@ -180,8 +222,8 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
- android:layout_toEndOf="@+id/card_icon"
android:layout_toStartOf="@+id/my_newCardOut"
+ android:layout_toEndOf="@+id/card_icon"
android:text="寮�鍗¤褰�"
android:textColor="#333333"
android:textSize="@dimen/text_size" />
@@ -194,8 +236,8 @@
android:layout_centerVertical="true"
android:background="@drawable/rounded_button_bg"
android:paddingStart="12dp"
- android:paddingEnd="12dp"
android:paddingTop="4dp"
+ android:paddingEnd="12dp"
android:paddingBottom="4dp"
android:text="瀵煎嚭璁板綍"
android:textColor="@color/white"
@@ -205,8 +247,8 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:padding="8dp"
- android:background="#F9F9F9">
+ android:background="#F9F9F9"
+ android:padding="8dp">
<ImageView
android:id="@+id/recharge_icon"
@@ -222,8 +264,8 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="8dp"
- android:layout_toEndOf="@+id/recharge_icon"
android:layout_toStartOf="@+id/my_rechargeOut"
+ android:layout_toEndOf="@+id/recharge_icon"
android:text="鍏呭�艰褰�"
android:textColor="#333333"
android:textSize="@dimen/text_size" />
@@ -236,8 +278,8 @@
android:layout_centerVertical="true"
android:background="@drawable/rounded_button_bg"
android:paddingStart="12dp"
- android:paddingEnd="12dp"
android:paddingTop="4dp"
+ android:paddingEnd="12dp"
android:paddingBottom="4dp"
android:text="瀵煎嚭璁板綍"
android:textColor="@color/white"
@@ -262,11 +304,30 @@
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="12dp"
android:text="绯荤粺璁剧疆"
android:textColor="#333333"
android:textSize="16sp"
- android:textStyle="bold"
- android:layout_marginBottom="12dp"/>
+ android:textStyle="bold" />
+
+ <RelativeLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:layout_marginBottom="8dp">
+
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="閫�鍑虹櫥褰�"
+ android:textColor="#000000"
+ android:textSize="@dimen/text_size" />
+ <ImageView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_alignParentEnd="true"
+ android:src="@drawable/ic_arrow_right"/>
+ </RelativeLayout>
<TextView
android:id="@+id/sys_ip"
@@ -274,10 +335,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:background="#F9F9F9"
- android:padding="12dp"
android:drawableStart="@android:drawable/ic_menu_manage"
android:drawablePadding="8dp"
android:drawableTint="#666666"
+ android:padding="12dp"
android:text="IP璁剧疆"
android:textColor="#333333"
android:textSize="@dimen/text_size"
@@ -289,10 +350,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:background="#F9F9F9"
- android:padding="12dp"
android:drawableStart="@android:drawable/ic_menu_edit"
android:drawablePadding="8dp"
android:drawableTint="#666666"
+ android:padding="12dp"
android:text="鐢ㄦ埛琛ュ崱"
android:textColor="#333333"
android:textSize="@dimen/text_size"
@@ -304,10 +365,10 @@
android:layout_height="wrap_content"
android:layout_marginBottom="12dp"
android:background="#F9F9F9"
- android:padding="12dp"
android:drawableStart="@android:drawable/ic_lock_lock"
android:drawablePadding="8dp"
android:drawableTint="#666666"
+ android:padding="12dp"
android:text="鐧诲綍瀵嗙爜璁剧疆"
android:textColor="#333333"
android:textSize="@dimen/text_size"
@@ -318,10 +379,10 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#F9F9F9"
- android:padding="12dp"
android:drawableStart="@android:drawable/ic_menu_compass"
android:drawablePadding="8dp"
android:drawableTint="#666666"
+ android:padding="12dp"
android:text="鏈繛鎺ユ暟鎹腑蹇�"
android:textColor="#333333"
android:textSize="@dimen/text_size"
diff --git a/gradlew b/gradlew
index 1aa94a4..f5feea6 100644
--- a/gradlew
+++ b/gradlew
@@ -15,6 +15,8 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
+# SPDX-License-Identifier: Apache-2.0
+#
##############################################################################
#
@@ -55,7 +57,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -84,7 +86,8 @@
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
diff --git a/gradlew.bat b/gradlew.bat
index 93e3f59..9d21a21 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -13,6 +13,8 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@@ -43,11 +45,11 @@
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
@@ -57,11 +59,11 @@
if exist "%JAVA_EXE%" goto execute
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
goto fail
diff --git a/henanlibrary/build.gradle b/henanlibrary/build.gradle
index 08882f7..ed2e623 100644
--- a/henanlibrary/build.gradle
+++ b/henanlibrary/build.gradle
@@ -53,7 +53,7 @@
compileOnly group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
// compileOnly 'com.wang.avi:library:2.1.3'
- implementation files('../baselibrary/libs/avi.library-2.1.3.aar')
+
//鍦板潃閫夋嫨
compileOnly project(':pickerviewlibrary')
implementation project(':easysocket')
diff --git a/henanlibrary/proguard-rules.pro b/henanlibrary/proguard-rules.pro
index 8311792..9bfa667 100644
--- a/henanlibrary/proguard-rules.pro
+++ b/henanlibrary/proguard-rules.pro
@@ -150,4 +150,13 @@
-keep class com.dayu.henanlibrary.card.** {*;}
-keep class com.dayu.henanlibrary.dbBean.** {*;}
-keep class com.dayu.henanlibrary.net.** {*;}
--keep class com.dayu.henanlibrary.socketBean.** {*;}
\ No newline at end of file
+-keep class com.dayu.henanlibrary.socketBean.** {*;}
+
+# Room 鏁版嵁搴�
+-keep class * extends androidx.room.RoomDatabase
+-keep class * extends androidx.room.Entity
+-keep class * extends androidx.room.Dao
+-keep @androidx.room.Entity class *
+-keepclassmembers class * {
+ @androidx.room.* *;
+}
\ No newline at end of file
diff --git a/local.properties b/local.properties
index 60bc885..77023f6 100644
--- a/local.properties
+++ b/local.properties
@@ -4,5 +4,6 @@
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
-#Mon Aug 19 09:59:12 CST 2024
-sdk.dir=D\:\\android\\sdk
+#Wed Mar 19 16:09:32 CST 2025
+#sdk.dir=C\:\\Users\\User\\AppData\\Local\\Android\\Sdk
+sdk.dir=D\:\\android\\sdk
\ No newline at end of file
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/AVLoadingIndicatorView.java b/pickerviewlibrary/src/main/java/com/wang/avi/AVLoadingIndicatorView.java
new file mode 100644
index 0000000..2fc8357
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/AVLoadingIndicatorView.java
@@ -0,0 +1,419 @@
+package com.wang.avi;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Rect;
+import android.graphics.drawable.Animatable;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.Log;
+import android.view.View;
+import android.view.animation.AnimationUtils;
+
+import com.example.pickerviewlibrary.R;
+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(context, null,0,0);
+ }
+
+ public AVLoadingIndicatorView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(context, attrs,0, R.style.AVLoadingIndicatorView);
+ }
+
+ public AVLoadingIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, 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(context,attrs,defStyleAttr,R.style.AVLoadingIndicatorView);
+ }
+
+ 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();
+ }
+
+ 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;
+ }
+ }
+
+ @Override
+ protected boolean verifyDrawable(Drawable who) {
+ return who == mIndicator
+ || super.verifyDrawable(who);
+ }
+
+ 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 {
+ 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);
+ }
+ }
+
+ @Override
+ protected synchronized void onDraw(Canvas canvas) {
+ super.onDraw(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 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);
+ }
+
+ @Override
+ protected void drawableStateChanged() {
+ super.drawableStateChanged();
+ updateDrawableState();
+ }
+
+ 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 void removeCallbacks() {
+ removeCallbacks(mDelayedHide);
+ removeCallbacks(mDelayedShow);
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/Indicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/Indicator.java
new file mode 100644
index 0000000..dfac444
--- /dev/null
+++ b/pickerviewlibrary/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<ValueAnimator,ValueAnimator.AnimatorUpdateListener> mUpdateListeners=new HashMap<>();
+
+ private ArrayList<ValueAnimator> 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<ValueAnimator> 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java
new file mode 100644
index 0000000..a8a6e15
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallBeatIndicator.java
@@ -0,0 +1,81 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallBeatIndicator extends Indicator {
+
+ public static final float SCALE=1.0f;
+
+ public static final int ALPHA=255;
+
+ private float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE};
+
+ int[] alphas=new int[]{ALPHA,
+ ALPHA,
+ ALPHA,};
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(getWidth()-circleSpacing*2)/6;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ float y=getHeight() / 2;
+ for (int i = 0; i < 3; i++) {
+ canvas.save();
+ float translateX=x+(radius*2)*i+circleSpacing*i;
+ canvas.translate(translateX, y);
+ canvas.scale(scaleFloats[i], scaleFloats[i]);
+ paint.setAlpha(alphas[i]);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ int[] delays=new int[]{350,0,350};
+ for (int i = 0; i < 3; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.75f,1);
+ scaleAnim.setDuration(700);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255,51,255);
+ alphaAnim.setDuration(700);
+ alphaAnim.setRepeatCount(-1);
+ alphaAnim.setStartDelay(delays[i]);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphas[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java
new file mode 100644
index 0000000..5d65321
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateIndicator.java
@@ -0,0 +1,62 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class BallClipRotateIndicator extends Indicator {
+
+ float scaleFloat=1,degrees;
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(3);
+
+ float circleSpacing=12;
+ float x = (getWidth()) / 2;
+ float y=(getHeight()) / 2;
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat, scaleFloat);
+ canvas.rotate(degrees);
+ RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,0+x-circleSpacing,0+y-circleSpacing);
+ canvas.drawArc(rectF, -45, 270, false, paint);
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,0.5f,1);
+ scaleAnim.setDuration(750);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360);
+ rotateAnim.setDuration(750);
+ rotateAnim.setRepeatCount(-1);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java
new file mode 100644
index 0000000..2c59506
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotateMultipleIndicator.java
@@ -0,0 +1,83 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/17.
+ */
+public class BallClipRotateMultipleIndicator extends Indicator {
+
+ float scaleFloat=1,degrees;
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ paint.setStrokeWidth(3);
+ paint.setStyle(Paint.Style.STROKE);
+
+ float circleSpacing=12;
+ float x=getWidth()/2;
+ float y=getHeight()/2;
+
+ canvas.save();
+
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat, scaleFloat);
+ canvas.rotate(degrees);
+
+ //draw two big arc
+ float[] bStartAngles=new float[]{135,-45};
+ for (int i = 0; i < 2; i++) {
+ RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,x-circleSpacing,y-circleSpacing);
+ canvas.drawArc(rectF, bStartAngles[i], 90, false, paint);
+ }
+
+ canvas.restore();
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat, scaleFloat);
+ canvas.rotate(-degrees);
+ //draw two small arc
+ float[] sStartAngles=new float[]{225,45};
+ for (int i = 0; i < 2; i++) {
+ RectF rectF=new RectF(-x/1.8f+circleSpacing,-y/1.8f+circleSpacing,x/1.8f-circleSpacing,y/1.8f-circleSpacing);
+ canvas.drawArc(rectF, sStartAngles[i], 90, false, paint);
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.6f,1);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);
+ rotateAnim.setDuration(1000);
+ rotateAnim.setRepeatCount(-1);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java
new file mode 100644
index 0000000..3687ed3
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallClipRotatePulseIndicator.java
@@ -0,0 +1,92 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class BallClipRotatePulseIndicator extends Indicator {
+
+ float scaleFloat1,scaleFloat2,degrees;
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=12;
+ float x=getWidth()/2;
+ float y=getHeight()/2;
+
+ //draw fill circle
+ canvas.save();
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat1, scaleFloat1);
+ paint.setStyle(Paint.Style.FILL);
+ canvas.drawCircle(0, 0, x / 2.5f, paint);
+
+ canvas.restore();
+
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat2, scaleFloat2);
+ canvas.rotate(degrees);
+
+ paint.setStrokeWidth(3);
+ paint.setStyle(Paint.Style.STROKE);
+
+ //draw two arc
+ float[] startAngles=new float[]{225,45};
+ for (int i = 0; i < 2; i++) {
+ RectF rectF=new RectF(-x+circleSpacing,-y+circleSpacing,x-circleSpacing,y-circleSpacing);
+ canvas.drawArc(rectF, startAngles[i], 90, false, paint);
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat1 = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator scaleAnim2=ValueAnimator.ofFloat(1,0.6f,1);
+ scaleAnim2.setDuration(1000);
+ scaleAnim2.setRepeatCount(-1);
+ addUpdateListener(scaleAnim2,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat2 = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0, 180,360);
+ rotateAnim.setDuration(1000);
+ rotateAnim.setRepeatCount(-1);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ animators.add(scaleAnim);
+ animators.add(scaleAnim2);
+ animators.add(rotateAnim);
+ return animators;
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java
new file mode 100644
index 0000000..c115c6a
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridBeatIndicator.java
@@ -0,0 +1,76 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/20.
+ */
+public class BallGridBeatIndicator extends Indicator {
+
+ public static final int ALPHA=255;
+
+ int[] alphas=new int[]{ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA};
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(getWidth()-circleSpacing*4)/6;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ float y = getWidth()/ 2-(radius*2+circleSpacing);
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ canvas.save();
+ float translateX=x+(radius*2)*j+circleSpacing*j;
+ float translateY=y+(radius*2)*i+circleSpacing*i;
+ canvas.translate(translateX, translateY);
+ paint.setAlpha(alphas[3 * i + j]);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+ }
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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};
+
+ for (int i = 0; i < 9; i++) {
+ final int index=i;
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 168,255);
+ alphaAnim.setDuration(durations[i]);
+ alphaAnim.setRepeatCount(-1);
+ alphaAnim.setStartDelay(delays[i]);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphas[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java
new file mode 100644
index 0000000..e0f043f
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallGridPulseIndicator.java
@@ -0,0 +1,100 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class BallGridPulseIndicator extends Indicator {
+
+ public static final int ALPHA=255;
+
+ public static final float SCALE=1.0f;
+
+ int[] alphas=new int[]{ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA};
+
+ float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE};
+
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(getWidth()-circleSpacing*4)/6;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ float y = getWidth()/ 2-(radius*2+circleSpacing);
+
+ for (int i = 0; i < 3; i++) {
+ for (int j = 0; j < 3; j++) {
+ canvas.save();
+ float translateX=x+(radius*2)*j+circleSpacing*j;
+ float translateY=y+(radius*2)*i+circleSpacing*i;
+ canvas.translate(translateX, translateY);
+ canvas.scale(scaleFloats[3 * i + j], scaleFloats[3 * i + j]);
+ paint.setAlpha(alphas[3 * i + j]);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+ }
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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};
+
+ for (int i = 0; i < 9; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.5f,1);
+ scaleAnim.setDuration(durations[i]);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 210, 122, 255);
+ alphaAnim.setDuration(durations[i]);
+ alphaAnim.setRepeatCount(-1);
+ alphaAnim.setStartDelay(delays[i]);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphas[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java
new file mode 100644
index 0000000..eef80b0
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseIndicator.java
@@ -0,0 +1,67 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class BallPulseIndicator extends Indicator {
+
+ public static final float SCALE=1.0f;
+
+ //scale x ,y
+ private float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE};
+
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(Math.min(getWidth(),getHeight())-circleSpacing*2)/6;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ float y=getHeight() / 2;
+ for (int i = 0; i < 3; 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<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ int[] delays=new int[]{120,240,360};
+ for (int i = 0; i < 3; 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseRiseIndicator.java
new file mode 100644
index 0000000..afc48ce
--- /dev/null
+++ b/pickerviewlibrary/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<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java
new file mode 100644
index 0000000..862f92d
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallPulseSyncIndicator.java
@@ -0,0 +1,57 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallPulseSyncIndicator extends Indicator {
+
+ float[] translateYFloats=new float[3];
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ float radius=(getWidth()-circleSpacing*2)/6;
+ float x = getWidth()/ 2-(radius*2+circleSpacing);
+ for (int i = 0; i < 3; i++) {
+ canvas.save();
+ float translateX=x+(radius*2)*i+circleSpacing*i;
+ canvas.translate(translateX, translateYFloats[i]);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ float circleSpacing=4;
+ float radius=(getWidth()-circleSpacing*2)/6;
+ int[] delays=new int[]{70,140,210};
+ for (int i = 0; i < 3; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(getHeight()/2,getHeight()/2-radius*2,getHeight()/2);
+ scaleAnim.setDuration(600);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateYFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ }
+ return animators;
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java
new file mode 100644
index 0000000..de4d25b
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallRotateIndicator.java
@@ -0,0 +1,89 @@
+package com.wang.avi.indicators;
+
+import android.animation.ValueAnimator;
+import android.graphics.Canvas;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/17.
+ */
+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) {
+ float radius=getWidth()/10;
+ 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);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+
+ canvas.save();
+ canvas.translate(x, y);
+ canvas.scale(scaleFloat, scaleFloat);
+ canvas.drawCircle(0, 0, radius, paint);
+ canvas.restore();
+
+ canvas.save();
+ canvas.translate(x + radius * 2 + radius, y);
+ canvas.scale(scaleFloat, scaleFloat);
+ canvas.drawCircle(0,0,radius, paint);
+ canvas.restore();
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(0.5f,1,0.5f);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ 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);
+
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java
new file mode 100644
index 0000000..3e52f7c
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleIndicator.java
@@ -0,0 +1,60 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallScaleIndicator extends Indicator {
+
+ float scale=1;
+ int alpha=255;
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ paint.setAlpha(alpha);
+ canvas.scale(scale,scale,getWidth()/2,getHeight()/2);
+ paint.setAlpha(alpha);
+ canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-circleSpacing,paint);
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
+ scaleAnim.setInterpolator(new LinearInterpolator());
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scale = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 0);
+ alphaAnim.setInterpolator(new LinearInterpolator());
+ alphaAnim.setDuration(1000);
+ alphaAnim.setRepeatCount(-1);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alpha = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java
new file mode 100644
index 0000000..43d4aaa
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleMultipleIndicator.java
@@ -0,0 +1,68 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallScaleMultipleIndicator extends Indicator {
+
+ float[] scaleFloats=new float[]{1,1,1};
+ int[] alphaInts=new int[]{255,255,255};
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float circleSpacing=4;
+ for (int i = 0; i < 3; i++) {
+ paint.setAlpha(alphaInts[i]);
+ canvas.scale(scaleFloats[i],scaleFloats[i],getWidth()/2,getHeight()/2);
+ canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-circleSpacing,paint);
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ long[] delays=new long[]{0, 200, 400};
+ for (int i = 0; i < 3; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
+ scaleAnim.setInterpolator(new LinearInterpolator());
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ scaleAnim.setStartDelay(delays[i]);
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255,0);
+ alphaAnim.setInterpolator(new LinearInterpolator());
+ alphaAnim.setDuration(1000);
+ alphaAnim.setRepeatCount(-1);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphaInts[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ scaleAnim.setStartDelay(delays[i]);
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java
new file mode 100644
index 0000000..d791f71
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleIndicator.java
@@ -0,0 +1,56 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallScaleRippleIndicator extends BallScaleIndicator {
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(3);
+ super.draw(canvas, paint);
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
+ scaleAnim.setInterpolator(new LinearInterpolator());
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scale = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(0, 255);
+ alphaAnim.setInterpolator(new LinearInterpolator());
+ alphaAnim.setDuration(1000);
+ alphaAnim.setRepeatCount(-1);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alpha = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java
new file mode 100644
index 0000000..5dc132b
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallScaleRippleMultipleIndicator.java
@@ -0,0 +1,62 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallScaleRippleMultipleIndicator extends BallScaleMultipleIndicator {
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ paint.setStyle(Paint.Style.STROKE);
+ paint.setStrokeWidth(3);
+ super.draw(canvas, paint);
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ long[] delays=new long[]{0, 200, 400};
+ for (int i = 0; i < 3; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(0,1);
+ scaleAnim.setInterpolator(new LinearInterpolator());
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ scaleAnim.setStartDelay(delays[i]);
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(0,255);
+ scaleAnim.setInterpolator(new LinearInterpolator());
+ alphaAnim.setDuration(1000);
+ alphaAnim.setRepeatCount(-1);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphaInts[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ scaleAnim.setStartDelay(delays[i]);
+
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java
new file mode 100644
index 0000000..d93fbb3
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallSpinFadeLoaderIndicator.java
@@ -0,0 +1,114 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/20.
+ */
+public class BallSpinFadeLoaderIndicator extends Indicator {
+
+ public static final float SCALE=1.0f;
+
+ public static final int ALPHA=255;
+
+ float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE};
+
+ int[] alphas=new int[]{ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA,
+ ALPHA};
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float radius=getWidth()/10;
+ for (int i = 0; i < 8; i++) {
+ canvas.save();
+ Point point=circleAt(getWidth(),getHeight(),getWidth()/2-radius,i*(Math.PI/4));
+ canvas.translate(point.x,point.y);
+ canvas.scale(scaleFloats[i],scaleFloats[i]);
+ paint.setAlpha(alphas[i]);
+ canvas.drawCircle(0,0,radius,paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255, 77, 255);
+ alphaAnim.setDuration(1000);
+ alphaAnim.setRepeatCount(-1);
+ alphaAnim.setStartDelay(delays[i]);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alphas[index] = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ animators.add(alphaAnim);
+ }
+ return animators;
+ }
+
+ /**
+ * 鍦哋鐨勫渾蹇冧负(a,b),鍗婂緞涓篟,鐐笰涓庡埌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{
+ public float x;
+ public float y;
+
+ public Point(float x, float y){
+ this.x=x;
+ this.y=y;
+ }
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java
new file mode 100644
index 0000000..1a3a9ba
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallTrianglePathIndicator.java
@@ -0,0 +1,80 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallTrianglePathIndicator extends Indicator {
+
+ float[] translateX=new float[3],translateY=new float[3];
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ paint.setStrokeWidth(3);
+ paint.setStyle(Paint.Style.STROKE);
+ for (int i = 0; i < 3; i++) {
+ canvas.save();
+ canvas.translate(translateX[i], translateY[i]);
+ canvas.drawCircle(0, 0, getWidth() / 10, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ float startX=getWidth()/5;
+ float startY=getWidth()/5;
+ for (int i = 0; i < 3; i++) {
+ final int index=i;
+ ValueAnimator translateXAnim=ValueAnimator.ofFloat(getWidth()/2,getWidth()-startX,startX,getWidth()/2);
+ if (i==1){
+ translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()/2,getWidth()-startX);
+ }else if (i==2){
+ translateXAnim=ValueAnimator.ofFloat(startX,getWidth()/2,getWidth()-startX,startX);
+ }
+ ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,getHeight()-startY,getHeight()-startY,startY);
+ if (i==1){
+ translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,getHeight()-startY);
+ }else if (i==2){
+ translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,startY,getHeight()-startY,getHeight()-startY);
+ }
+
+ translateXAnim.setDuration(2000);
+ translateXAnim.setInterpolator(new LinearInterpolator());
+ translateXAnim.setRepeatCount(-1);
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateX [index]= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ translateYAnim.setDuration(2000);
+ translateYAnim.setInterpolator(new LinearInterpolator());
+ translateYAnim.setRepeatCount(-1);
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateY [index]= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
+ }
+ return animators;
+ }
+
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java
new file mode 100644
index 0000000..93aec2e
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagDeflectIndicator.java
@@ -0,0 +1,60 @@
+package com.wang.avi.indicators;
+
+
+import android.view.animation.LinearInterpolator;
+import android.animation.ValueAnimator;
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallZigZagDeflectIndicator extends BallZigZagIndicator {
+
+
+
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ float startX=getWidth()/6;
+ float startY=getWidth()/6;
+ for (int i = 0; i < 2; i++) {
+ final int index=i;
+ ValueAnimator translateXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,startX,getWidth()-startX,startX);
+ if (i==1){
+ translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()-startX,startX,getWidth()-startX);
+ }
+ ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()-startY,getHeight()-startY,startY);
+ if (i==1){
+ translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,startY,getHeight()-startY);
+ }
+
+ translateXAnim.setDuration(2000);
+ translateXAnim.setInterpolator(new LinearInterpolator());
+ translateXAnim.setRepeatCount(-1);
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateX [index]= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ translateYAnim.setDuration(2000);
+ translateYAnim.setInterpolator(new LinearInterpolator());
+ translateYAnim.setRepeatCount(-1);
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateY [index]= (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java
new file mode 100644
index 0000000..d01c8ff
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/BallZigZagIndicator.java
@@ -0,0 +1,73 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class BallZigZagIndicator extends Indicator {
+
+ float[] translateX=new float[2],translateY=new float[2];
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ for (int i = 0; i < 2; i++) {
+ canvas.save();
+ canvas.translate(translateX[i], translateY[i]);
+ canvas.drawCircle(0, 0, getWidth() / 10, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ float startX=getWidth()/6;
+ float startY=getWidth()/6;
+ for (int i = 0; i < 2; i++) {
+ final int index=i;
+ ValueAnimator translateXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,getWidth()/2,startX);
+ if (i==1){
+ translateXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,getWidth()/2,getWidth()-startX);
+ }
+ ValueAnimator translateYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()/2,startY);
+ if (i==1){
+ translateYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,getHeight()/2,getHeight()-startY);
+ }
+
+ translateXAnim.setDuration(1000);
+ translateXAnim.setInterpolator(new LinearInterpolator());
+ translateXAnim.setRepeatCount(-1);
+ addUpdateListener(translateXAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateX[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ translateYAnim.setDuration(1000);
+ translateYAnim.setInterpolator(new LinearInterpolator());
+ translateYAnim.setRepeatCount(-1);
+ addUpdateListener(translateYAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateY[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(translateXAnim);
+ animators.add(translateYAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java
new file mode 100644
index 0000000..181024f
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/CubeTransitionIndicator.java
@@ -0,0 +1,106 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/18.
+ */
+public class CubeTransitionIndicator extends Indicator {
+
+ float[] translateX=new float[2],translateY=new float[2];
+ float degrees,scaleFloat=1.0f;
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float rWidth=getWidth()/5;
+ float rHeight=getHeight()/5;
+ for (int i = 0; i < 2; i++) {
+ canvas.save();
+ canvas.translate(translateX[i], translateY[i]);
+ canvas.rotate(degrees);
+ canvas.scale(scaleFloat,scaleFloat);
+ RectF rectF=new RectF(-rWidth/2,-rHeight/2,rWidth/2,rHeight/2);
+ canvas.drawRect(rectF,paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ float startX=getWidth()/5;
+ float startY=getHeight()/5;
+ for (int i = 0; i < 2; i++) {
+ final int index=i;
+ translateX[index]=startX;
+ ValueAnimator translationXAnim=ValueAnimator.ofFloat(startX,getWidth()-startX,getWidth()-startX, startX,startX);
+ if (i==1){
+ translationXAnim=ValueAnimator.ofFloat(getWidth()-startX,startX,startX, getWidth()-startX,getWidth()-startX);
+ }
+ translationXAnim.setInterpolator(new LinearInterpolator());
+ translationXAnim.setDuration(1600);
+ translationXAnim.setRepeatCount(-1);
+ translationXAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateX[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ translateY[index]=startY;
+ ValueAnimator translationYAnim=ValueAnimator.ofFloat(startY,startY,getHeight()-startY,getHeight()- startY,startY);
+ if (i==1){
+ translationYAnim=ValueAnimator.ofFloat(getHeight()-startY,getHeight()-startY,startY,startY,getHeight()-startY);
+ }
+ translationYAnim.setDuration(1600);
+ translationYAnim.setInterpolator(new LinearInterpolator());
+ translationYAnim.setRepeatCount(-1);
+ addUpdateListener(translationYAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateY[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ 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);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleFloat = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator rotateAnim=ValueAnimator.ofFloat(0,180,360,1.5f*360,2*360);
+ rotateAnim.setDuration(1600);
+ rotateAnim.setInterpolator(new LinearInterpolator());
+ rotateAnim.setRepeatCount(-1);
+ addUpdateListener(rotateAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ animators.add(scaleAnim);
+ animators.add(rotateAnim);
+ return animators;
+ }
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java
new file mode 100644
index 0000000..83bfe86
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScaleIndicator.java
@@ -0,0 +1,61 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class LineScaleIndicator extends Indicator {
+
+ public static final float SCALE=1.0f;
+
+ float[] scaleYFloats=new float[]{SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,};
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float translateX=getWidth()/11;
+ float translateY=getHeight()/2;
+ for (int i = 0; i < 5; i++) {
+ canvas.save();
+ canvas.translate((2 + i * 2) * translateX - translateX / 2, translateY);
+ canvas.scale(SCALE, scaleYFloats[i]);
+ RectF rectF=new RectF(-translateX/2,-getHeight()/2.5f,translateX/2,getHeight()/2.5f);
+ canvas.drawRoundRect(rectF, 5, 5, paint);
+ canvas.restore();
+ }
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ long[] delays=new long[]{100,200,300,400,500};
+ for (int i = 0; i < 5; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1, 0.4f, 1);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleYFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java
new file mode 100644
index 0000000..b316e23
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePartyIndicator.java
@@ -0,0 +1,64 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class LineScalePartyIndicator extends Indicator {
+
+ public static final float SCALE=1.0f;
+
+ float[] scaleFloats=new float[]{SCALE,
+ SCALE,
+ SCALE,
+ SCALE,
+ SCALE,};
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float translateX=getWidth()/9;
+ float translateY=getHeight()/2;
+ for (int i = 0; i < 4; i++) {
+ canvas.save();
+ canvas.translate((2 + i * 2) * translateX - translateX / 2, translateY);
+ canvas.scale(scaleFloats[i], scaleFloats[i]);
+ RectF rectF=new RectF(-translateX/2,-getHeight()/2.5f,translateX/2,getHeight()/2.5f);
+ canvas.drawRoundRect(rectF,5,5,paint);
+ canvas.restore();
+ }
+ }
+
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);
+ scaleAnim.setDuration(durations[i]);
+ 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java
new file mode 100644
index 0000000..2b02150
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutIndicator.java
@@ -0,0 +1,35 @@
+package com.wang.avi.indicators;
+
+
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class LineScalePulseOutIndicator extends LineScaleIndicator {
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ long[] delays=new long[]{500,250,0,250,500};
+ for (int i = 0; i < 5; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.3f,1);
+ scaleAnim.setDuration(900);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleYFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java
new file mode 100644
index 0000000..51cfcdc
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineScalePulseOutRapidIndicator.java
@@ -0,0 +1,35 @@
+package com.wang.avi.indicators;
+
+
+import android.animation.ValueAnimator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/19.
+ */
+public class LineScalePulseOutRapidIndicator extends LineScaleIndicator {
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> animators=new ArrayList<>();
+ long[] delays=new long[]{400,200,0,200,400};
+ for (int i = 0; i < 5; i++) {
+ final int index=i;
+ ValueAnimator scaleAnim=ValueAnimator.ofFloat(1,0.4f,1);
+ scaleAnim.setDuration(1000);
+ scaleAnim.setRepeatCount(-1);
+ scaleAnim.setStartDelay(delays[i]);
+ addUpdateListener(scaleAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ scaleYFloats[index] = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+ animators.add(scaleAnim);
+ }
+ return animators;
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java
new file mode 100644
index 0000000..32df75b
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/LineSpinFadeLoaderIndicator.java
@@ -0,0 +1,30 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+
+/**
+ * Created by Jack on 2015/10/24.
+ * Email:81813780@qq.com
+ */
+public class LineSpinFadeLoaderIndicator extends BallSpinFadeLoaderIndicator {
+
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ float radius=getWidth()/10;
+ for (int i = 0; i < 8; i++) {
+ canvas.save();
+ Point point=circleAt(getWidth(),getHeight(),getWidth()/2.5f-radius,i*(Math.PI/4));
+ canvas.translate(point.x, point.y);
+ canvas.scale(scaleFloats[i], scaleFloats[i]);
+ canvas.rotate(i*45);
+ paint.setAlpha(alphas[i]);
+ RectF rectF=new RectF(-radius,-radius/1.5f,1.5f*radius,radius/1.5f);
+ canvas.drawRoundRect(rectF,5,5,paint);
+ canvas.restore();
+ }
+ }
+
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/PacmanIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/PacmanIndicator.java
new file mode 100644
index 0000000..9a3a2e6
--- /dev/null
+++ b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/PacmanIndicator.java
@@ -0,0 +1,115 @@
+package com.wang.avi.indicators;
+
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.view.animation.LinearInterpolator;
+
+import android.animation.ValueAnimator;
+import com.wang.avi.Indicator;
+
+import java.util.ArrayList;
+
+/**
+ * Created by Jack on 2015/10/16.
+ */
+public class PacmanIndicator extends Indicator {
+
+ private float translateX;
+
+ private int alpha;
+
+ private float degrees1,degrees2;
+
+ @Override
+ public void draw(Canvas canvas, Paint paint) {
+ drawPacman(canvas,paint);
+ drawCircle(canvas,paint);
+ }
+
+ private void drawPacman(Canvas canvas,Paint paint){
+ float x=getWidth()/2;
+ float y=getHeight()/2;
+
+ canvas.save();
+
+ canvas.translate(x, y);
+ canvas.rotate(degrees1);
+ paint.setAlpha(255);
+ RectF rectF1=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);
+ canvas.drawArc(rectF1, 0, 270, true, paint);
+
+ canvas.restore();
+
+ canvas.save();
+ canvas.translate(x, y);
+ canvas.rotate(degrees2);
+ paint.setAlpha(255);
+ RectF rectF2=new RectF(-x/1.7f,-y/1.7f,x/1.7f,y/1.7f);
+ canvas.drawArc(rectF2,90,270,true,paint);
+ canvas.restore();
+ }
+
+
+ private void drawCircle(Canvas canvas, Paint paint) {
+ float radius=getWidth()/11;
+ paint.setAlpha(alpha);
+ canvas.drawCircle(translateX, getHeight() / 2, radius, paint);
+ }
+
+ @Override
+ public ArrayList<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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);
+ addUpdateListener(translationAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ translateX = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator alphaAnim=ValueAnimator.ofInt(255,122);
+ alphaAnim.setDuration(650);
+ alphaAnim.setRepeatCount(-1);
+ addUpdateListener(alphaAnim,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ alpha = (int) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator rotateAnim1=ValueAnimator.ofFloat(0, 45, 0);
+ rotateAnim1.setDuration(650);
+ rotateAnim1.setRepeatCount(-1);
+ addUpdateListener(rotateAnim1,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees1 = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ ValueAnimator rotateAnim2=ValueAnimator.ofFloat(0,-45,0);
+ rotateAnim2.setDuration(650);
+ rotateAnim2.setRepeatCount(-1);
+ addUpdateListener(rotateAnim2,new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ degrees2 = (float) animation.getAnimatedValue();
+ postInvalidate();
+ }
+ });
+
+ animators.add(translationAnim);
+ animators.add(alphaAnim);
+ animators.add(rotateAnim1);
+ animators.add(rotateAnim2);
+ return animators;
+ }
+}
diff --git a/pickerviewlibrary/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/SemiCircleSpinIndicator.java
new file mode 100644
index 0000000..53a0b70
--- /dev/null
+++ b/pickerviewlibrary/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<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/SquareSpinIndicator.java
new file mode 100644
index 0000000..e2b8ae9
--- /dev/null
+++ b/pickerviewlibrary/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<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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/pickerviewlibrary/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java b/pickerviewlibrary/src/main/java/com/wang/avi/indicators/TriangleSkewSpinIndicator.java
new file mode 100644
index 0000000..93364cd
--- /dev/null
+++ b/pickerviewlibrary/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<ValueAnimator> onCreateAnimators() {
+ ArrayList<ValueAnimator> 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/pickerviewlibrary/src/main/res/values/attrs.xml b/pickerviewlibrary/src/main/res/values/attrs.xml
index 3c1ea39..d5e2269 100644
--- a/pickerviewlibrary/src/main/res/values/attrs.xml
+++ b/pickerviewlibrary/src/main/res/values/attrs.xml
@@ -19,4 +19,13 @@
<attr name="wheelview_dividerWidth" format="dimension"/>
<attr name="wheelview_lineSpacingMultiplier" format="float"/>
</declare-styleable>
+ <declare-styleable name="AVLoadingIndicatorView">
+ <attr name="minWidth" format="dimension" />
+ <attr name="maxWidth" format="dimension"/>
+ <attr name="minHeight" format="dimension" />
+ <attr name="maxHeight" format="dimension"/>
+ <attr name="indicatorName" format="string"/>
+ <attr name="indicatorColor" format="color"/>
+ </declare-styleable>
+
</resources>
\ No newline at end of file
diff --git a/pickerviewlibrary/src/main/res/values/styles.xml b/pickerviewlibrary/src/main/res/values/styles.xml
index b21e521..3a524ca 100644
--- a/pickerviewlibrary/src/main/res/values/styles.xml
+++ b/pickerviewlibrary/src/main/res/values/styles.xml
@@ -40,4 +40,28 @@
<item name="android:windowEnterAnimation">@anim/pickerview_slide_in_bottom</item>
<item name="android:windowExitAnimation">@anim/pickerview_slide_out_bottom</item>
</style>
+
+ <style name="AVLoadingIndicatorView">
+ <item name="minWidth">48dip</item>
+ <item name="maxWidth">48dip</item>
+ <item name="minHeight">48dip</item>
+ <item name="maxHeight">48dip</item>
+ <item name="indicatorName">BallPulseIndicator</item>
+ </style>
+
+ <style name="AVLoadingIndicatorView.Large">
+ <item name="minWidth">76dip</item>
+ <item name="maxWidth">76dip</item>
+ <item name="minHeight">76dip</item>
+ <item name="maxHeight">76dip</item>
+ <item name="indicatorName">BallPulseIndicator</item>
+ </style>
+
+ <style name="AVLoadingIndicatorView.Small">
+ <item name="minWidth">24dip</item>
+ <item name="maxWidth">24dip</item>
+ <item name="minHeight">24dip</item>
+ <item name="maxHeight">24dip</item>
+ <item name="indicatorName">BallPulseIndicator</item>
+ </style>
</resources>
diff --git a/qihealonelibrary/build.gradle b/qihealonelibrary/build.gradle
index dc956ba..5a8e288 100644
--- a/qihealonelibrary/build.gradle
+++ b/qihealonelibrary/build.gradle
@@ -64,7 +64,7 @@
compileOnly 'com.github.getActivity:XXPermissions:18.5'
//婊氬姩閫夋嫨妗�
// compileOnly 'com.contrarywind:Android-PickerView:4.1.9'
- implementation files('../baselibrary/libs/avi.library-2.1.3.aar')
+
//鍒楄〃
compileOnly 'io.github.scwang90:refresh-layout-kernel:2.0.5'
compileOnly 'io.github.scwang90:refresh-header-classics:2.0.5'
diff --git a/qiheonlinelibrary/build.gradle b/qiheonlinelibrary/build.gradle
index 4e737c4..473eed8 100644
--- a/qiheonlinelibrary/build.gradle
+++ b/qiheonlinelibrary/build.gradle
@@ -81,8 +81,7 @@
compileOnly 'io.github.scwang90:refresh-header-classics:2.0.5'
compileOnly 'androidx.recyclerview:recyclerview:1.2.0'//缁忓吀鍒锋柊澶�
- //灏嗘敞閲婃帀鐨勮繙绋嬩緷璧栨敼涓烘湰鍦癮ar寮曠敤
- compileOnly files('../baselibrary/libs/avi.library-2.1.3.aar')
+
compileOnly group: 'net.sourceforge.jexcelapi', name: 'jxl', version: '2.6.12'
}
--
Gitblit v1.8.0