Подтвердить что ты не робот

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

У меня есть  условие источника:

  • FrameLayout (отмечен красным)
  • Source ImageView (черный)
  • Объект (изображение) с OnTouchListener (оранжевый)

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

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

, где:

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

и результат:

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

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

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

Любые предложения? Спасибо!

4b9b3361

Ответ 1

Решено !

Это был сложный, но результат довольно хороший.
Здесь мы go:
Итак, для моего case (когда объект с OnTouchListener может выйти из границы Оси X и Y), я создал Условия сообщения (некоторые правила).


Условия

Ширина= ширина изображения, где я хочу показать результат.
Высота= Высота изображения, где я хочу показать результат;

LeftSide

  • 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
    Это наша Нижняя область.

RightSide

  • 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 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 all!
        }

        //do the same for other  condition....etc
        break;
}



   return true;
}

Наслаждайтесь!

PS Извините за мой eng:).

Ответ 2

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

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

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