Всем привет,имеется следующее:
:
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;
}
Комментариев нет:
Отправить комментарий