#android #canvas #bitmap #border #drawbitmap
Всем привет,имеется следующее:
:
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() координаты(квадричного объекта),с которого я начинаю
рисовать "часть" Битмапа.
250,250 - размеры "кусочка" Битмапа.
и полученный результат :
В общем проблема появляется,когда объект(с прикрученным 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 результат рисуется поверх оригинального изображения.
Ответы
Ответ 1
В моем случае, а именно,когда объект с прикрученным 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; }
Комментариев нет:
Отправить комментарий