0

我有两种颜色的ImageView源代码。我想触摸一个颜色并显示一条消息。我也做了以下但事情并不顺利,因为也许我用getDrawingCache它具有上显示正确的消息延迟的方法..如何使用Android中的触摸事件从像素获取ImageView的颜色

@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

回答

1

如果是ImageView,您可以简单地从BitmapDrawable的位图获取像素值,但您可能必须对ImageView的帐户进行X/Y事件投影scaleType。如果位图与视图尺寸不完全相同,则需要重新计算在某个位置点击。对于fitCenter最简单的投影将沿着线的东西:

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

此外,如果它只是一个最后你可以只创建两个单独的观点有两个独立的onClick听众易于处理选择两种颜色的问题。

+0

事件x/Y的投影是什么意思? –

+0

更新了答案 – TWiStErRob