Как использовать координаты XY для получения данных из базы данных SQLite? - PullRequest
0 голосов
/ 13 января 2020

У меня есть база данных SQLite, которая содержит xy координаты указанных c точек на изображении (Aya_No) среди других данных, я хотел бы получить информацию из базы данных, обновляя эти указанные c точки (Aya_No) на LongPress

Вот часть БД: enter image description here

Вот пример изображения: enter image description here

У меня есть удалось получить ширину и высоту экрана с помощью этого кода:

 public static int getScreenX (Context context){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(displayMetrics);
        int maxWidth = displayMetrics.widthPixels;

        return  maxWidth;
    }

    public static int getScreenY (Context context){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(displayMetrics);

        int maxHight = displayMetrics.heightPixels;

        return  maxHight;
    }

, и мне удалось получить xy OnTouchListener и передать его OnLongClickListener, используя этот код:

 view.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                x = event.getX();
                y = event.getY();
                return false;
            }
        });

        view.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                double Talorance = 25;
                double screenX = Utils.getScreenX(context);
                double screenY = Utils.getScreenY(context);

                // Adjusted x
                double xPer = x/Utils.getScreenX(context); // .315
                double adjXMin = (x - Talorance) * xPer;
                double adjXMax = (x + Talorance) * xPer;

                // Adjusted y
                double yPer = y/Utils.getScreenY(context);  //.33
                double adjYMin = (y - Talorance) * yPer;
                double adjYMax = (y + Talorance) * yPer;

                String ScreenXY = String.format("ScreenXY: (%.2f, %.2f)",screenX, screenY);
                String ClickedXY = String.format("ClickedXY: (%.2f, %.2f)",x,y);
                String AdjustedMin = String.format("AdjustedMinXY: (%.2f, %.2f)",adjXMin,adjYMin);
                String AdjustedMax = String.format("AdjustedMaxXY: (%.2f, %.2f)",adjXMax,adjYMax);
                Log.w("ScreenXY", ScreenXY);
                Log.w("ClickedXY ", ClickedXY);
                Log.w("MinXY", AdjustedMin);
                Log.w("MaxXY",AdjustedMax);

                int page = lastpage - QuranActivity.mCurrentPage;
                return true;
            }
        });

результаты последний код после longPress of Ayah 1 (обведено красным на 1-м изображении):

W/ScreenXY: ScreenXY: (1440.00, 2712.00)
W/ClickedXY: ClickedXY: (574.98, 1064.89)
W/MinXY: AdjustedMinXY: (219.60, 408.32)
W/MaxXY: AdjustedMaxXY: (239.57, 427.96)

, в то время как xy этой конкретной точки в БД равно 181, 301

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

Как я могу отрегулировать xy (для разных размеров экрана и плотности), полученный OnTouchListener, чтобы соответствовать или быть рядом с т он в БД (с некоторым допуском), чтобы получить соответствующую информацию из БД?

Я пытался использовать% от общей ширины и высоты, чтобы отрегулировать xy, как вы видели в моем коде, но результаты варьировались от размера экрана к другому и не были близко к тем в БД.

ПОЖАЛУЙСТА, ПОМОГИТЕ!

1 Ответ

1 голос
/ 16 января 2020

Решение требует некоторого анализа:

1. Получите размер экрана

public static int getScreenX (Context context){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(displayMetrics);
        int maxWidth = displayMetrics.widthPixels;

        return  maxWidth;
    }

    public static int getScreenY (Context context){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        WindowManager wm = (WindowManager) context.getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(displayMetrics);

        int maxHight = displayMetrics.heightPixels;

        return  maxHight;
    }

2. получить изображение xy

image_IV.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    x = event.getX();
                    y = event.getY();
                    view.onTouchEvent(event);
                    return true;
                }
            });

            view.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent event) {
                    return false;
                }
            });

3. рассчитать xy относительно размера экрана

double ScreenX = Utils.getScreenX(context);
double ScreenY = Utils.getScreenY(context);
double xPer = x / ScreenX;
 double yPer = y / ScreenY;

4. проделайте отличную работу по оценке размера экрана, используемого в db enter image description here

5. добавить результаты размера экрана в проект

double DBScreenX = 0;
                double DBScreenY = 0;
                if (LandScape) {
                    DBScreenX = 465;
                    DBScreenY = 280;
                } else {
                    DBScreenX = 480;
                    DBScreenY = 822;
                }

6. добавить допуск около 15dp

 public static int dpToPx(int dp) {
            return (int) (dp * Resources.getSystem().getDisplayMetrics().density);
        }
    double Talorance = Utils.dpToPx(15);

7. вычислите поправку xy и определите диапазон, используя допуск

  // X axis
                double xPer = x / ScreenX;
                double Adjustedx = xPer * DBScreenX;
                double MinX = Adjustedx - Talorance;
                double MaxX = Adjustedx + Talorance;

                // Y axis
                double yPer = y / ScreenY;
                double Adjustedy = yPer * DBScreenY;
                double MinY = Adjustedy - Talorance;
                double MaxY = Adjustedy + Talorance;

8. получить информацию из базы данных на основе заданного диапазона xy

public int getSorahNo (int page, double minX, double maxX, double minY, double maxY) {
        int sorahNo = 1000;
        open();
        Cursor c = mDatabase.rawQuery("SELECT " + Contract.QuranTable.COLUMN_SORAH + " FROM " + Contract.QuranTable.TABLE_NAME +
                " WHERE " + Contract.QuranTable.COLUMN_PAGE + " = " + page + " AND " +
                Contract.QuranTable.COLUMN_X + " BETWEEN " + minX + " AND " + maxX + " AND " +
                Contract.QuranTable.COLUMN_Y + " BETWEEN " + minY + " AND " + maxY, null);

        if (c.moveToFirst()) {
            do {
                sorahNo = c.getInt(c.getColumnIndex(Contract.QuranTable.COLUMN_SORAH));
            } while (c.moveToNext());
        }
        c.close();
        if( sorahNo == 1000){
            Log.w("getSorahNo ...", "Not successful ... Could not find Sorah based on x y" );
        } else {
            Log.w("getSorahNo ...", "is successful ... Sorah No = " + sorahNo);
        }

        close();
        return sorahNo;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...