抓取屏幕以在android中显示图像

抓取屏幕以在android中显示图像,android,bitmap,android-canvas,Android,Bitmap,Android Canvas,我正在为我的任务做一个android项目。我正在尝试制作一个scratch图像应用程序,你知道,这就像是我们在屏幕上划过一层来去除阻挡层来显示图像一样。但问题是我不知道从哪里开始 我在stackoverflow的问题中搜索了与此相关的内容,但这没有帮助。 从我在那里的搜索中,我发现这个项目的线索是使用Bitmap.getPixel(intx,inty) 所以,在我看来,我必须从位图中获取像素并将其绘制到画布上。 但我不知道如何实现它? 或者有谁有更好的方法 谁能帮帮我吗?有关于这类事情或相关主题

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

我在stackoverflow的问题中搜索了与此相关的内容,但这没有帮助。 从我在那里的搜索中,我发现这个项目的线索是使用
Bitmap.getPixel(intx,inty)

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

谁能帮帮我吗?有关于这类事情或相关主题的教程吗

提前谢谢


以下是我的示例代码:

@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;
}

以下是我的项目的外观:


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

您有两个位图,“可擦除”位图和“隐藏”位图。从现有位图中删除像素是不可能的,因为Android中的位图是可用的。因此,与其从“可擦除”位图中擦除像素以显示下面的位图,不如先绘制“可擦除”位图。然后创建一个空的。循环“隐藏”位图中的所有像素,仅显示“可擦除”位图已“擦除”的位置

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事件,您将获得用户触摸屏幕的坐标。将其保存到某种映射或哈希表中,您就可以开始了。创建像素对象并将其添加到像素的全局
列表中

编辑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));
    }
  }
}
for(像素擦除像素:擦除列表)
{
//它实际上比这更复杂,因为你需要检查边界条件。
对于(int i=-SQUARE\u WIDTH/2;i
您可以免费使用三星抓取图像,但它可以从2.3操作系统版本中工作

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

上找到教程。我创建了一个名为WScrarchView的库,您可以在其中实现scratch视图,只需在布局xml中的几行即可。希望这能帮助那些仍在寻找类似解决方案的人


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

什么是指划破屏幕?像一张刮掉的乐透彩票吗?@Tim ya,像那样!你知道怎么做这样的事情吗?我认为你的想法是实现这一点的最好方法。正如你上面所说的,我需要帮助来解决这个问题。对不起,如果我要求太多,我开始android程序员。我可以再问你一次吗?我已经完成了你上面所说的,当我抓取可擦除位图时,会显示可变位图,但抓取所有图像需要一天时间,因为它只显示每个像素。你知道如何显示每轮/每平方米而不是每像素吗?谢谢你,如果我的英语不好,对不起。但是如果我必须用圆圈而不是正方形,我怎么做呢?对不起,如果再问你。我不知道怎么做。再次感谢你们,我很抱歉再次问你们。我想我已经做了足够多的工作来回答你们的问题。我不想为你写整个程序。用谷歌搜索“填充一个圆的像素”,你应该可以找到更多的信息。对不起,如果我在顶层使用位图呢?如何显示每个划痕的底层?您仍然需要在画布上绘制位图,并使像素完全透明。我不会尝试直接使用位图对象来完成它