wuyong3 5 anos atrás
pai
commit
a0ed7f88eb
36 arquivos alterados com 366 adições e 8 exclusões
  1. 146 0
      asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/CustomAnimationDrawable.java
  2. 21 5
      asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/FaceCompare.java
  3. 14 1
      asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/MainActivity.java
  4. 99 0
      asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/MainActivityNew.java
  5. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/bg_alpha.png
  6. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading.png
  7. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0001.png
  8. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0002.png
  9. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0003.png
  10. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0004.png
  11. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0005.png
  12. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0006.png
  13. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0007.png
  14. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0008.png
  15. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0009.png
  16. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0010.png
  17. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0011.png
  18. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0012.png
  19. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0013.png
  20. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0014.png
  21. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0015.png
  22. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0016.png
  23. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0017.png
  24. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0018.png
  25. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0019.png
  26. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0020.png
  27. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0021.png
  28. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0022.png
  29. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0023.png
  30. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0024.png
  31. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0025.png
  32. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0026.png
  33. BIN
      asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0027.png
  34. 48 0
      asiainfo-aiface-client/app/src/main/res/drawable/loading.xml
  35. 5 2
      asiainfo-aiface-client/app/src/main/res/layout/activity_main.xml
  36. 33 0
      asiainfo-aiface-client/app/src/main/res/values/arrays.xml

+ 146 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/CustomAnimationDrawable.java

@ -0,0 +1,146 @@
1
package com.ai.ipu.aiface.scanCamera;
2
3
import android.annotation.SuppressLint;
4
import android.content.Context;
5
import android.content.res.TypedArray;
6
import android.graphics.Bitmap;
7
import android.graphics.BitmapFactory;
8
import android.os.Handler;
9
import android.os.HandlerThread;
10
import android.os.Message;
11
import android.util.Log;
12
import android.widget.ImageView;
13
14
15
import java.lang.ref.SoftReference;
16
17
public class CustomAnimationDrawable {
18
19
    private int[] mFrames; // 帧数组
20
    private int mIndex; // 当前帧
21
    private boolean mShouldRun; // 开始/停止播放用
22
    private boolean mIsRunning; // 动画是否正在播放,防止重复播放
23
    private SoftReference<ImageView> mSoftReferenceImageView; // 软引用ImageView,以便及时释放掉
24
    private Handler mHandler;
25
    private HandlerThread thread;
26
    private int mDelayMillis;
27
    private OnAnimationStoppedListener mOnAnimationStoppedListener; //播放停止监听
28
29
    private Bitmap nextBitmap;
30
    private long lasttime;
31
32
    public CustomAnimationDrawable(ImageView imageView, int[] frames, int fps) {
33
        thread = new HandlerThread("Animation");
34
        thread.start();
35
        mHandler = new Handler(thread.getLooper());
36
        mFrames = frames;
37
        mIndex = -1;
38
        mSoftReferenceImageView = new SoftReference<ImageView>(imageView);
39
        mShouldRun = false;
40
        mIsRunning = false;
41
        mDelayMillis = 1000 / fps;//帧动画时间间隔,毫秒
42
    }
43
    //循环读取下一帧
44
    private int getNext() {
45
        mIndex++;
46
        if (mIndex >= mFrames.length)
47
            mIndex = 0;
48
        return mFrames[mIndex];
49
    }
50
51
    @SuppressLint("HandlerLeak")
52
    private Handler uiHandler = new Handler(){
53
        @Override
54
        public void handleMessage(Message msg) {
55
            Log.e("Custom","Time:"+(System.currentTimeMillis()-lasttime));
56
            lasttime = System.currentTimeMillis();
57
            if(msg.what == 0){
58
                mSoftReferenceImageView.get().setImageBitmap((Bitmap) msg.obj);
59
                    if(nextBitmap!=null&&!nextBitmap.isRecycled()){
60
                        nextBitmap.recycle();
61
                    }
62
                    nextBitmap = (Bitmap) msg.obj;
63
            }else if(msg.what == 1){
64
                mSoftReferenceImageView.get().setImageResource(msg.arg1);
65
            }
66
        }
67
    };
68
69
    /**
70
     * 播放动画,同步锁防止多线程读帧时,数据安全问题
71
     */
72
    public synchronized void start() {
73
        mShouldRun = true;
74
        if (mIsRunning)
75
            return;
76
77
        Runnable runnable = new Runnable() {
78
            @Override
79
            public void run() {
80
                ImageView imageView = mSoftReferenceImageView.get();
81
                if (!mShouldRun || imageView == null) {
82
                    mIsRunning = false;
83
                    if (mOnAnimationStoppedListener != null) {
84
                        mOnAnimationStoppedListener.AnimationStopped();
85
                    }
86
                    return;
87
                }
88
                mIsRunning = true;
89
                //新开线程去读下一帧
90
                if (imageView.isShown()) {
91
                    int imageRes = getNext();
92
                    Bitmap bitmap = BitmapFactory.decodeResource(imageView.getResources(), imageRes);
93
                    if (bitmap != null) {
94
                        Message msg = Message.obtain();
95
                        msg.what = 0;
96
                        msg.obj = bitmap;
97
                        uiHandler.sendMessage(msg);
98
                    } else {
99
                        Message msg = Message.obtain();
100
                        msg.what = 1;
101
                        msg.arg1 = imageRes;
102
                        uiHandler.sendMessage(msg);
103
                    }
104
                }
105
                mHandler.postDelayed(this, mDelayMillis);
106
107
            }
108
        };
109
110
        mHandler.post(runnable);
111
    }
112
113
    /**
114
     * 停止播放
115
     */
116
    public synchronized void stop() {
117
        mShouldRun = false;
118
    }
119
120
    /**
121
     * 设置停止播放监听
122
     * @param listener
123
     */
124
    public void setOnAnimStopListener(OnAnimationStoppedListener listener){
125
        this.mOnAnimationStoppedListener = listener;
126
    }
127
128
    /**
129
     * 停止播放监听
130
     */
131
    public interface OnAnimationStoppedListener{
132
        void AnimationStopped();
133
    }
134
135
    public static int[] getData(Context context,int resId){
136
        TypedArray array = context.getResources().obtainTypedArray(resId);
137
        int len = array.length();
138
        int[] intArray = new int[array.length()];
139
140
        for(int i = 0; i < len; i++){
141
            intArray[i] = array.getResourceId(i, 0);
142
        }
143
        array.recycle();
144
        return intArray;
145
    }
146
}

