如何在Android中使用Touch Event从像素中获取ImageView的颜色



我有一个有两种颜色的ImageView源。我想触摸一种颜色并显示一条信息。我已经完成了以下操作,但有些事情进展不顺利,因为可能我使用了getDrawingCache方法,它在显示正确的消息时有延迟。。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView img = (ImageView) findViewById(R.id.imageView);
img.setOnTouchListener(this);
ViewTreeObserver vto = img.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
finalHeight = img.getMeasuredHeight();
finalWidth = img.getMeasuredWidth();
r = (finalHeight*0.2973)*0.8109;
centerx = finalWidth/2;
centery = finalHeight;
Log.e("hilength","Height: " + finalHeight + " Width: " + finalWidth);
img.buildDrawingCache();
bitmap = img.getDrawingCache();
return true;
}
});

我的触摸事件

@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (v.getId())
{
case R.id.imageView:
Log.d("Tag", "X,Y : " + event.getX() + "," + event.getY());
int x = (int) event.getX();
int y = (int) event.getY();
int pixel = bitmap.getPixel(x,y);
if(pixel == Color.parseColor("#94e3f9"))
{
Toast.makeText(MainActivity.this, "Blue Color", Toast.LENGTH_SHORT).show();
}
if(pixel == Color.parseColor("#f0c828"))
{
Toast.makeText(MainActivity.this, "Yellow Color", Toast.LENGTH_SHORT).show();
}
break;
}
return true;
}

除上述内容外,我不确定是否需要ViewTreeObserver

如果是ImageView,您可以简单地从BitmapDrawable的位图中获取像素值,尽管您可能需要将事件X/Y投影到ImageView的scaleType的帐户中。如果位图的大小与视图的大小不完全相同,则需要重新计算在某个位置单击。对于fitCenter来说,最简单的投影是沿着以下几条线进行的:

float ratioX = event.getX() / view.getWidth(); // downscale to 0..1
int bitmapX = (int)(ratioX * bitmap.getWidth()); // upscale to size of bitmap

此外,如果最终只是选择两种颜色的问题,那么您可以使用两个独立的onClick侦听器创建两个单独的视图,以便于处理。

最新更新