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

时间:2015-12-02 20:15:58

标签: android canvas bitmap border drawbitmap

我有一个  source condition

  1. FrameLayout(标有红色)
  2. 来源ImageView(黑色)
  3. 使用OnTouchListener(橙色)的对象(imageview)
  4. 使用OnTouchListener通过对象,我想显示在imageview上填充的位图的一部分(源图像视图)。

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

    其中

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

      result of first case

      所以出现问题,当我的对象(使用touchlistener)进入边界(我已经使橙色对象的这种可能性,去 out 的边界时) Object.width()/ 2)。

      所以在这种情况下:
      case #2
      我怎样才能达到这个结果:
      excepted result of case #2
      部分的结果将是:

      1. 位图的一部分
      2. 第二部分是framelayout背景的颜色。
      3. 我目前的尝试:

        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;
        }
        }
        

        有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:8)

自己解决
这是 复杂 ,但结果非常好 在这里,我们
所以对于我的 case (当OnTouchListener的对象可以超出X轴和Y轴的边界时),我已经发布条件(某种法规)。

条件

宽度 = imageView 的宽度,我想显示结果。
高度 = imageView 的高度,我想显示结果;

莱夫特赛德

  1. X_Coord &lt; 0 &amp;&amp; Y_Coord - 高度/ 2 &lt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
    这是我们的顶级区域
  2. X_Coord &lt; 0 &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
    这是我们的中区
  3. X_Coord &lt; 0 &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &gt;的 Bitmap.Height
    这是我们的底部区域
  4. RightSide

    1. X_Coord &gt; Bitmap.Height &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
      这是我们的中区
    2. X_Coord &gt; Bitmap.Height &amp;&amp; Y_Coord - 高度/ 2 &lt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
      这是我们的顶级区域
    3. X_Coord &gt; Bitmap.Height &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &gt;的 Bitmap.Height
      这是我们的底部区域
    4. Standart(中间区域,不会左侧或右侧)

      1. X_Coord - 宽度/ 2 &gt; 0 &amp;&amp; X_Coord &lt; Bitmap.Width &amp;&amp; Y_Coord - 高度/ 2 &lt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
        这是我们的顶级区域
      2. X_Coord - 宽度/ 2 &gt; 0 &amp;&amp; X_Coord &lt; Bitmap.Width &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &gt;的 Bitmap.Height
        这是我们的底部区域
      3. X_Coord - 宽度/ 2 &gt; 0 &amp;&amp; X_Coord &lt; Bitmap.Width &amp;&amp; Y_Coord - 高度/ 2 &gt; 0&amp;&amp; Y_Coord &lt;的 Bitmap.Height
        这是我们的中区
      4. 通过此&#34; 条件&#34;,我在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抱歉我的英文:)。

答案 1 :(得分:0)

如果您的sourceBitmap只是位图设置为ImageView,那么结果是可预测的。为了实现您的目标,您需要:

  1. 坐标为FrameLayout的橙色方形坐标。看起来你已经有了正确的。
  2. 作为sourceBitmap,您必须使用Bitmap方法创建的FrameLayout.draw。请注意,您的橙色方块必须不是FrameLayout's child。
  3. 如果您将所有代码发布到某处,我可以查看它。