我正在为我的任务开发一个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;
}
这是我项目的外观:
答案 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版本