android - Drawing transparent area not updating with drag listener -


i've seen many questions transparent background on child views custom viewgroup on so, no 1 seems have problem.

background:
created custom framelayout; container has views added dynamically. children should have transparent background, other surface of container must have background color. children views can drag'n'dropped anywhere container.

what do:
override dispatchdraw(), create bitmap , new canvas, fill new canvas white background.
make loop on children views, create new paint, rect child's dimensions , use porterduff.mode.dst_out clear child's area. each child, add paint , rect new canvas.
finally, use drawbitmap on main canvas given dispatchdraw(), passing created bitmap.

problem:
works well: children have transparent background , rest filled white background. however, when add draglistener children, "cutting" area not updated (while dispatchdraw correctly recalled): in other words, when drag child view, it's dropped transparent area still @ same place.

code:
custom framelayout:

@override public void dispatchdraw(canvas canvas) {     super.dispatchdraw(canvas);     drawcanvas(canvas); }  private void drawcanvas(canvas canvas) {     // create off-screen bitmap , canvas     bitmap bitmap = bitmap.createbitmap(getwidth(), getheight(), bitmap.config.argb_8888);     canvas auxcanvas = new canvas(bitmap);      // fill canvas desired outside color     auxcanvas.drawcolor(color.white);      // create paint each child parent     (int = 0; < getchildcount(); ++i) {         // create transparent area rect child         view child = this.getchildat(i);         paint childpaint = new paint();         childpaint.setxfermode(new porterduffxfermode(porterduff.mode.dst_out));         rect childrect = new rect(child.getleft(), child.gettop(), child.getright(), child.getbottom());         auxcanvas.drawrect(childrect, childpaint);     }      // draw bitmap original canvas     canvas.drawbitmap(bitmap, 0, 0, null); } 

the draglistener action_drop's event:

case dragevent.action_drop:     x = event.getx();     y = event.gety();      framelayout frame = (framelayout) v;     view view = (view) event.getlocalstate();     view.setx(x - (view.getwidth()/2));     view.sety(y - (view.getheight()/2));     frame.invalidate();     break; 

screenshots:

i tried many things regarding q&a found, nothing seems work.
appreciate.

finally, found clue: transparent paint isn't getting right values x , y axis after update.

i guess getleft(), gettop(), getright() , getbottom() don't change when drop occurs. weirdly, in logs, these values seem updated. instead, tried updated value in dragevent.action_drop using getx() , gety(), , changed correctly coordinates of transparent area.

the solution children in loop:

paint childpaint = new paint(); childpaint.setxfermode(new porterduffxfermode(porterduff.mode.dst_out)); // use x , y axis (plus width , height) rect childrect = new rect(     (int) child.getx(),     (int) child.gety(),     (int) child.getx() + child.getwidth(),     (int) child.gety() + child.getheight() ); auxcanvas.drawrect(childrect, childpaint); 

Comments

Popular posts from this blog

java - nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet Hibernate+SpringMVC -

sql - Postgresql tables exists, but getting "relation does not exist" when querying -

asp.net mvc - breakpoint on javascript in CSHTML? -