Страницы

Поиск по вопросам

вторник, 4 июня 2019 г.

Как отрисовать часть Битмапа посредством метода DrawBitmap(Canvas)

Всем привет,имеется следующее: :
FrameLayout(отображен красным цветом) Исходный ImageView(черный) Квадричный объект(imageview) с прикрученным OnTouchListener'ом (оранжевый),он создан внутри FrameLayout'a.
Посредством Объекта с OnTouchListener"ом,я хочу показывать "часть" Битмапа,который установлен в исходный ImageView.
В общем я делаю что то подобное: Bitmap bt = Bitmap.createBitmap(sourceBitmap,event.getX(),event.getY(),250,250);
где:
SourceBitmap - изображение,которые установлено в исходный ImageView event.getX() / event.getY() координаты(квадричного объекта),с которого я начинаю рисовать "часть" Битмапа. 250250 - размеры "кусочка" Битмапа.
и полученный результат :

В общем проблема появляется,когда объект(с прикрученным OnTouchListener'ом),переходит за границу исходного ImageView(имеется такая возможность,т.е. половина длины,может уйти за границу).
Т.е. в этом случае : я ожидаю этот результат: конкретнее :
Часть битмапа. Вторая часть,это "пустота",то бишь цвет Framelayout(background).
Что я пытался на текущий момент:
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) { case MotionEvent.ACTION_MOVE:
//я хочу получить большую порцию,чем текущие координаты int CurrentX = (int)view.getX() - (view.getWidth()); int CurrentY = (int)view.getY() - (view.getHeight());
//случай когда изображение ушло за границы 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; } }
И проблема заключается в том,что результат не тот,который я ожидаю. А так же,как можно получить "результат"(прямоугольник),без исходного изображения,т.к. из за canvas.drawBitmap результат рисуется поверх оригинального изображения.


Ответ

В моем случае, а именно,когда объект с прикрученным OnTouchListener, который может уходить за границы X,Y осей,относительно исходного ImageView,я сделал специальные правила(пост условия).
Условия:
Width = Ширина ImageView,в котором я буду показывать результат. Height = Высота ImageView,в котором я буду показывать результат.
Левая cторона:
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 - 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 - это будет верхняя часть. X_Coord > Bitmap.Height && Y_Coord - Height / 2 > 0 && Y_Coord > Bitmap.Height - это будет нижняя часть.
Стандарт(средняя часть,которая не доходит краев(правой \ левой стороны) исходного ImageView):
X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 2 < 0 && Y_Coord < Bitmap.Height - это будет верхняя часть. X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 2 > 0 && Y_Coord > Bitmap.Height - это будет нижняя часть. X_Coord - Width / 2 > 0 && X_Coord < Bitmap.Width && Y_Coord - Height / 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 для красного бэкграунда Paint paint = new Paint(); paint.setStyle( Style.FILL ); paint.setColor( Color.RED ); Bitmap mBitmap = null; Canvas canvas = null;
//Наше условие if(view.getX() - Width / 2 >= SourceBitmap.getWidth() && view.getY() - Height / 2 > 0 && view.getY() + Height / 2 < SourceBitmap.getHeight()) { //Отлично! Мы зашли сюда,а это значит,что в данный момент времени, мы находимся в **Правой Стороне** и относимся к "Средней" Площади. //Теперь можно начать рисовать порцию битмапа. //Считаем наш отступ по Х int Difference = (int)((view.getX() - Width / 2 ) - SourceBitmap.getWidth(); //не забываем установить этот "отступ" mBitmap = Bitmap.createBitmap(SourceBitmap, ((int)view.getX() - Width / 2) - Difference, (int)view.getY() - Height / 2, Width,Height); canvas = new Canvas(mBitmap); //рисуем наш бэкграунд в виде прямоугольника canvas.drawRect(0,0,mBitmap.Width,mBitmap.getHeight(),paint); //рисуем порцию битмапа canvas.drawBitmap(mBitmap,new Rect(Difference, 0,mBitmap.getWidth(),mBitmap.getHeight()),new Rect(0,0,mBitmap.getWidth() - Difference,mBitmap.getHeight()),null); //на этом всем! }
//проделать такого же плана работу и для других условий. break; }

return true; }

Комментариев нет:

Отправить комментарий