Форум программистов, компьютерный форум, киберфорум
Наши страницы
Тамика
Войти
Регистрация
Восстановить пароль
Оценить эту запись

Странности с Андроидом...

Запись от Тамика размещена 23.07.2015 в 11:24
Обновил(-а) SatanaXIII 23.07.2015 в 13:07 (Странности с тегом...)

Интересный факт! Всех приглашаю к обсуждению. Ибо может я чего-то не понимаю... Решила реализовать свои ховеры(ивенты приходящие от взаимодействия девайса и стилуса). Но для начала исследовала как Андроид реализовал это всё дело. И вот нюанс... Странный нюанс.
К примеру, есть у нас вьюшка. На ней два лейаута. Красный и зелёный. Независимые, абсолютно. Но! Зеленый в два раза меньше красного и лежит под ним.
В итоге, вешаю обоим по листенеру. Перегружаю онХовер. И делаю такую штуку - если приходит ЕНТЕР(только вводим стилус на лейаут), то листенер красного вернёт тру, если любой другой ивент - фолс. Зеленый всегда возвращает тру.
Запускаю...
Лог показывает такую бяку
Кликните здесь для просмотра всего текста
~$ clear && adb logcat -c && adb logcat -v threadtime | grep --line-buffered XXXXXX | tee logcat.txt
grep: warning: GREP_OPTIONS is deprecated; please use an alias or script
09-22 19:18:15.501 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_ENTER
09-22 19:18:15.501 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.501 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_ENTER
09-22 19:18:15.501 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.521 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.521 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.531 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.531 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.551 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.551 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.571 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.571 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.581 16266 16266 D XXXXXXXXXXXXXXXXXXXX: redView.onHover --------------ACTION_HOVER_MOVE
09-22 19:18:15.581 16266 16266 D XXXXXXXXXXXXXXXXXXXX: greenView.onHover --------------ACTION_HOVER_MOVE



Отсюда сама странность - неужели андроид ховерит оба лейаута?!.. Как такое может быть? Ведь красный ответ фолс! Почему всё равно ему по новой шлётся Мув?.. По идее, красный должен был сработать только на ентер, а дальше - только зелёный...

Поясните, кто может.

Код прилагаю ниже.
Java
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
public class FirstActivity extends Activity
{
 
    CustomLayout root;
    CustomLayout redView;
    CustomLayout greenView;
 
    public class CustomLayout extends RelativeLayout
    {
 
        public CustomLayout(Context context) {
            super(context);
        }
 
    }
 
    public Handler handler;
    public boolean isHoverMove = false;
 
    public static String actionToString(int action) {
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                return "ACTION_DOWN";
            case MotionEvent.ACTION_UP:
                return "ACTION_UP";
            case MotionEvent.ACTION_CANCEL:
                return "ACTION_CANCEL";
            case MotionEvent.ACTION_OUTSIDE:
                return "ACTION_OUTSIDE";
            case MotionEvent.ACTION_MOVE:
                return "ACTION_MOVE";
            case MotionEvent.ACTION_HOVER_MOVE:
                return "ACTION_HOVER_MOVE";
            case MotionEvent.ACTION_SCROLL:
                return "ACTION_SCROLL";
            case MotionEvent.ACTION_HOVER_ENTER:
                return "ACTION_HOVER_ENTER";
            case MotionEvent.ACTION_HOVER_EXIT:
                return "ACTION_HOVER_EXIT";
        }
        int index = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        switch (action & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_POINTER_DOWN:
                return "ACTION_POINTER_DOWN(" + index + ")";
            case MotionEvent.ACTION_POINTER_UP:
                return "ACTION_POINTER_UP(" + index + ")";
            default:
                return Integer.toString(action);
        }
    }
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        handler = new Handler();
 
        root = new CustomLayout(this);
        root.setBackgroundColor(Color.BLUE);
 
        redView = new CustomLayout(this);
        redView.setBackgroundColor(Color.RED);
        greenView = new CustomLayout(this);
        greenView.setBackgroundColor(Color.GREEN);
 
        redView.setOnHoverListener(new View.OnHoverListener() {
            @Override
            public boolean onHover(View v, MotionEvent event) {
                Log.d("XXXXXXXXXXXXXXXXXXXX", "redView.onHover --------------" + actionToString(event.getAction()));
                return event.getAction() == MotionEvent.ACTION_HOVER_ENTER;
            }
        });
 
        greenView.setOnHoverListener(new View.OnHoverListener() {
             @Override
             public boolean onHover(View v, MotionEvent event) {
                 Log.d("XXXXXXXXXXXXXXXXXXXX", "greenView.onHover --------------" + actionToString(event.getAction()));
                 return true;
             }}
        );
 
        root.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.d("XXXXXXXXXXXXXXXXXXXX", "rootView.onHover --------------" + actionToString(event.getAction()));
                return true;
 
            }
        });
 
 
 
        root.addView(greenView, new LinearLayout.LayoutParams(500, 500));
        root.addView(redView, new LinearLayout.LayoutParams(1000, 1000));
        setContentView(root);
    }
}
Размещено в Без категории
Просмотров 298 Комментарии 2
Всего комментариев 2
Комментарии
  1. Старый комментарий
    не понятно что-то. все со сленгом.

    имхо, у нас есть n интерактивных элементов на экране смартфона. у каждого свой признак-цвет. каждый со своими уникальными размерами. каждый находится в своем слое.

    если нажатие пером по экрану входит в 2 элемента одновременно - тогда программно установится что вы кликнули 2 элементам. если по десяти - по десяти.

    вы же "общаетесь" с сенсорным экраном Android через драйвера. может быть из-за этого? В реальности есть просто событие клика по экрану которое определено координатами.
    Запись от tolimadokara размещена 18.08.2015 в 13:47 tolimadokara вне форума
  2. Старый комментарий
    Цитата:
    tolimadokara
    , спасибо за ответ! Вот да, уже разобралась. В моих либках рабочих всё иначе, потому поведение андроида удивило. Но всё поняла и переписала наши ховеры под андроид. )
    Запись от Тамика размещена 26.08.2015 в 14:16 Тамика вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru