هل هناك أي طريقة للحصول على "مقلوب" مقطع مقطع للرسم في جاوة؟

StackOverflow https://stackoverflow.com/questions/1273688

  •  16-09-2019
  •  | 
  •  

سؤال

أريد أن أملأ المنطقة باستخدام الرسومات .ftroundRect ()، ولكن أريد مستطيل في منتصف ذلك ليس تم شغلها.

في الأساس، بالنظر إلى مكون من 100x30، أريد تعيين لقطة ليكون المستطيل عند 10،10 من حجم 80x10 ولكن لديك ملء الطلاء فقط المنطقة الخارج أن 80x10 مستطيل. والسبب هو أنني أريد حدود من البكسل N مع مخطط منحني رسمت دون التأثير على منطقة المكون الداخلي.

أفضل طريقة أستطيع أن أرى حتى الآن هي مقطع إلى 10،10 90x10 وقم بإجراء FillroundRect () ثم مقطع إلى 90،10 10x10 وقم بملء FillRect () لملء الجانب الأيمن، أدناه وفوق الزوايا.

إذا قمت بإعادة رسم مستطيل سطر واحد، فأنا في نهاية المطاف مع "اكتشاف" على الزوايا لأن المنحنيات لا تتاخم تماما (و / أو لأن AA تؤثر على البكسل المحيط).

تحرير: التحذير - أحتاج إلى وسيلة للقيام بذلك والتي ستعمل مع J2ME AWT (CDC مع ملف تعريف شخصي 1.1) بالإضافة إلى J2SE.


تحرير: آخر سؤال مماثل لديه إجابة كنت قادرا على التكيف. يتم نشر الرمز الذي يعمل بشكل صحيح على وضعي كإجابة ذاتية.

هل كانت مفيدة؟

المحلول

انا املك إجابة مماثلة على السؤال الآخر أيضا، وهو استخدام مضلع كقسم مائي. ربما هذا مدعوم في J2ME؟ ستحتاج إلى معرفة حدود المستطيل التي تريد استبعادها، والحدود الخارجية لمنطقة الرسم الخاصة بك.

+ ------------------- + | منطقة الرسم كليب | + --- + ----------- + | | | مستبعد | | | | المنطقة |. | | + ----------- + | | | + ------------------- +.

تحرير من OP.

هذه الإجابة عملت بالنسبة لي ويتم دعم API على J2ME. يبدو أن إجابة السؤال الآخر لها خطأ واحد - يحتاج مجموعة الإحداثيات إلى بدء نقطة على الجزء العلوي من اليسار الخارجي والأيسر من أجل إنشاء مضغوط مغلق. بلدي الرمز النهائي الذي عمل يتبع:

لإنشاء شكل لقطة، استخدمت هذه الطريقة:

static public Shape getOutsideEdge(Graphics gc, Rectangle bb, int top, int lft, int btm, int rgt) {
    int                                 ot=bb.y            , it=(ot+top);
    int                                 ol=bb.x            , il=(ol+lft);
    int                                 ob=(bb.y+bb.height), ib=(ob-btm);
    int                                 or=(bb.x+bb.width ), ir=(or-rgt);

    return new Polygon(
     new int[]{ ol, ol, or, or, ol, ol,   il, ir, ir, il, il },
     new int[]{ it, ot, ot, ob, ob, it,   it, it, ib, ib, it },
     11
     );
    }

التي قمت بضبطت في سياق الرسومات ثم ملء مستطيلي:

Rectangle tmp=new Rectangle(px,py,pw,ph);
gc.setClip(getOutsideEdge(gc,tmp,thickness,thickness,thickness,thickness));
gc.fillRoundRect(px,py,pw,ph,RADIUS,RADIUS);

ثم أنشأت وهم من الزوايا الداخلية المدورة من خلال رسم نقطة واحدة في كل ركن:

gc.setClip(px,py,pw,ph);
gc.drawLine((px   +thickness  ),(py   +thickness  ),(px   +thickness  ),(py   +thickness  ));
gc.drawLine((px+pw-thickness-1),(py   +thickness  ),(px+pw-thickness-1),(py   +thickness  ));
gc.drawLine((px   +thickness  ),(py+ph-thickness-1),(px   +thickness  ),(py+ph-thickness-1));
gc.drawLine((px+pw-thickness-1),(py+ph-thickness-1),(px+pw-thickness-1),(py+ph-thickness-1));

نصائح أخرى

يرجى التحقق من إجابتي هذه سؤال. انها تشبه جدا.

تحرير: قد ترغب في التحقق مما إذا كان Alphacomposite متاح في J2ME. في Java، يمكنك محاكاة القصاصة عن طريق تغيير الوضع المركب ألفا (لا أستطيع أن أتذكرها بالضبط Srcin لها) والطلاء على صورة مع المناطق بالأبيض والأسود. قد تريد أن تتحقق منه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top