如何通过 Canvas DrawBitmap 绘制位图的一部分

How to Draw Portion of Bitmap via Canvas DrawBitmap

我有一个
:

  1. FrameLayout(标红)
  2. 来源 ImageView(黑色)
  3. 带有 OnTouchListener(橙色)的对象(图像视图)

通过带有 OnTouchListener 的 Object,我想显示在 imageview 上填充的位图的一部分(source imageview)。

所以这不是问题,我是这样做的:
Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);

其中

  1. SourceBitmap - 是添加到源 ImageView 的图像
  2. event.getX() / event.getY() 是一个坐标,我开始绘制部分位图
  3. 250,250 - 它是部分位图 (part) 的大小。

结果是:

所以问题出现了,当我的对象(带有触摸监听器)去边界(我已经为 orange 对象设置了这个可能性,去 out 与 Object.width()/2) 的边框。

所以在这种情况下:

我怎样才能达到这个结果:

其中部分结果将是:

  1. 部分位图
  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 的位图,那么结果是可以预见的。要实现您的目标,您需要:

  1. 橙色方块坐标FrameLayout中的坐标。看起来你已经有了正确的。
  2. 作为 sourceBitmap,您必须使用由 FrameLayout.draw 方法创建的 Bitmap。请注意,您的橙色方块必须不是 FrameLayout's child.

如果你 post 你的所有代码都在某处,我可以检查它。

我自己解决
复杂,但结果非常好。
我们这里 go:
所以对于我的 案例(当带有 OnTouchListener 的对象可以在 X 和 Y 轴上超出边界时),我做了 Post 条件(某种 规定 )。


条件

宽度 = imageView的宽度,我想在其中显示结果。
Height = imageView 的高度,我想在其中显示结果;

左侧

  1. X_Coord < 0 && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
    这是我们的热门区域
  2. X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
    这是我们的中区
  3. X_Coord < 0 && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
    这是我们的底部区域

右侧

  1. X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord < Bitmap.Height
    这是我们的中区
  2. X_Coord > Bitmap.Height && Y_Coord - 身高 / 2 < 0 && Y_Coord < Bitmap.Height
    这是我们的 热门区域
  3. X_Coord > Bitmap.Height && Y_Coord - 身高/2 > 0 && Y_Coord > Bitmap.Height
    这是我们的底部区域

标准(中间区域,不向左或向右)

  1. X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 身高/2 < 0 && Y_Coord < Bitmap.Height
    这是我们的 热门区域
  2. X_Coord - 宽度/2 > 0 && X_Coord < Bitmap.Width && Y_Coord - 高度/2 > 0 && Y_Coord > Bitmap.Height
    这是我们的底部区域
  3. 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 对不起我的工程师 :).