I've found the key point is the path. Here are two cases: 1) Use Path.transform(Matrix) top = 150; bottom = top + resizedBitmap.getHeight(); left = 0; right = left + resizedBitmap.getWidth();
mPath = new Path(); mPath.addRect(left, top, right, bottom, Path.Direction.CCW); // this is your rect Matrix mtx = new Matrix(); mtx.setRotate(45); mPath.transform(mtx); // construct a matrix and then rotate as you wish mRgn2 = new Region(); Region clipRgn = new Region(left, top, left + bmp.getWidth()*2, top + bmp.getHeight()*2); mRgn2.setPath(mPath, clipRgn); Result: just as I described in last mail, the region is not the exact region we expect. 2) Use absolute points for the path //set path mPath.moveTo(0, 220); mPath.lineTo(69, 150); mPath.lineTo(140, 220); mPath.lineTo(69, 288); mPath.lineTo(0, 220); Region clipRgn = new Region(0, 150, 150, 300); mRgn2.setPath(mPath, clipRgn); Result: The region is what we expect I need use the former way, since it is a little hard to get four points of the rect which rotated by changed degrees. All four points value I get in the second way are got by tracing after rotation. Please help to check what's matter with Path.transform(Matrix), thanks! On Sat, Feb 21, 2009 at 4:42 PM, David Hu <vistoda...@gmail.com> wrote: > Hi, Mike > It still doesn't work for me. I've tried two use case: > 1) Pass a very large rect as the clip region------the actual result > is the outer rect, bigger than my expect region; > 2) Pass the outer rect as the clip region-----------the actual result > is smaller than the rotated bitmap region, my expect region. > > Is there still with some bugs of Region or Path? > > My expect use case, I have a ImageView with a Bitmap, after rotate 30 > degrees, the bitmap region is a rotated rect from original rect, and the > ImageView containing the bitmap is a bigger rect than the original rect. I > want to judge whether the touch point is in the bitmap region. It seems easy > to judge in the ImageView region, but I want to get the exact bitmap region > for exact judgement. That's the reason why I need use Region and Path. > > Br. > -David > > > On Sat, Feb 21, 2009 at 5:01 AM, Mike Reed <r...@google.com> wrote: > >> >> By bug, I mean I would like to relax the restriction, and allow you to >> pass null. I don't know yet when the could get in. Thus you should >> always (for now) pass in a region as the clip. It can be something >> large with no downside (i.e. -10,000, .... 10,000) >> >> On Fri, Feb 20, 2009 at 3:57 PM, David Hu <vistoda...@gmail.com> wrote: >> > Thanks for your explanation, Mike. So, if there is not a bug, I can >> pass >> > the outer rect as clip region to attain my aim, and: >> > Region rgn = new Region(); >> > (1) //----- actual result: The application will crash here with an >> > exception here >> > //------expect result : ? >> > rgn.setPath(p, null); >> > (2) //----- actual result: The region is the rect area which >> encircle >> > the rotated >> > rect, not the rotated rect itself >> > //-------expect result :? >> > rgn.setPath(p, rgn); >> > (3) //----- actual result: The region is the rect area which >> encircle >> > the rotated >> > rect, not the rotated rect itself >> > //------- expect result: The region should be a complicate >> > area, inclined rect clipped by the original rect >> > Region clipRgn = new Region(top, bottom, left, right); >> > mRgn2.setPath(p, clipRgn); >> > I'll try to use outer rect region as the clip region later, see what's >> > happen currently. Would you please tell me when this region bug can be >> > fixed? I need try to check if my project can catch up the schedule, >> > otherwise, I have to try to calculate this region by ourselves, it would >> > take more efforts. >> > >> > BR, >> > -David >> > On Fri, Feb 20, 2009 at 10:49 PM, Mike Reed <r...@google.com> wrote: >> >> >> >> Ah, that's a bug, null should be allowed. I'll see what can be done >> >> there for the future. >> >> >> >> The clip parameter is mean to be a hint to speedup turning the path >> >> into a region by restricting the result to a clipped subset of the >> >> path. For your purposes, you can just make a big rectangular region >> >> for the clip. The bounds of the path or larger. >> >> >> >> On Thu, Feb 19, 2009 at 10:22 PM, David Hu <vistoda...@gmail.com> >> wrote: >> >> > Thanks for your reply, Mike. I've tried your method, seems still >> >> > not >> >> > work yet. The second parameter of Region.setPath (clip) can't be >> null. >> >> > >> >> > >> >> > If we use null, there will be an exception happen. So I've tried >> to >> >> > use >> >> > the region I've just constructed or the original rect region, the >> area >> >> > is >> >> > still the ourter standard rect area, not the inclined rect which >> rotated >> >> > from a standard rect. Here is my code tip and possible result: >> >> > >> >> > //Calculate region >> >> > top = 150; >> >> > bottom = top + bmp.getHeight(); //bmp is a bitmap instance >> >> > left = 200; >> >> > right = left + bmp.getWidth(); >> >> > Path p = new Path(); >> >> > p.addRect(left, top, right, bottom, Path.Direction.CCW); >> >> > >> >> > // use Matrix to rotate 30 degrees >> >> > Matrix mtx = new Matrix(); >> >> > mtx.setRotate(30); >> >> > p.transform(mtx); >> >> > >> >> > Region rgn = new Region(); >> >> > (1) //----- The application will crash here with an exception >> here >> >> > rgn.setPath(p, null); >> >> > (2) //----- The region is the rect area which encircle the >> rotated >> >> > rect, not the rotated rect itself >> >> > rgn.setPath(p, rgn); >> >> > (3) //----- The region is the rect area which encircle the >> rotated >> >> > rect, not the rotated rect itself >> >> > Region clipRgn = new Region(top, bottom, left, right); >> >> > mRgn2.setPath(p, clipRgn); >> >> > BTW, I searched in android source code and www.google.com, can't >> find >> >> > any >> >> > usage of this API: >> >> > >> >> > public boolean setPath(Path path, Region clip) >> >> > >> >> > So now, my question is which clip region should I pass or any other >> way >> >> > in >> >> > order to attain my aim? Hope I've made my aim clearly. >> >> > >> >> > BR, >> >> > -David >> >> > >> >> > On Thu, Feb 19, 2009 at 11:27 PM, Mike Reed <r...@google.com> wrote: >> >> >> >> >> >> You could possibly un-rotate your touch-point by 30 degrees, and >> then >> >> >> just use the rectangle. >> >> >> >> >> >> However, you can make complex regions by first constructing a Path, >> >> >> and then calling region.setPath(...), which converts the path into a >> >> >> region. Below is pseudo sample code: >> >> >> >> >> >> Path p = new Path(); >> >> >> p.addRect(rect); // this is your rect >> >> >> p.transform(matrix); // construct a matrix and then rotate as you >> wish >> >> >> region.setPath(p, null); >> >> >> >> >> >> On Thu, Feb 19, 2009 at 5:01 AM, <vistoda...@gmail.com> wrote: >> >> >> > >> >> >> > I want to judge whether the touch point(x, y) is in a region or >> >> >> > not, the region is from a stardard rect by rotating specified >> >> >> > degrees, >> >> >> > from example, rotate 30 degrees. There is a class named Region in >> >> >> > Android, but as I researched, it just supports standard rect, is >> >> >> > there >> >> >> > any other way to judge whether a point is in an acclivitous rect? >> >> >> > How >> >> >> > to do it? >> >> >> > >> >> >> > Br, >> >> >> > -David >> >> >> > > >> >> >> > >> >> >> >> >> >> > >> >> >> >> > >> >> >> >> > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers-unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en -~----------~----~----~----~------~----~------~--~---