Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android将ImageView移动到特定像素颜色_Android_Bitmap_Imageview_Translate Animation - Fatal编程技术网

Android将ImageView移动到特定像素颜色

Android将ImageView移动到特定像素颜色,android,bitmap,imageview,translate-animation,Android,Bitmap,Imageview,Translate Animation,我在photoshop中制作了一张藏宝图,我制作了一张带有彩色热点的透明图像,放在藏宝图上,这样我就可以点击它了 当我点击彩色点(不可见)时,Android会检测到点击的颜色,并按照要求采取适当的方法 现在我有了一个imageview,它将是我的播放器,每天我都希望它移动到地图上的另一个彩色热点(每个热点代表一周中的一天) 我有这个密码,但位置太远了: private void moveToColor(ImageView iv, int toColor) { Bitmap bm = B

我在photoshop中制作了一张藏宝图,我制作了一张带有彩色热点的透明图像,放在藏宝图上,这样我就可以点击它了

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

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

我有这个密码,但位置太远了:

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;
            }
        }
    }       
 }
private void moveToColor(ImageView iv,int toColor){
位图bm=BitmapFactory.decodeResource(getResources(),R.drawable.hotspots);
int width=bm.getWidth();
int height=bm.getHeight();
int[]像素=新int[宽度*高度];
获取像素(像素,0,宽度,0,0,宽度,高度);
对于(int-ix=0;ix
有时它会将imageview移动到接近toColor的位置,而有时它会完全关闭,甚至不在地图上

任何关于我如何做到这一点的建议。我用缓冲区copypixelstobuffer试过,但我不太明白它是如何工作的。因为上面的速度很慢


谢谢

确保它已关闭,请仔细阅读
translationX
属性的说明:

“此值将在布局后添加到视图的左侧属性”

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

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

是双胞胎兄弟我发现如果我改变了

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();
尺寸x和尺寸y来自哪里

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

那么位置就不远了。它仍然不完全在我想要的地方,播放器位于点的底部,但至少离我更近了一步。

我试过了,但效果完全一样。总的来说,它真的很慢,在装载玩家的藏宝图之前,我看到一个白色的屏幕大约2-3秒。我希望找到一个更有效的方法来做到这一点!速度慢可能是因为动画的缘故——你需要动画吗?至于x()定位——它不可能与translateX()完全相同:),但我猜它可能仍然关闭,因为你的图像的像素位置在图像的坐标中,而x()在屏幕像素坐标中。这两者并不相等——图像可以缩放。另外,为了避免出现动画,请使用
iv.setX()
setX和setY来解决白屏问题。。我确实在像素坐标的差异方面遇到了一些问题,我想是这样的,但我不知道如何获得正确的坐标……要么在
ImageView
中显示时不缩放图像,要么使用
ImageView.getScaleX/Y()
获得屏幕像素/图像像素比率并进行相应计算。另外,我假设你考虑了图像的宽度
setX()
通过视图的左边缘定位视图。因此,如果要将视图的中心放在点上,则需要减去视图的宽度。