Страницы

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

воскресенье, 15 марта 2020 г.

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

#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; }

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

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