如何通过 Canvas DrawBitmap 绘制位图的一部分
How to Draw Portion of Bitmap via Canvas DrawBitmap
我有一个
:
- FrameLayout(标红)
- 来源 ImageView(黑色)
- 带有 OnTouchListener(橙色)的对象(图像视图)
通过带有 OnTouchListener 的 Object,我想显示在 imageview 上填充的位图的一部分(source imageview)。
所以这不是问题,我是这样做的:
Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);
其中:
- SourceBitmap - 是添加到源 ImageView 的图像
- event.getX() / event.getY() 是一个坐标,我开始绘制部分位图
- 250,250 - 它是部分位图 (part) 的大小。
结果是:
所以问题出现了,当我的对象(带有触摸监听器)去边界(我已经为 orange 对象设置了这个可能性,去 out 与 Object.width()/2) 的边框。
所以在这种情况下:
我怎样才能达到这个结果:
其中部分结果将是:
- 部分位图
- 第二部分是框架布局背景的颜色。
我目前尝试的是:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//i want to draw bigger portion then corrds
int CurrentX = (int)view.getX() - (view.getWidth());
int CurrentY = (int)view.getY() - (view.getHeight());
//case,when object is going out of border
if(CurrentX <= 0)
{
Paint paint = new Paint();
paint.setStyle( Style.FILL );
paint.setColor( Color.RED );
mBitmap = Bitmap.CreateBitmap(sourceBitmap,(int)view.getX() + Math.abs(CurrentX),(int)view.getY(),250,250);
Canvas canvas = new Canvas(mBitmap);
canvas.drawBitmap(mBitmap,new Rect((int)view.getX()+Math.abs(CurrentX), (int)view.getY(),250-Math.abs(CurrentX),250),new RectF(Math.abs(CurrentX), 0, 250,250),paint);
}
break;
}
return true;
}
}
有什么建议吗?谢谢!
如果您的 sourceBitmap
只是设置为 ImageView
的位图,那么结果是可以预见的。要实现您的目标,您需要:
- 橙色方块坐标
FrameLayout
中的坐标。看起来你已经有了正确的。
- 作为
sourceBitmap
,您必须使用由 FrameLayout.draw
方法创建的 Bitmap
。请注意,您的橙色方块必须不是 FrameLayout's
child.
如果你 post 你的所有代码都在某处,我可以检查它。
由我自己解决!
它复杂,但结果非常好。
我们这里 go:
所以对于我的 案例(当带有 OnTouchListener 的对象可以在 X 和 Y 轴上超出边界时),我做了 Post 条件(某种 规定 )。
条件
宽度 = imageView的宽度,我想在其中显示结果。
Height = imageView 的高度,我想在其中显示结果;
左侧
- X_Coord < 0 && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
这是我们的热门区域。
- X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区。
- X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。
右侧
- X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区。
- X_Coord > Bitmap.Height && Y_Coord - 身高 / 2 < 0 && Y_Coord < Bitmap.Height
这是我们的 热门区域。
- X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。
标准(中间区域,不向左或向右)
- X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
这是我们的 热门区域。
- X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 高度/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。
- X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区.
所以通过这个“条件”,我在我的 MotionEvent.ACTION_MOVE
案例上绘制了位图的一部分。
让我们看一些例子:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int Width = ResultImgView.getWidth();
int Height = ResultImgView.getHeight();
//paint for our Red background
Paint paint = new Paint();
paint.setStyle( Style.FILL );
paint.setColor( Color.RED );
Bitmap mBitmap = null;
Canvas canvas = null;
//Our Condition
if(view.getX() - Width / 2 >= SourceBitmap.getWidth()
&& view.getY() - Height / 2 > 0 && view.getY() + Height / 2 < SourceBitmap.getHeight())
{
//Nice,we entered here. Seems that we're now located at RightSide at Middle position
//So let's draw part of bitmap.
//our margin for X coords
int Difference = (int)((view.getX() - Width / 2 ) - SourceBitmap.getWidth();
//dont forget to put margin
//BTW we're now took portion of bitmap
mBitmap = Bitmap.createBitmap(SourceBitmap, ((int)view.getX() - Width / 2) - Difference, (int)view.getY() - Height / 2, Width,Height);
canvas = new Canvas(mBitmap);
//draw rect
canvas.drawRect(0,0,mBitmap.getWidth(),mBitmap.getHeight(),paint);
//draw portion of bitmap
canvas.drawBitmap(mBitmap,new Rect(Difference, 0,mBitmap.getWidth(),mBitmap.getHeight()),new Rect(0,0,mBitmap.getWidth() - Difference,mBitmap.getHeight()),null);
//and that's all!
}
//do the same for other condition....etc
break;
}
return true;
}
尽情享受吧!
PS 对不起我的工程师 :).
我有一个
- FrameLayout(标红)
- 来源 ImageView(黑色)
- 带有 OnTouchListener(橙色)的对象(图像视图)
通过带有 OnTouchListener 的 Object,我想显示在 imageview 上填充的位图的一部分(source imageview)。
所以这不是问题,我是这样做的:
Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);
其中:
- SourceBitmap - 是添加到源 ImageView 的图像
- event.getX() / event.getY() 是一个坐标,我开始绘制部分位图
- 250,250 - 它是部分位图 (part) 的大小。
结果是:
所以问题出现了,当我的对象(带有触摸监听器)去边界(我已经为 orange 对象设置了这个可能性,去 out 与 Object.width()/2) 的边框。
所以在这种情况下:
我怎样才能达到这个结果:
其中部分结果将是:
- 部分位图
- 第二部分是框架布局背景的颜色。
我目前尝试的是:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
//i want to draw bigger portion then corrds
int CurrentX = (int)view.getX() - (view.getWidth());
int CurrentY = (int)view.getY() - (view.getHeight());
//case,when object is going out of border
if(CurrentX <= 0)
{
Paint paint = new Paint();
paint.setStyle( Style.FILL );
paint.setColor( Color.RED );
mBitmap = Bitmap.CreateBitmap(sourceBitmap,(int)view.getX() + Math.abs(CurrentX),(int)view.getY(),250,250);
Canvas canvas = new Canvas(mBitmap);
canvas.drawBitmap(mBitmap,new Rect((int)view.getX()+Math.abs(CurrentX), (int)view.getY(),250-Math.abs(CurrentX),250),new RectF(Math.abs(CurrentX), 0, 250,250),paint);
}
break;
}
return true;
}
}
有什么建议吗?谢谢!
如果您的 sourceBitmap
只是设置为 ImageView
的位图,那么结果是可以预见的。要实现您的目标,您需要:
- 橙色方块坐标
FrameLayout
中的坐标。看起来你已经有了正确的。 - 作为
sourceBitmap
,您必须使用由FrameLayout.draw
方法创建的Bitmap
。请注意,您的橙色方块必须不是FrameLayout's
child.
如果你 post 你的所有代码都在某处,我可以检查它。
由我自己解决!
它复杂,但结果非常好。
我们这里 go:
所以对于我的 案例(当带有 OnTouchListener 的对象可以在 X 和 Y 轴上超出边界时),我做了 Post 条件(某种 规定 )。
条件
宽度 = imageView的宽度,我想在其中显示结果。
Height = imageView 的高度,我想在其中显示结果;
左侧
- X_Coord < 0 && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
这是我们的热门区域。 - X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区。 - X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。
右侧
- X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区。 - X_Coord > Bitmap.Height && Y_Coord - 身高 / 2 < 0 && Y_Coord < Bitmap.Height
这是我们的 热门区域。 - X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。
标准(中间区域,不向左或向右)
- X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
这是我们的 热门区域。 - X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 高度/2 > 0 && Y_Coord > Bitmap.Height
这是我们的底部区域。 - X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
这是我们的中区.
所以通过这个“条件”,我在我的 MotionEvent.ACTION_MOVE
案例上绘制了位图的一部分。
让我们看一些例子:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
int Width = ResultImgView.getWidth();
int Height = ResultImgView.getHeight();
//paint for our Red background
Paint paint = new Paint();
paint.setStyle( Style.FILL );
paint.setColor( Color.RED );
Bitmap mBitmap = null;
Canvas canvas = null;
//Our Condition
if(view.getX() - Width / 2 >= SourceBitmap.getWidth()
&& view.getY() - Height / 2 > 0 && view.getY() + Height / 2 < SourceBitmap.getHeight())
{
//Nice,we entered here. Seems that we're now located at RightSide at Middle position
//So let's draw part of bitmap.
//our margin for X coords
int Difference = (int)((view.getX() - Width / 2 ) - SourceBitmap.getWidth();
//dont forget to put margin
//BTW we're now took portion of bitmap
mBitmap = Bitmap.createBitmap(SourceBitmap, ((int)view.getX() - Width / 2) - Difference, (int)view.getY() - Height / 2, Width,Height);
canvas = new Canvas(mBitmap);
//draw rect
canvas.drawRect(0,0,mBitmap.getWidth(),mBitmap.getHeight(),paint);
//draw portion of bitmap
canvas.drawBitmap(mBitmap,new Rect(Difference, 0,mBitmap.getWidth(),mBitmap.getHeight()),new Rect(0,0,mBitmap.getWidth() - Difference,mBitmap.getHeight()),null);
//and that's all!
}
//do the same for other condition....etc
break;
}
return true;
}
尽情享受吧!
PS 对不起我的工程师 :).