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
-~----------~----~----~----~------~----~------~--~---

Reply via email to