Как рисовать часть растрового изображения через Canvas DrawBitmap

у меня есть
Состояние источника :

  1. FrameLayout (отмечен красным)
  2. Исходный ImageView (черный)
  3. Объект (изображение) с OnTouchListener (оранжевый)

Через Object с OnTouchListener я хочу показать часть растрового изображения, которые заполняются на изображении ( исходное изображение ).

Так что это не проблема, я делаю вот так:
Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);

Где :

  1. SourceBitmap – это изображение, которое добавляется в исходный ImageView
  2. Event.getX () / event.getY () – это координата, где я начинаю рисовать часть растрового изображения
  3. 250 , 250 – размер растрового изображения части (часть).

И результат:

Результат первого случая

Таким образом, проблемы возникают, когда мой объект (с touchlistener), идущий на границу (я сделал эту возможность для оранжевого объекта, вышел за границу с Object.width () / 2).

Итак, в этом случае:
Дело № 2
Как я могу достичь этого результата:
Исключенный результат дела № 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; } } 

Какие-либо предложения? Благодаря!

Solutions Collecting From Web of "Как рисовать часть растрового изображения через Canvas DrawBitmap"

Решила сама !
Это было сложно , но результат довольно приятный.
Здесь мы идем :
Так что для моего случая (когда объект с OnTouchListener может выйти из границы Оси X и Y), я создал условия Post (какие-то правила ).


условия

Ширина = ширина изображения, где я хочу показать результат.
Height = 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 > Растровое изображение.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 Извините за мой eng :).

Если ваш sourceBitmap является только sourceBitmap , установленным в ImageView результат будет предсказуем. Для достижения своей цели вам необходимо:

  1. Оранжевые квадратные координаты в координатах FrameLayout . Похоже, у вас уже есть правильные.
  2. Как sourceBitmap вам нужно использовать Bitmap созданный вашим методом FrameLayout.draw . Обратите внимание, что ваш оранжевый квадрат не должен быть FrameLayout's .

Если вы разместите весь свой код где-нибудь, я могу проверить его.