الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Low-Level-API

مغلق
بدأه مجدي محمود في 26 سبتمبر 2004 · 13 رد · 4,077 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

سنتعرف في هذا الدرس على الكلاس Canvas ,,كيفية عمل الجرافيك,, والرسم داخل الشاشة,,الخطوط وانواعها وكذلك الالوان واتمني ان يكون الشرح واضح

تستخدم بكثرة لعمل الالعاب واحتوائها على اساليب مثل

showNotify() 
hideNotify() 
keyPressed() 
keyRepeated() 
keyReleased() 
pointerPressed() 
pointerDragged() 
pointerReleased() 
paint()

اولا : الالوان ,,

لتحديد اللون لجرافيك معين او شكل معين نحتاج الى الاسلوب

 Graphics.setColor(int red,int green,int blue);

فمثلا,,

setColor(255,0,0);  //احمر
setColor(0,255,0);  //اخضر
setColor(0,0,255);  //ازرق
setColor(0,0,0);  //اسود

ولكل لون قيمة تبدا من 0 الى 250 وعندما تكون قيم مختلفة فان الالوان تمزج مع بعضها حسب القيمة المعطى,

وعندما يضع الشخص جميع القيم متساوية مثل

setColor(255,255,255);// ابيض

يمكن استبدال ذلك بالاسلوب

 setGrayScale(255);

لست متواجد بشكل يومي

#2

بسم الله الرحمن الرحيم

ثانيا : كيفية عمل الجرافيك,, والرسم داخل الشاشة,,

الكلاس Canvas تحتوي على Object Graphics الذي يحتوي على الاسلوب paint-method الذي يمكن عن طريقه رسم الاشكال البسيطة

امثلة

w=Width=العرض

h=Height=الطول

وهذه رسمة توضح احداثيات الشاشة,,

C_17112004948110.6319544.jpg

drawRect(int x,int y,int w,int h);//مستطيل 
drawRoundRect(int x,int y,int w,int h,int radius);//مستطيل دائري 
drawLine(int x0,int y0,int x1,int y1);//خط بين النقطتين
drawArc(int x,int y,int width,int height,int startAngle,int ArcAngle);//**

** يقوم برسم Ellipse ليست مغلقة مثل ا لقوس ,, المقصود ب startAngle هي زاوية البداية لل Arc of a Circle بالدرجات

drawArc(110,110,80,80,45,270);

فمثلا هنا زاوية البداية 45 درجة والمقصود ب arcAngle هو زاوية قوس الدائرة بالدرجات

في المثال 270 درجة الزوايا الموجبة عكس عقارب لساعة والسالبة مع عقارب الساعة

وهناك ايضا اساليب لتعبئة الشكل بدلا من draw نكتب fill

fillRect(int x,int y,int w,int h); 
fillRoundRect(int x,int y,int w,int h,int radius);
fillArc(int x,int y,int width,int height,int startAngle,int ArcAngle);

وهناك اسلوب يتم عن طريقه عمل الجرافيك او الشكل المرسوم بشكل متقطع او غير متقطع

عن طريق اضافة Graphics.DOTTED و Graphics.SOLID

الى الاسلوب

Graphics.setStrokeStyle(Graphics.DOTTED);
Graphics.setStrokeStyle(Graphics.SOLID);

وهذا مثال يوضح لنا ما ذكرنا سابقا مع بعض الملاحظات اولا يستحسن عمل الاسلوب paint في كلاس لوحده وكذلك يجب ان يكون الكلاس مشتق من Canvas ونحتاج الى الحزمة lcdui الموجودة بها الكلاس Canvas

import javax.microedition.lcdui.*;

public class DrawingDemoCanvas extends Canvas

{
// The paint Method

public void paint(Graphics g)

{
g.setGrayScale(255);
g.fillRect(0,0,getWidth(),getHeight());
g.setGrayScale(0);
g.setStrokeStyle(Graphics.DOTTED);
g.drawLine(0,0,100,200);
g.fillRect(20,30,30,20);
//.
//.
//.
}
}

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class DrawingDemo extends MIdlet

{

public void startApp()
{
Display.getDisplay(this).setCurrent(new DrawingDemoCanvas());
}
public void pauseApp(){}
public void  destroyApp(boolean forced){}
}

تم تعديل هذه المشاركة بواسطة مجدي محمود في 17 نوفمبر 2004 في 20:48

لست متواجد بشكل يومي

#3

بسم الله الرحمن الرحيم

