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