4

我正在为我的作业开发一个 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;
}

这是我的项目的外观:

布局

4

4 回答 4

7

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

您有 2 个位图,“可擦除”位图和“隐藏”位图。无法从现有位图中擦除像素,因为 Android 中的位图是不可变的。因此,与其从“可擦除”位图中擦除像素以显示下面的位图,不如先绘制“可擦除”位图。然后创建一个空的、可变的 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));
    }
  }
}
于 2012-06-08T03:21:23.197 回答
4

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

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

于 2013-01-19T16:45:50.253 回答
1

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

于 2012-06-11T02:00:37.317 回答
-1

您可以使用 samsung S-Pen SDk免费刮擦图像,但它适用于2.3 OS 版本

于 2012-06-08T04:20:50.507 回答