У меня есть приложение, которое использует координаты на изображении для привязки маркера.Получить позицию в пользовательском режиме просмотра изображений на устройствах
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));
Любое предложение приветствуется. Благодарю.
Да, процентный подход лучше и проще реализовать. – driftking9987
все зависит от 'scaleType', который вы используете в своем« ImageView », поэтому это не универсальное решение – pskink