抓屏幕以在android中显示图像

时间:2012-06-08 03:09:04

标签: android bitmap android-canvas

我正在为我的任务开发一个android项目。我正在尝试制作一个临时图像应用程序,你知道它就像我们划伤屏幕去除阻挡层来显示图像。但问题是我不知道从哪里开始。

我在stackoverflow中搜索与此相关的问题,但这没有帮助。 从我在那里搜索,我发现这个项目的线索正在使用Bitmap.getPixel(int x, int y)

所以,在我的想法中,我必须从位图获取像素并将其绘制到画布上。 但我不知道如何实施它? 或者有人有更好的方法吗?

有人可以帮帮我吗?有关此类事物或相关主题的任何教程吗?

提前致谢!


这是我的示例代码:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    tw = w;
    th = h;
    eraseableBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    mCanvas = new Canvas(eraseableBitmap);
    Bitmap muteableBitmap = Bitmap.createBitmap(eraseableBitmap.getWidth(), eraseableBitmap.getHeight(), Bitmap.Config.ARGB_8888);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    static_x = event.getX();
    static_y = event.getY();

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        touch_start(static_x, static_y);

    } if (event.getAction() == MotionEvent.ACTION_MOVE) {
            touch_move(static_x, static_y);

    } if (event.getAction() == MotionEvent.ACTION_UP) {
            touch_up(); 
        }
    return true;
}

这是我项目的外观:

layout

4 个答案:

答案 0 :(得分:7)

有趣的问题。我的理论计划:

你有2个位图,'可擦'位图和'隐藏'位图。不能从现有位图中删除像素,因为Android中的位图是immutable。因此,不是从“可擦除”位图中擦除像素以显示下面的位图,而是首先绘制“可擦除”位图。然后创建一个空的mutable Bitmap。循环“隐藏”位图中的所有像素,仅显示“可擦除”位图已被“擦除”的位置。

Bitmap mutableBitmap = Bitmap.create(erasableBitmap.getWidth(),erasableBitmap.getHeight(), Bitmap.Config.ARGB_8888);

for(Pixel erasedPixel : erasedList)
{
  mutableBitmap.setPixel(x,y, hiddenBitmap.getPixel(erasedPixel.x, erasedPixel.y));
}

...
// in a different file
class Pixel{
  int x, y;

}

你必须自己填写擦除清单。

完成后,像这样绘制画布:

canvas.drawBitmap(0,0,eraseableBitmap);
canvas.drawBitmap(0,0,mutableBitmap);

确保首先绘制'可擦除'位图,以便用新像素绘制它。

如果您需要帮助找出如何设置已删除的像素,请在评论中告诉我,我会帮助您。

修改

要实际确定用户尝试擦除的像素:在视图中,捕获onTouch事件,您将获得用户触摸屏幕的坐标。 将其保存到某种地图或散列表中,您应该好好去。创建一个Pixel对象并将其添加到全局List像素。

编辑2

要增加“划痕”的大小,你需要做的就是有点复杂。你需要一些方法来创建一个围绕x,y点触摸的区域也算作擦除。圆形是理想的,但使用正方形会更容易。

for(Pixel erasedPixel: erasedList)
{
  //it's actually more complicated than this, since you need to check for boundary conditions.
  for(int i = -SQUARE_WIDTH/2; i < SQUARE_WIDTH/2; i++){
    for(int j = -SQUARE_WIDTH/2; j < SQUARE_WIDTH/2; j++){
      mutableBitmap.setPixel(erasedPixel.x+i, erasedPixel.y+j, hiddenBitmap.getPixel(erasedPixel.x+i, erasedPixel.y+j));
    }
  }
}

答案 1 :(得分:4)

我创建了一个库调用WScrarchView,您可以在布局xml中实现几行的临时视图。希望这可以帮助那些仍在寻找类似解决方案的人https://github.com/winsontan520/Android-WScratchView

当然,欢迎您复制代码并根据您的需求进行定制:)

答案 2 :(得分:1)

我认为最简单的解决方案是两层相互叠加(使用RelativeLayout可轻松实现)。底层将包含需要显示的任何内容。顶层是填充不透明颜色的画布。当您检测到触摸事件时,开始跟踪手指并绘制完全透明的颜色,以替换相同路径上的旧颜色。您可以在how to paint with the finger here

上找到教程

答案 3 :(得分:-1)

您可以使用samsung S-Pen SDk免费抓取图像,但它可以从 2.3 OS版本