ساقوم بشرح اسلوبين وهمايستخدمان ضمن الاسلوب paint وهما

Graphics.drawImage(Image image,int y,int y,int align);
Graphics.drawString(String text,int x,int y,int align);

والغير واضح هنا هو align

C1_2692004855300.4106104.jpg

نلاحظ في الصورة تقسيم الشاشة ما معنى align حيث تتكون من شقين مثل

public void paint(Graphics g) {
g.drawString("www.arabteam2000-forum.com",0,0,g.TOP | g.LEFT);
}

ثالثا:الخطوط وانواعها ,,

انواع الخطوط STYLE_PLAIN,STYLE_ITALIC,STYLE_BOLD,STYLE_UNDERLINED

حجم الخط SIZE_SMALL,SIZE_MEDIUM,SIZE_LARGE

مظهر الخط FACE_SYSTEM,FACE_MONOSPACE,FACE_PROPORTIONAL

وهذا مثال لاستخدام خط ,,حجمه,, نوعه ومظهره,

g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_MEDIUM));

حيث يمكن استخدام الاتي واستخدامه مباشرة

Font font = Font.getFont(FACE_PROPORTIONAL, STYLE_BOLD, SIZE_LARGE);

g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_MEDIUM));
g.drawString("www.arabteam2000-forum.com",0,0,g.TOP | g.LEFT);

وهذا مثال يوضح ما سبق

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class graph1 extends MIDlet {

public graph1() {
}

public void startApp() {

Canvas canvas = new MyCanvas();
Display display = Display.getDisplay(this);
display.setCurrent(canvas);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
}
}

import javax.microedition.lcdui.*;

public class MyCanvas extends Canvas {

public void paint(Graphics g) {

g.setColor(0,0,0);
g.fillRect(0,0,getWidth(), getHeight());
g.setColor(255,255,255);
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,Font.SIZE_MEDIUM));
g.drawString("www.arabteam2000-forum.com",0,0,g.TOP | g.LEFT);
}
}

لست متواجد بشكل يومي

#4

شكرا على الموضوع الرائع

:D

ahabdeen.jpg

<marquee>

مش موجود بصفة دايمة للامتحانات

</marquee>

#5

بسم الله الرحمن الرحيم

ساريكم مثال لكيفية استخدام الاحداث ضمن Low-Level Events

import javax.microedition.lcdui.*;

public class llevent extends MIDlet {
Display display;
Command exit;

public llevent() {
display = Display.getDisplay(this);
}

public void destroyApp(boolean unconditional) {
}

public void pauseApp() {
System.out.println("App paused.");
}

public void startApp() {
display = Display.getDisplay(this);

Canvas canvas = new Canvas() {

private String message = "Press any key";
private int x1 = (getWidth()/2);
private int y1 = (getHeight()/2);


public void paint(Graphics g)
{


g.setColor( 255, 255, 255 );
g.fillRect( 0, 0, getWidth(), getHeight() );
g.setColor( 0, 0, 0 );
g.drawString( message, getWidth()/2, 0,g.TOP | g.HCENTER ); 

g.drawLine(x1,y1-5,x1,y1+5); 
g.drawLine(x1-5,y1,x1+5,y1); 


}

protected void keyPressed( int keyCode ){
if( keyCode == getKeyCode( FIRE ) )
{
message = "FIRE";
} else if( keyCode == getKeyCode( LEFT ) ){
message = "LEFT"; x1--;
} else if( keyCode ==getKeyCode( RIGHT ) ){
message = "RIGHT";x1++;
} else if( keyCode == getKeyCode( UP ) ){
message = "UP"; y1--;
} else if( keyCode == getKeyCode( DOWN ) ){
message = "DOWN"; y1++;
} else {
message = getKeyName( keyCode );
}


repaint();
}


};

exit = new Command("Exit", Command.STOP,1);
canvas.addCommand(exit);
canvas.setCommandListener(new CommandListener() {
public void commandAction(Command c, Displayable d) {
if(c == exit) {
notifyDestroyed();
}
else {
System.out.println("Saw the command: "+c);
}
}
});
display.setCurrent(canvas);
}
}

فان في هذا المثال يتم استخدام الازرار (2), (4), (6) (8) حيث عن طريقها يتم تحريك الاشارة + مع اظهار رسالة للاتجاه الذي يتم التحريك اليه

