当前位置:  开发笔记 > Android > 正文

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

如何解决《如何通过CanvasDrawBitmap绘制位图的一部分》经验,为你挑选了1个好方法。

我有一个
来源条件:

    FrameLayout(标有红色)

    源ImageView(黑色)

    OnTouchListener的对象(imageview)(橙色)

使用OnTouchListener 通过对象,我想显示在imageview(源图像视图)上填充的位图的一部分.

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

其中:

    SourceBitmap - 是添加到源ImageView的图像

    event.getX()/event.getY()是一个coord,我开始绘制位图的一部分

    250,250 -其部分位图(部分)的尺寸.

结果是:

第一个案件的结果

所以出现的问题,当我的对象(touchlistener),去边境(我有此可能性橙色物体,去边框与Object.width()/ 2).

所以在这种情况下:
案例#2
我怎样才能达到这个结果:
案例#2的结果除外
部分的结果将是:

    位图的一部分

    第二部分是framelayout背景的颜色.

我现在尝试的是:

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

有什么建议?谢谢!



1> XTL..:

自己解决了!
这很复杂,但结果非常好.
在这里我们:
所以对于我的情况(当OnTouchListener的对象可以走出X轴和Y轴的边界时),我已经制定了Post Conditions(某种规则).


条件

宽度 =宽度ImageView的,在这里我想显示的结果.
高度 = imageView的高度,我想要显示结果;

左边

    X_Coord < 0 && Y_Coord - Height/2 <0 && Y_Coord < Bitmap.Height
    这是我们的顶级区域.

    X_Coord < 0 && Y_Coord - Height/2 > 0 && Y_Coord < Bitmap.Height
    这是我们的中间区域.

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


右边

    X_Coord > Bitmap.Height && Y_Coord - Height/2 > 0 && Y_Coord < Bitmap.Height
    这是我们的中间区域.

    X_Coord > Bitmap.Height && Y_Coord - Height/2 <0 && Y_Coord < Bitmap.Height
    这是我们的顶级区域.

    X_Coord > Bitmap.Height && Y_Coord - Height/2 > 0 && Y_Coord > Bitmap.Height
    这是我们的底部区域.


Standart(中间区域,不会左侧或右侧)

    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对不起我的英文:).

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有