2016-02-22 6 views
0

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

final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onSingleTapConfirmed(MotionEvent e) { 
       if (imageView.isReady()) { 
        sCoord = imageView.viewToSourceCoord(e.getX(), e.getY()); 

        imageView.setPin(new PointF(sCoord.x,sCoord.y)); 
        Toast.makeText(getApplicationContext(), "Single tap: " + ((int) convertPixelsToDp(sCoord.x)) + ", " + ((int) convertPixelsToDp(sCoord.y)), Toast.LENGTH_SHORT).show(); 
       } else { 
        Toast.makeText(getApplicationContext(), "Something is not right!", Toast.LENGTH_SHORT).show(); 
       } 
       return true; 
      } 
     }); 

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

Я попробовал this, чтобы изменить координаты (пиксели) на блок dp, а затем привязать изображение к этой позиции, но он не работает.

/** 
* This method converts dp unit to equivalent pixels, depending on device density. 
* 
* @param dp A value in dp (density independent pixels) unit. Which we need to convert into pixels 
* @param context Context to get resources and device specific display metrics 
* @return A float value to represent px equivalent to dp depending on device density 
*/ 
public static float convertDpToPixel(float dp, Context context){ 
    Resources resources = context.getResources(); 
    DisplayMetrics metrics = resources.getDisplayMetrics(); 
    float px = dp * (metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT); 
    return px; 
} 

/** 
* This method converts device specific pixels to density independent pixels. 
* 
* @param px A value in px (pixels) unit. Which we need to convert into db 
* @param context Context to get resources and device specific display metrics 
* @return A float value to represent dp equivalent to px value 
*/ 
public static float convertPixelsToDp(float px, Context context){ 
    Resources resources = context.getResources(); 
    DisplayMetrics metrics = resources.getDisplayMetrics(); 
    float dp = px/(metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT); 
    return dp; 
} 

Предположим, у меня есть план магазина, я хочу, чтобы у стойки был маркер рядом с дверью. Поэтому я беру координату и конвертирую ее в dp, используя вышеупомянутую функцию, затем передаю это местоположение dp другому устройству и конвертирую этот dp в пиксели и используя это местоположение, чтобы привязать маркер, но он не работает. Отображение случайных местоположений.

//trying 
float x=convertDpToPixel(sCoord.x); 
float y=convertDpToPixel(sCoord.y); 
imageView.setPin(new PointF(x,y)); 

Любое предложение приветствуется. Благодарю.

ответ

2

Подход к решению этой проблемы - это просто использовать подход Percentage, чтобы разработать данный ответ. Я собираюсь показать некоторую простую математику.

Процесс этого вычисления необходимы следующие значения:

  • ImageWidth = ширина изображения от слева направо.
  • imageHeight = высота, если изображение сверху донизу.
  • xOccupation = занятый координатой x слева направо.
  • yOccupation = занимаемая высота y-координаты сверху вниз.

Для вычисления xPercentage и yPercentage мы будем использовать эту формулу:

  • xPercentage = xOccupation/imageWidth
  • yPercentage = yOccupation/imageHeight

После того, как эти 2 значения, вы сейчас готовы отправить его на ваш сервер и получить одинаковое значение на всех устройствах независимо от плотности.

Клиентское устройство требует перекомпоновать координаты x и y, выполнив обратную формулу.

  • новый-x-координата = newImageWidth*xPercentage.
  • новый-y-координата = newImageHeight*yPercentage.
+0

Да, процентный подход лучше и проще реализовать. – driftking9987

+0

все зависит от 'scaleType', который вы используете в своем« ImageView », поэтому это не универсальное решение – pskink