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)
这是我的项目的外观:

有趣的问题.我的理论计划:
你有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)
我创建了一个名为 WScrarchView 的库,您只需在布局 xml 中添加几行即可实现草稿视图。希望这可以帮助那些仍在寻找类似解决方案的人https://github.com/winsontan520/Android-WScratchView
当然,欢迎您复制代码并根据您的需求进行定制:)
| 归档时间: |
|
| 查看次数: |
4563 次 |
| 最近记录: |