본문 바로가기
Android

Synchronize animations issue

by Birthmark 2020. 7. 20.

용케 원하는 바대로 구동되고있다.

이번 이슈는 깜빡임(Blink animation)의 타이밍을 통일시키는 것이다.

하나는 버튼 전체가 깜빡이고, 다른 하나는 버튼위의 아이콘만 깜빡이는 형태다.

Button은 Animation으로, 아이콘(drawable)은 ObjectAnimator로 각각 동작 방식이 다르고, 같은 핸들러 안에 case로 분기되어있는 상황이다. 어떻게 동시에 타이밍을 맞출지 구글링을 해도 원하는 샘플이 안나온다.

내 두뇌 탓을 해본다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
public class MainActivity extends AppCompatActivity {
 
    //ステータス番号
    private final int ALL_STOPPED = 1;          //一斉停止中
    private final int NOZZLE_ONLY = 2;          //設定のみ/ノズル外しのみ
    private final int WAIT_PERMIT = 3;          //許可待ち
    private final int NG_OIL = 4;               //油種違い
    private final int STOPPED = 5;              //停止中
    private final int NON_LINKED = 6;           //非連動
    private final int DISCONNECTED = 7;         //切り離し
    private final int STOPPED_BY_SWITCH = 8;    //計量機搭載停止スイッチ押下
    private final int WAIT_REFUEL = 11;         //給油待ち
    private final int LEVER_OPEN = 12;          //給油中レバー閉
    private final int LEVER_CLOSE = 13;         //給油中レバー閉
    private final int PAUSE_REFUEL = 14;        //給油中「停止」
 
    AnimationSet as = new AnimationSet(true);
    ObjectAnimator animator = new ObjectAnimator();
 
    //ステータス番号に応じてUIアップデートのためのハンドラ(仮)
    private Handler mStatusHandler = new Handler(new Handler.Callback() {
 
        public boolean handleMessage(@NonNull Message msg) {
 
 
            Button btn_stat;
 
            LinearLayout bg = findViewById(R.id.layout_main_background);
            GridLayout gl = findViewById(R.id.gridLayout);
            bg.setBackgroundResource(R.color.colorGrid);
            gl.setBackgroundResource(R.color.colorGrid);
            Drawable dr_nozzle = getResources().getDrawable(R.drawable.img_nozzle);
            Drawable dr_play = getResources().getDrawable(R.drawable.img_play);
            Drawable dr_pause = getResources().getDrawable(R.drawable.img_pause);
            Drawable dr_x = getResources().getDrawable(R.drawable.img_xmark);
            Drawable dr_wifi = getResources().getDrawable(R.drawable.img_wifi_s);
            Drawable dr_exclaim = getResources().getDrawable(R.drawable.img_exclaim);
 
            dr_nozzle.setBounds(0,0,
                    (int)(dr_nozzle.getIntrinsicWidth()*0.5),(int)(dr_nozzle.getIntrinsicHeight()*0.5));
            dr_play.setBounds(0,0,
                    (int)(dr_play.getIntrinsicWidth()*0.5) , (int)(dr_play.getIntrinsicHeight()*0.5));
            dr_pause.setBounds(0,0,
                    (int)(dr_play.getIntrinsicWidth()*0.5) , (int)(dr_play.getIntrinsicHeight()*0.5));
            dr_x.setBounds(0,0,
                    (int)(dr_play.getIntrinsicWidth()*0.5) , (int)(dr_play.getIntrinsicHeight()*0.5));
            dr_wifi.setBounds(0,0,
                    (int)(dr_play.getIntrinsicWidth()*0.2) , (int)(dr_play.getIntrinsicHeight()*0.2));
            dr_exclaim.setBounds(0,0,
                    (int)(dr_play.getIntrinsicWidth()*0.5) , (int)(dr_play.getIntrinsicHeight()*0.5));
 
            switch (msg.what){
                case NOZZLE_ONLY:   //設定のみ/ノズル外しのみ
                    btn_stat = positionToBtn(String.valueOf(msg.arg2));
                    btn_stat.clearAnimation();
                    btn_stat.setBackground(getDrawable(R.drawable.img_point_default));
                    btn_stat.setCompoundDrawables(nullnull, dr_nozzle, null);
                    break;
 
                case WAIT_PERMIT:   //許可待ち
                    btn_stat = positionToBtn(String.valueOf(msg.arg2));
                    btn_stat.setBackground(getDrawable(R.drawable.img_point_green));
                    btn_stat.setCompoundDrawables(nullnull, dr_nozzle, null);
                    btn_stat.clearAnimation();
                /*  animator = ObjectAnimator.ofFloat(btn_stat, "alpha", 1f,0f);
                    animator.setTarget(btn_stat);
                    animator.setDuration(500);
                    animator.setInterpolator(new LinearInterpolator());
                    animator.setRepeatMode(ValueAnimator.REVERSE);
                    animator.setRepeatCount(ValueAnimator.INFINITE);
                    animator.start();*/
 
                    Animation animation = new AlphaAnimation(0.0f, 1.0f);
                    animation.setDuration(500);
                    animation.setRepeatMode(Animation.REVERSE);
                    animation.setRepeatCount(Animation.INFINITE);
                    Log.i("animator.isStarted()"String.valueOf(animator.isStarted()));
                    as.addAnimation(animation);
                    btn_stat.startAnimation(animation);
 
                    if(animator.isStarted()) {
                        as.setStartTime(animator.getCurrentPlayTime());
                        //as.setDuration(animator.getDuration());
                        as.addAnimation(animation);
                       // animator.setDuration(as.getDuration());
                        animator.start();
                        as.start();
                    }
 
 
                    break;
 
                case WAIT_REFUEL:   //給油待ち
                    btn_stat = positionToBtn(String.valueOf(msg.arg2));
                    btn_stat.clearAnimation();
                    btn_stat.setBackground(getDrawable(R.drawable.img_point_green));
                    btn_stat.setCompoundDrawables(nullnull,dr_pause , null); //buttonテキストの右にicon挿入
                    break;
 
                case LEVER_OPEN:    //給油中レバー閉
                    btn_stat = positionToBtn(String.valueOf(msg.arg2));
                    btn_stat.clearAnimation();
                    btn_stat.setBackground(getDrawable(R.drawable.img_point_green));
                    btn_stat.setCompoundDrawables(nullnull,dr_play , null);
                    //Animation
                    animator = ObjectAnimator.ofPropertyValuesHolder(dr_play, PropertyValuesHolder.ofInt("alpha"0,255));
                    animator.setTarget(dr_play);
                    animator.setDuration(500);
                    animator.setInterpolator(new LinearInterpolator());
                    animator.setRepeatMode(ValueAnimator.REVERSE);
                    animator.setRepeatCount(ValueAnimator.INFINITE);
                    animator.start();
 
                    as.setStartTime(animator.getCurrentPlayTime());
                  //  as.setDuration(animator.getDuration());
                    as.start();
                    break;
cs

해결.

그런데 duration값이 같음에도 속도차가 있다. 

'Android' 카테고리의 다른 글

Fragment  (0) 2020.07.21
デバック方法  (0) 2020.07.21
멀티스레딩 이슈 - Atomic  (0) 2020.07.15
2차 작성(파싱함수 수정)  (0) 2020.07.15
1차 작성  (0) 2020.07.10

댓글