跨设备获取自定义图像视图的位置

时间:2016-02-22 12:48:53

标签: android pixel

我有一个应用程序,它使用图像上的坐标来固定标记。

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));

欢迎任何建议。感谢。

1 个答案:

答案 0 :(得分:2)

解决这个问题的方法就是使用Percentage方法,详细说明给出的答案,我将展示一些简单的数学。

此计算过程需要以下值:

  • imageWidth =图像从左到右的宽度。
  • imageHeight =图像从上到下的高度。
  • xOccupation =从左到右占用x坐标。
  • yOccupation = y坐标从顶部到底部的占用高度。

要计算xPercentage和yPercentage,我们将使用此公式:

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

获得这两个值后,您现在可以将其发送到您的服务器,并在所有类型的设备中访问相同的值,无论大小密度如何。

客户端设备需要通过执行反向公式重新计算x和y坐标。

  • new-x-coordinate = newImageWidth*xPercentage
  • new-y-coordinate = newImageHeight*yPercentage