点游戏失败,无法正确识别和绘制图像周围的点

时间:2015-07-21 11:55:00

标签: java android image-processing android-custom-view dimensions

我想要实现的是在与图像中已存在的黑点完全相同的位置绘制点,但是我必须面对图像的问题:

  1. 图像可以在多个屏幕中更改其密度(因此没有固定大小)
  2. 鉴于图像可以是任何大小,我必须将其转换为适当的大小以显示在自定义视图上。
  3. 以及如何在自定义视图中显示图像,使其密度保持不变?
  4. 现在关于点画的问题:

    1. 如何动态识别黑点x,y轴,以在自定义视图的图像中绘制相同的黑点进行绘制。
    2. 是否有一种动态实现问题1的好方法,或者我应该硬编码点。
    3. 到目前为止我做了什么:

      1. 我已将所有图片移至drawable文件夹并完成layout_width = wrap_content,高度与宽度相同。

        <com.jutt.dotbot.ConnectDotsView
        android:id="@+id/gfxImage"
        android:layout_width="500dpi"
        android:layout_height="600dpi"
        android:layout_marginTop="100dip"
        android:layout_centerHorizontal="true"/>
        
      2. 我通过在ACTION_DOWN中的每个onTouchEvent上点上点来查看硬编码点,然后记下并提供给班级ConnectDotsView

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            invalidate();
            L.s(getContext(), "x = "+x+"y = "+y);
            break;
        
      3. 在我注意到所有得出的分数之后,我通过致电给这个课程提供相同的要点:

        public void setPoints(List<Point> points) {
            this.mPoints = points;
        }
        
      4. 现在最大的问题[我认为仍然存在],屏幕1152w * 720h上的(x,y)在480w * 600h上可能不一样,所以我所做的是实际的功能是谁转换这些点。

        private static final int OLDSCREENX = 1152;
        private static final int OLDSCREENY = 720;
        
        private int[] makeDimentionGeneric(float oldScreenX, float oldScreenY,
                float oldX, float oldY) {
            // get screen size
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            final float y = displaymetrics.heightPixels;
            final float x = displaymetrics.widthPixels;
            int[] i = new int[] { (int) ((oldX / oldScreenX) * x),
                    (int) ((oldY / oldScreenY) * y) };
            return i;
        }
        
      5. 我正在设置makeDimentionGeneric(OLDSCREENX, OLDSCREENY, p.x, p.y);之类的点,而p.x and p.y是来自屏幕的硬编码存储值。

        现在当我尝试在不同设备上运行时会发生什么。

        Right side is emulator and left is bluestack

        我什么时候做错了,我怎样才能正确实现?拜托,我努力学习,但似乎找不到比我提到的更好的方法。

        [更新]按要求(2015年7月21日):

        private int[] makeDimentionGeneric(float oldScreenX, float oldScreenY,
                float oldX, float oldY) {
            // convert all px to dp
            oldScreenY = convertPixelsToDp(oldScreenY, this);
            oldScreenX = convertPixelsToDp(oldScreenX,this);
            oldX = convertPixelsToDp(oldX,this);
            oldY = convertPixelsToDp(oldY,this);
        
            // get screen size
            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
            final float y = convertPixelsToDp(displaymetrics.heightPixels, this);
            final float x = convertPixelsToDp(displaymetrics.widthPixels, this);
        
            int[] i = new int[] { (int)((oldX / oldScreenX) * x),
                    (int) ((oldY / oldScreenY) * y) };
        
            return i;
        
        }
        

1 个答案:

答案 0 :(得分:1)

由于您的图像因DPI而异,因此您的像素计算也必须根据DPI而有所不同。请考虑以下问题:

Converting pixels to dp

在您的情况下(从上述问题的答案中复制)您可能想要使用此方法:

/**
 * 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 / 160f);
    return dp;
}