الاسلوب repaint يستخدم في Animation وذلك لاعادة عمل paint ولااعرف اذا الكود مش مفهوم او مفهوم والذي لم يفهمه مستعد لشرحه له

وبذلك اتمنى اني قدمت لكم معلومة او نظرة عن الجرافيك و Canvas

السلام عليكم ورحمة الله وبركاته

تم تعديل هذه المشاركة بواسطة مجدي محمود في 26 سبتمبر 2004 في 23:40

لست متواجد بشكل يومي

#6

شكرا لك ياأخ مجدي

سؤال هل بالامكان تعامل الكونفاس مع النصوص

يعني هل ممكن باستخدام الكونفاس عرض الصفحات التي تحتوي

على نصوص طويلة صفحة صفحة بدلا من سطر سطر

تحياتي

#7

يا اخي ha98 شو علاقة صفحة صفحة بدلا من سطر سطر بالرسم والجرافيك بعدين يا اخي صفحة صفحة تستطيع عملها عن طريق عمل زر وتسميه Next وفي حالة اختياره تعمل

From fr= new Form ("........");
fr.append("...");

وتكتب ما تريد وتعرضه صفحة صفحة

لست متواجد بشكل يومي

#8

مشكور جداً على هذا الوفاء والشرح الشامل

اشتغل عندي التطبيق ولكن بعد إضافة سطر الحزمة midlet

import javax.microedition.midlet.*;
#9

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

يا أخ مجدي محمود

إذا كان ملف Canvas منفصل عن الملف الرئيسي

كيف ترسل القيم للمتغيرات ونصوص الرسائل message فيما بينهما ؟

أعتقد أنك عملت مثل هذا ولكن نريد توضيح أكثر بارك الله فيك

#10

بسم الله الرحمن الرحيم

اخ sih شكرا على مباركتك ووفقك الله

بالحقيقة لم افهم ما تقصد

اقتباس
إذا كان ملف Canvas منفصل عن الملف الرئيسي

كيف ترسل القيم للمتغيرات ونصوص الرسائل message فيما بينهما ؟

ولكن اليك هذا المثال واذا لم يكن الجواب ارجو توضيح سؤالك

مثال :

لدينا ملفان الاول MyCanvas والملف الرئيسي MyCanvasTest فاننا نستدعي الملف MyCanvas في MyCanvasTest عن طريق

MyCanvas mc= new MyCanvas();

حيث تنفذ جميع الاوامر الموجودة من MyCanvas في الملف الرئيسي MyCanvasTest

ملحوظة : يتم الفصل للتوضيح والتبسيط وايضا لاستخدام Canvas

تم تعديل هذه المشاركة بواسطة مجدي محمود في 4 أكتوبر 2004 في 13:00

لست متواجد بشكل يومي

#11
حيث تنفذ جميع الاوامر الموجودة من MyCanvas في الملف الرئيسي MyCanvasTest

شكراً على الإفادة ولكن من أجل التأكد هذا مثال :

إذا كان في الملف الرئيسي هذه العبارة :

;"String str ="Al.eslam

هل تؤخذ قيمة المتغير str مباشرة في الملف الفرعي MyCanvas بنفس اسم المتغير هكذا

;private String message = str

أو أنها تحتاج واسطة نقل ؟

#12

السلام عليكم ورحمة الله وبركاته

يا حبيبي واخي sih عندما تقوم بتعريف متغير في الملف الفرعي فانك ستقوم باستخدامه في احد الاساليب والاساليب تقوم باستدعائها بالملف الرئيسي وبالتالي استخدام المتغيرات بشكل غير مباشر واذا اردت ان تعمل برنامج او عملت برنامج وواجهتك مشاكل فضعه هنا او ارسله كرسالة خاصه (اذا كنت تريد ان لايراه احد)وساساعدك باذن الله او اذا اردت

لا تقوم بالفصل اذا وجدت في ذلك سهولة وقم بعمل كما في الملف llevent

لست متواجد بشكل يومي

#13

السلام عليكم

شكرا على الموضوع الرائع

أريد السؤال عن كيفية رسم نقطة

بحثت و لكن لم أجد؟؟؟

و شكرا لتعاونكم

#14

السلام عليكم

أنا بحاجة لهذه التعليمة

لأنني أحاول صنع برنامج لرسم الدوال الرياضية

حاولت الاحتيال على الموضوع برسم مستطيل x,y

طوله و عرضه 1 لكن لم أفلح

و شكرا لكم

هذا الموضوع مغلق.

مواضيع مشابهة