Координаты для работы на любом устройстве Android

Я хочу сделать ImageView с мультитачем. Я сделал ontouchlistener, чтобы получить координаты x и y для места касания и дать ему реакцию для каждой области. Он отлично работает на экране 1080*1960, но для 720*1276 координаты меняются, и все идет не так. Любые идеи?

ImageView

Скриншот

Часть кода

                float x = motionEvent.getX();
                float y = motionEvent.getY();

            String message = String.format("Coordinates: (%.2f, %.2f)",x,y);
            //Toast.makeText(Study.this,message,Toast.LENGTH_SHORT).show();

            //To make the image clickable by Coordinates of touch

            if (x> 179 && x< 405  && y> 37 && y< 145 ){
                Toast.makeText(Study.this,"prep",Toast.LENGTH_SHORT).show();
            }else if (x>= 405 && x < 550 && y >= 30 && y <135){
                Toast.makeText(Study.this,"1",Toast.LENGTH_SHORT).show();
            }else if (x>= 570 && x < 684 &&y >= 49 && y < 190){
                Toast.makeText(Study.this,"2",Toast.LENGTH_SHORT).show();
            }else if (x>= 675 && x < 822 &&y >= 143 && y < 315){
                Toast.makeText(Study.this,"3",Toast.LENGTH_SHORT).show();
            }else if (x>= 757 && x < 870 &&y >= 290 && y < 447){
                Toast.makeText(Study.this,"4",Toast.LENGTH_SHORT).show();
            }else if (x>= 346 && x < 686 &&y >= 760 && y < 845){
                Toast.makeText(Study.this,"1st",Toast.LENGTH_SHORT).show();
            }else if (x>= 30 && x < 240 &&y >= 460 && y < 850){
                Toast.makeText(Study.this,"2nd",Toast.LENGTH_SHORT).show();
            }else if (x>= 240 && x < 755 &&y >= 150 && y < 750) {
            }
            return false;

вам нужно будет учитывать размер и плотность пикселей дисплея ... относительные, а не абсолютные координаты.

Martin Zeitler 08.09.2018 23:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
42
1

Ответы 1

Используйте следующие строки кода, чтобы получить плотность пикселей, ширину в пикселях и высоту в пикселях экрана:

public static final double SCALE = Resources.getSystem().getDisplayMetrics().density;
public static final int WIDTH = Resources.getSystem().getDisplayMetrics().widthPixels;
public static final int HEIGHT = Resources.getSystem().getDisplayMetrics().heightPixels;

Теперь используйте эти константы в операторах if следующим образом:

if ((x > WIDTH / 2 - SCALE * 50) && (x < WIDTH / 2 + SCALE * 50)  && (Y > HEIGHT/ 2 - SCALE * 50) && (Y < HEIGHT/ 2 + SCALE * 50)){ 
    Toast.makeText(Study.this,"prep",Toast.LENGTH_SHORT).show();
}

В приведенном выше коде тост будет отображаться, если пользователь коснется квадрата шириной 100 и высотой 100, расположенного по центру экрана.

Размер и относительное положение этого квадрата будут одинаковыми на всех устройствах.

для первых строк кода AS выдает мне эту ошибку Ошибка: (32, 40) ошибка: не удается найти переменную символа Ресурсы

Mohamed Gamal 09.09.2018 00:59

@MohamedGamal Можете ли вы показать мне весь класс, в который вы вставили код? Это помогло бы мне лучше понять проблему.

Haakam Aujla 09.09.2018 18:27

@MohamedGamal Попробуйте getApplicationContext: public static final double SCALE = getApplicationContext().Resources.getSystem().getDisplayMetr‌​ics().density; public static final int WIDTH = getApplicationContext().Resources.getSystem().getDisplayMetr‌​ics().widthPixels; public static final int HEIGHT = getApplicationContext().Resources.getSystem().getDisplayMetr‌​ics().heightPixels;

Haakam Aujla 11.09.2018 14:43

@MohamedGamal извини, но я не знаю, как тебе помочь.

Haakam Aujla 12.09.2018 03:04

В любом случае спасибо за попытку :) и, кстати, я исправил это с помощью этого кода

Mohamed Gamal 12.09.2018 03:39

<код> Display display = getWindowManager (). getDefaultDisplay (); Размер точки = новая точка (); display.getSize (размер); конечная ширина int = size.x; конечный int height = size.y; float x = motionEvent.getX (); float y = motionEvent.getY (); // как я записал координаты с экрана 1080 * 1770 if (x> 179 * width / 1080 && x <405 * width / 1080 && y> 37 * height / 1770 && y <145 * height / 1770) {// год подготовки = 0; yearImageView.setImageResource (R.drawable.bprep); } <код>

Mohamed Gamal 12.09.2018 03:41

Другие вопросы по теме