0

我有两种颜色的 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

4

1 回答 1

2

如果它是 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侦听器的单独视图,以便于处理。

于 2016-05-23T14:18:13.130 回答