在包含位图支持的画布的Android视图上获取点的像素颜色值

16
我正在尝试找出在给定位置获取 View 上像素颜色值的最佳方法。我有三种在 View 上进行写入的方式:
  1. 使用 View.setBackgroundDrawable(...) 设置背景图像。
  2. 使用 基于位图的 CanvasCanvas.drawText(...)Canvas.drawLine(...) 等函数进行文本编写,绘制线条等操作。
  3. 通过让子对象(精灵)将内容写入传递给View的 onDraw(Canvas canvas) 方法来实现。
以下是扩展自 View 类的 onDraw() 方法:
   @Override
   public void onDraw(Canvas canvas) {
      // 1. Redraw the background image.
      super.onDraw(canvas);
      // 2. Redraw any text, lines, etc.
      canvas.drawBitmap(bitmap, 0, 0, null);
      // 3. Redraw the sprites.
      for (Sprite sprite : sprites) {
        sprite.onDraw(canvas);
      }
    }

如何最好地获取像素的颜色值,以考虑所有来源?

1个回答

30

您可以将视图加载到位图上(在完成所有绘制/精灵等操作后的某个时间点),然后从位图中获取像素颜色。

public static Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
    Canvas c = new Canvas(b);
    v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
    v.draw(c);
    return b;
}
然后在结果上使用 getPixel(x,y) 吗? http://developer.android.com/reference/android/graphics/Bitmap.html#getPixel%28int,%20int%29

1
最好使用此方法将整个视图绘制到位图上,然后检查像素并将整个位图绘制到实际的onDraw画布上。这样你就不必运行两次onDraw了。值得检查两者的效率。 - Christopher Souvey
非常感谢您的建议。我的期望是绘图比像素检查更常见。 - Ellen Spertus
这种建议的技术与我刚学到的使用buildDrawingCache/getDrawingCache相比如何? - Ellen Spertus
有没有使用getLayoutParams中的值而不是v.getWidth()和v.getHeight()的理由? - Simon Forsberg
1
v.getLayoutParams 返回 null :( - Kishore
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接