抓屏幕以在android中显示图像

abu*_*buy 4 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;
}
Run Code Online (Sandbox Code Playgroud)

这是我的项目的外观:

布局

you*_*786 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;

}
Run Code Online (Sandbox Code Playgroud)

你必须自己填写erasedList.

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

canvas.drawBitmap(0,0,eraseableBitmap);
canvas.drawBitmap(0,0,mutableBitmap);
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

要实际确定用户尝试擦除哪些像素:在视图中,捕获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));
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


win*_*520 5

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

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