【问题标题】:Android move ImageView to a specific pixel colorAndroid 将 ImageView 移动到特定的像素颜色
【发布时间】:2014-05-26 01:53:07
【问题描述】:

我在 Photoshop 中制作了一张藏宝图,并制作了一张带有彩色热点的透明图像,将其放在藏宝图上,以便可以点击。

当我点击彩色圆点(不可见)时,Android 会检测到点击的颜色并按照要求执行适当的方法。

现在我有一个图像视图,这将是我的播放器,我希望它每天移动到地图上的另一个彩色热点(每个热点代表一周中的一天)。

我有这个代码,但是位置太差了:

private void moveToColor(ImageView iv, int toColor) {

    Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.hotspots);   
    int width = bm.getWidth();
    int height = bm.getHeight();
    int[] pixels = new int[width * height];
    bm.getPixels(pixels, 0, width, 0, 0, width, height);
    for (int ix = 0; ix < width; ++ix) {
        for (int iy = 0; iy < height; ++iy) {   
            if (toColor == bm.getPixel(ix, iy)) {
                iv.animate().translationX((float)ix);
                iv.animate().translationY((float)iy);
                return;
            }
        }
    }       
 }

有时它会将图像视图移动到靠近 toColor 的位置,有时它会完全关闭或什至不在地图上。

关于我如何做到这一点的任何指示。我用缓冲区 copypixelstobuffer 尝试过,但我不太了解它是如何工作的。因为上面很慢..

谢谢!

【问题讨论】:

    标签: android bitmap imageview translate-animation


    【解决方案1】:

    其实我发现如果我改变了

    Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.hotspots);   
    int width = bm.getWidth();
    int height = bm.getHeight();
    

    到这里:

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.hotspots);
    
    bm = Bitmap.createScaledBitmap(bm,size.x, size.y, true);
    int width = bm.getWidth();
    int height = bm.getHeight();
    

    size.x 和 size.y 来自哪里

    display = getWindowManager().getDefaultDisplay();
    size = new Point();
    display.getSize(size);
    

    那么这个位置就不是那么遥远了。它仍然不是我想要的完全位置,玩家位于点的底部,但至少更近了一步。

    【讨论】:

      【解决方案2】:

      确定是关闭了,仔细阅读translationX属性的描述:http://developer.android.com/reference/android/view/View.html#attr_android:translationX

      “这个值是在布局后添加到视图的左侧属性”

      它是视图左侧的相对,即它是位移,而不是绝对位置。 相反,使用

      iv.animate().x((float)ix);
      

      是孪生兄弟.y()

      【讨论】:

      • 我试过了,但效果完全一样。而且总体来说真的很慢,在加载播放器的藏宝图之前,我会看到大约 2-3 秒的白屏。我希望找到一种更有效的方法来做到这一点!
      • 嗯,缓慢可能是由于动画——你需要动画吗?
      • 至于 x() 定位 - 它不可能与 translateX() 完全相同:) 但我猜它可能仍然关闭,因为您的图像的像素位置在图像的坐标中,而 x() 在屏幕像素坐标中。这两者不相等——图像可能被缩放。另外,为了避免动画,请使用iv.setX()
      • setX 和 setY 确实解决了白屏问题。我确实对像素坐标的差异感到有些麻烦,我想是这样的,但我不知道如何获得正确的坐标。 ..
      • 要么在ImageView中显示时不缩放图像,要么使用ImageView.getScaleX/Y()获取屏幕像素/图像像素比并进行相应计算。另外,我假设您确实考虑了图像宽度? setX() 将视图定位在其 left 边缘。因此,如果您想将视图的中心放在原地,则需要减去视图的宽度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-03
      相关资源
      最近更新 更多