+ 21 - 5
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/FaceCompare.java

@ -36,12 +36,18 @@ public class FaceCompare {
36 36
        facenet = new Facenet(context.getAssets());
37 37
    }
38 38
39
    public void startCompare(Activity activity,Bitmap bmp){
39
    public void startCompare(Activity activity,Bitmap bmp,CompareListener listener){
40 40
        if(!isComparing){
41 41
            isComparing = true;
42 42
            new Thread(new Runnable() {
43 43
                @Override
44 44
                public void run() {
45
                    activity.runOnUiThread(new Runnable() {
46
                        @Override
47
                        public void run() {
48
                            listener.onStart();
49
                        }
50
                    });
45 51
                    JSONObject param = new JSONObject();
46 52
                    String bitmap64 = BitmapUtil.bitmapToBase64(bmp);
47 53
                    try {
@ -60,15 +66,19 @@ public class FaceCompare {
60 66
                            @Override
61 67
                            public void run() {
62 68
                                if(code == 200){
63
                                    Relay.setEnable();
64
                                    Toast.makeText(activity,name+"识别成功",Toast.LENGTH_SHORT).show();
69
                                    listener.onSuccess(name);
65 70
                                }else{
66
                                    Toast.makeText(activity,name,Toast.LENGTH_SHORT).show();
71
                                    listener.onFailure(name);
67 72
                                }
68 73
                            }
69 74
                        });
70 75
                    } catch (JSONException e) {
71
                        e.printStackTrace();
76
                        activity.runOnUiThread(new Runnable() {
77
                            @Override
78
                            public void run() {
79
                                listener.onFailure("认证失败!");
80
                            }
81
                        });
72 82
                    }
73 83
                    isComparing = false;
74 84
                }
@ -140,4 +150,10 @@ public class FaceCompare {
140 150
        //return ff1.compare(ff2);
141 151
        return FaceFeature.sim_distance(ff1, faceFeature);
142 152
    }
153
154
    public abstract static class CompareListener{
155
        public void onStart(){}
156
        public void onSuccess(String info){}
157
        public void onFailure(String msg){}
158
    }
143 159
}

+ 14 - 1
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/MainActivity.java

@ -11,11 +11,13 @@ import android.text.format.DateFormat;
11 11
import android.view.View;
12 12
import android.widget.ImageView;
13 13
import android.widget.TextView;
14
import android.widget.Toast;
14 15
15 16
import com.ai.ipu.aiface.R;
16 17
import com.ai.ipu.aiface.scanCamera.db.FeatureDBManager;
17 18
import com.ai.ipu.aiface.scanCamera.util.DymicPermissionTool;
18 19
import com.ai.ipu.aiface.scanCamera.util.LEDLight;
20
import com.ai.ipu.aiface.scanCamera.util.Relay;
19 21
import com.google.android.cameraview.CameraView;
20 22
21 23
import java.util.Calendar;
@ -81,7 +83,18 @@ public class MainActivity extends FaceScanBaseActivity {
81 83
    public boolean handlePreview(Bitmap bmp) {
82 84
        preview.setVisibility(View.VISIBLE);
83 85
        preview.setImageDrawable(new BitmapDrawable(getResources(),bmp));
84
        compare.startCompare(this,bmp);
86
        compare.startCompare(this, bmp, new FaceCompare.CompareListener() {
87
            @Override
88
            public void onSuccess(String info) {
89
                Relay.setEnable();
90
                Toast.makeText(MainActivity.this,info+"识别成功",Toast.LENGTH_SHORT).show();
91
            }
92
93
            @Override
94
            public void onFailure(String msg) {
95
                Toast.makeText(MainActivity.this,msg,Toast.LENGTH_SHORT).show();
96
            }
97
        });
85 98
        return false;
86 99
    }
87 100

+ 99 - 0
asiainfo-aiface-client/app/src/main/java/com/ai/ipu/aiface/scanCamera/MainActivityNew.java

@ -1,21 +1,46 @@
1 1
package com.ai.ipu.aiface.scanCamera;
2 2
3
import android.content.pm.PackageManager;
3 4
import android.graphics.Bitmap;
4 5
import android.os.Bundle;
6
import android.os.Handler;
5 7
import android.view.View;
6 8
import android.view.WindowManager;
9
import android.widget.ImageView;
10
import android.widget.Toast;
7 11
8 12
import com.ai.ipu.aiface.R;
13
import com.ai.ipu.aiface.scanCamera.util.DymicPermissionTool;
14
import com.ai.ipu.aiface.scanCamera.util.LEDLight;
15
import com.ai.ipu.aiface.scanCamera.util.Relay;
9 16
17
import androidx.annotation.NonNull;
10 18
import androidx.annotation.Nullable;
11 19
12 20
public class MainActivityNew extends FaceScanBaseActivity {
13 21
22
    private ImageView led_switch;
23
    private LEDLight ledLight;
24
    private ImageView iv_loading;
25
    private CustomAnimationDrawable animation;
26
    private ImageView iv_icon;
27
    private ImageView iv_circle;
28
29
    private FaceCompare compare;
30
14 31
    @Override
15 32
    public void onCreate(@Nullable @android.support.annotation.Nullable Bundle bundle) {
16 33
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
17 34
        getWindow().getDecorView().setSystemUiVisibility(View.INVISIBLE);
18 35
        super.onCreate(bundle);
36
        DymicPermissionTool.requestPermission(this);
37
        led_switch = findViewById(R.id.led_switch);
38
        ledLight = new LEDLight();
39
        compare = new FaceCompare(this);
40
        iv_loading = findViewById(R.id.iv_loading);
41
        iv_icon = findViewById(R.id.iv_icon);
42
        iv_circle = findViewById(R.id.iv_circular);
43
        animation =new CustomAnimationDrawable(iv_loading,CustomAnimationDrawable.getData(this,R.array.loading_anim),24);
19 44
    }
20 45
21 46
    @Override
@ -25,6 +50,80 @@ public class MainActivityNew extends FaceScanBaseActivity {
25 50
26 51
    @Override
27 52
    public boolean handlePreview(Bitmap bitmap) {
53
        compare.startCompare(this, bitmap, new FaceCompare.CompareListener() {
54
            @Override
55
            public void onStart() {
56
                iv_loading.setVisibility(View.VISIBLE);
57
                animation.start();
58
                iv_circle.setVisibility(View.VISIBLE);
59
                iv_circle.setSelected(true);
60
                iv_icon.setVisibility(View.GONE);
61
            }
62
63
            @Override
64
            public void onSuccess(String info) {
65
                animation.stop();
66
                iv_loading.setVisibility(View.GONE);
67
                iv_icon.setVisibility(View.VISIBLE);
68
                iv_icon.setSelected(true);
69
                uiHandle.postDelayed(delayrun,3000);
70
                Relay.setEnable();
71
                Toast.makeText(MainActivityNew.this,info+"识别成功",Toast.LENGTH_SHORT).show();
72
            }
73
74
            @Override
75
            public void onFailure(String msg) {
76
                animation.stop();
77
                iv_loading.setVisibility(View.GONE);
78
                iv_icon.setVisibility(View.VISIBLE);
79
                iv_icon.setSelected(false);
80
                iv_circle.setSelected(false);
81
                uiHandle.postDelayed(delayrun,3000);
82
                Toast.makeText(MainActivityNew.this,msg,Toast.LENGTH_SHORT).show();
83
            }
84
        });
28 85
        return false;
29 86
    }
87
88
    private Handler uiHandle = new Handler();
89
90
    private Runnable delayrun = new Runnable() {
91
        @Override
92
        public void run() {
93
            iv_circle.setVisibility(View.GONE);
94
            iv_icon.setVisibility(View.GONE);
95
        }
96
    };
97
98
    @Override
99
    public void onResume() {
100
        super.onResume();
101
        initLED();
102
        ledLight.setLEDEnable(ledLight.getLEDEnable());
103
    }
104
105
    @Override
106
    public void onPause() {
107
        super.onPause();
108
        ledLight.setLEDEnable(false);
109
    }
110
111
    private void initLED(){
112
        led_switch.setSelected(ledLight.getLEDEnable());
113
        led_switch.setOnClickListener(v -> {
114
            ledLight.setLEDEnable(!ledLight.getLEDEnable());
115
            led_switch.setSelected(ledLight.getLEDEnable());
116
        });
117
    }
118
119
    @Override
120
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
121
        if(requestCode==DymicPermissionTool.PERMISSION_REQUEST){
122
            for (int result:grantResults){
123
                if(result == PackageManager.PERMISSION_DENIED){
124
                    finish();
125
                }
126
            }
127
        }
128
    }
30 129
}

BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/bg_alpha.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0001.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0002.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0003.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0004.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0005.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0006.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0007.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0008.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0009.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0010.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0011.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0012.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0013.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0014.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0015.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0016.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0017.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0018.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0019.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0020.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0021.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0022.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0023.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0024.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0025.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0026.png


BIN
asiainfo-aiface-client/app/src/main/res/drawable-mdpi/loading0027.png


+ 48 - 0
asiainfo-aiface-client/app/src/main/res/drawable/loading.xml

@ -0,0 +1,48 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
3
    android:oneshot="false">
4
5
    <item
6
        android:drawable="@drawable/loading0001"
7
        android:duration="50"/>
8
    <item
9
        android:drawable="@drawable/loading0003"
10
        android:duration="50"/>
11
    <item
12
        android:drawable="@drawable/loading0005"
13
        android:duration="50"/>
14
    <item
15
        android:drawable="@drawable/loading0007"
16
        android:duration="50"/>
17
    <item
18
        android:drawable="@drawable/loading0009"
19
        android:duration="50"/>
20
    <item
21
        android:drawable="@drawable/loading0011"
22
        android:duration="50"/>
23
    <item
24
        android:drawable="@drawable/loading0013"
25
        android:duration="50"/>
26
    <item
27
        android:drawable="@drawable/loading0015"
28
        android:duration="50"/>
29
    <item
30
        android:drawable="@drawable/loading0017"
31
        android:duration="50"/>
32
    <item
33
        android:drawable="@drawable/loading0019"
34
        android:duration="50"/>
35
    <item
36
        android:drawable="@drawable/loading0021"
37
        android:duration="50"/>
38
    <item
39
        android:drawable="@drawable/loading0023"
40
        android:duration="50"/>
41
    <item
42
        android:drawable="@drawable/loading0025"
43
        android:duration="50"/>
44
    <item
45
        android:drawable="@drawable/loading0027"
46
        android:duration="50"/>
47
48
</animation-list>

+ 5 - 2
asiainfo-aiface-client/app/src/main/res/layout/activity_main.xml

@ -20,9 +20,10 @@
20 20
        <ImageView
21 21
            android:layout_width="wrap_content"
22 22
            android:layout_height="wrap_content"
23
            android:id="@+id/iv_loading"
24
            android:visibility="gone"
23 25
            android:layout_alignParentBottom="true"
24
            android:layout_centerHorizontal="true"
25
            android:src="@drawable/loading"/>
26
            android:layout_centerHorizontal="true"/>
26 27
27 28
    </RelativeLayout>
28 29
@ -38,6 +39,7 @@
38 39
        android:layout_height="wrap_content"
39 40
        android:layout_centerHorizontal="true"
40 41
        android:layout_marginTop="165dp"
42
        android:visibility="gone"
41 43
        android:src="@drawable/circular"/>
42 44
43 45
    <ImageView
@ -46,6 +48,7 @@
46 48
        android:layout_height="wrap_content"
47 49
        android:layout_centerHorizontal="true"
48 50
        android:layout_marginTop="650dp"
51
        android:visibility="gone"
49 52
        android:src="@drawable/icon"/>
50 53
51 54
    <ImageView

+ 33 - 0
asiainfo-aiface-client/app/src/main/res/values/arrays.xml

@ -0,0 +1,33 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
<resources>
3
    <string-array name="loading_anim">
4
        <item>@drawable/loading0001</item>
5
        <item>@drawable/loading0002</item>
6
        <item>@drawable/loading0003</item>
7
        <item>@drawable/loading0004</item>
8
        <item>@drawable/loading0005</item>
9
        <item>@drawable/loading0006</item>
10
        <item>@drawable/loading0007</item>
11
        <item>@drawable/loading0008</item>
12
        <item>@drawable/loading0009</item>
13
        <item>@drawable/loading0010</item>
14
        <item>@drawable/loading0011</item>
15
        <item>@drawable/loading0012</item>
16
        <item>@drawable/loading0013</item>
17
        <item>@drawable/loading0014</item>
18
        <item>@drawable/loading0015</item>
19
        <item>@drawable/loading0016</item>
20
        <item>@drawable/loading0017</item>
21
        <item>@drawable/loading0018</item>
22
        <item>@drawable/loading0019</item>
23
        <item>@drawable/loading0020</item>
24
        <item>@drawable/loading0021</item>
25
        <item>@drawable/loading0022</item>
26
        <item>@drawable/loading0023</item>
27
        <item>@drawable/loading0024</item>
28
        <item>@drawable/loading0025</item>
29
        <item>@drawable/loading0026</item>
30
        <item>@drawable/loading0027</item>
31
    </string-array>
32
33
</resources>