我有一个应用程序,它使用图像上的坐标来固定标记。
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));
欢迎任何建议。感谢。
答案 0 :(得分:2)
解决这个问题的方法就是使用Percentage方法,详细说明给出的答案,我将展示一些简单的数学。
此计算过程需要以下值:
要计算xPercentage和yPercentage,我们将使用此公式:
xOccupation/imageWidth
yOccupation/imageHeight
获得这两个值后,您现在可以将其发送到您的服务器,并在所有类型的设备中访问相同的值,无论大小密度如何。
客户端设备需要通过执行反向公式重新计算x和y坐标。
newImageWidth*xPercentage
。newImageHeight*yPercentage
。