جلسه هشتم برنامه نویسی موبایل

در J2ME, JAVA ME, برنامه نویسی موبایل

بعد از مدت های خیلی خیلی طولاتی سلاااام.

اینکه آدم بعد از تقریباً یه سال سری به وبلاگش بزنه و ببینه که خیلی وقته توش مطلب نزاشته آدمو می بره تو فکر که نکنه یه جای کار می لنگه؟

بله مطمئناً یه جای کار می لنگه ،از لنگیدن بگذریم به این نتیجه می رسیم که برای نوشتن فقط وقت خالی داشتن کافی نیست ، از اون مهم تر ذهن آزاده.شاید یه سری افراد بتونن با ذهن درگیر هم همه کار کنن ولی من نه.و نکته دیگه اینکه بعد یه سال به این نتیجه رسیدم که آرامش خیلی برای قوای فکر لازمه و آدمی که آرامش داره بهتر فکر می کنه. و در نهایت اینکه وقتی آدم احساس می کنی یه موضوعی مثل خاریه که تو دندون گیر کرده و آزارش میده نباس مشکل رو با میخک و دارچین و ... حل کنه بلکه باس اون خاره رو در بیاره حتی اگه یه ملت بگن اون خار طلاست.

خلاصه نه که خیلی وقت بود اینجا مطلب ننوشته بودم گفتم یه کم واستون سخنرانی کنم سبک شم :دی :دی

خب بسته دیگه اینا که همش حرف مفت بود بهتره بریم سراغ برنامه نویسی موبایل.

و اما درس جدید

در درس های قبلی با برنامه نویسی API های  سطح بالا آشنا شدیم. امروز می خواهیم برنامه نویسی با API های سطح پایین رو شروع کنیم.

API های سطح پایین  برنامه نویسی بیشتر رو می طلبند و ابزار های خاصی در اختیار ما قرار نمی دن ولی در عوض  کنترل بیشتری روی ظاهر برنامه خواهیم داشت

ولی قبل از اینکه کار با API های سطح پایین رو شروع کنیم چون از این به بعد کار های گرافیکی می خواهیم انجام بدیم بهتره با دو تا متد آشنا شیم

isColor 

از متد های کلاس Display هست و برای تشخیص رنگی بودن یا رنگی نبودن صفحه نمایش ازش استفاده می کنیم.اگه این متد true برگردونه یعنی صفحه نمایش رنگی هست در غیر این صورت سیاه سفیده.

numColors

مجدداً این هم از متد های کلاس Display هست.اگر صفحه نمایشمون رنگی باشه این متد تعداد رنگ ها رو بر می گردونه.

خب این دو تا متد رو فعلاً داشته باشید.

تا بریم سر اصل مطلب :

Canvas

این کلاس مهم ترین کلاس در برنامه نویسی سطح پایین هست. همونطور که از اسمش هم پیداست این کلاس مثل یک بوم عمل می کنه و با استفاده از اون می تونیم هر چیزی تو صفحه بکشیم یا بنویسیم.

این کلاس متد های پر کاربردی در رابطه با کار با صفحه نمایش داره که در ادامه بهش اشاره می کنیم:

 
  1. public int getWidth()
  2. public int getHeight()

از این دو تا متد برای به دست آوردن طول و عرض بوم استفاده می کنیم که طول و عرض بوم  محدوده قابل نمایش توی صفحه است

 

 
  1. public boolean hasRepeatEvents()

این دستگاه مشخص می کنه که دستگاه شما ورودی تکراری رو قبول می کنه یا نه؟ منظور از ورودی تکراری اینه که نگه داشتن یک کلید برای یک مدت خاص به عنوان تکرار حساب می شه یا نه؟ 

 

 
  1. public boolean hasPointerEvents()

بسیاری از دستگاه های همراه فقط کیبورد دارن ، خیلی هاشون هم علاوه بر کیبورد اشاره گر دارند (حالا یا لمسی یا قلمی ) اگر بخواهیم چک کنیم که گوشی مورد نظرمون اشاره گر داره یا نه از متد بالا استفاده می کنیم.

 

 

 
  1. public boolean hasPointerMotionEvents()

اگر گوشیمون از اشاره گر پشتیبانی کنه از متد بالا برای این استفاده می کنیم که تشخیص بده حرکت هم پشتیبانی میشه یا نه؟ چون ممکنه اشاره گر فقط به صورت کلیکی کار کنه و درگ و ...  پشتیبانی نشن

 

 
  1. public boolean isDoubleBuffered()

متد فوق مشخص می کنه که آیا دستگاه مورد نظر از بافر مضاعف پشتیبانی می کنه یا نه؟

بافر مضاعف یعنی چی؟ بافر مضاعف یعنی اینکه تغییرات گرافیکی قبل از اینکه روی خروجی اصلی ظاهر بشن ابتدا به یک بافر اعمال بشن و سر آخر بافر به خروجی اصلی منتقل بشه. پشتیبانی از بافر مضاعف باعث میشه گرافیک نرم تر اجرا شه و اگه دستگاهتون از بافر مضاعف پشتیبانی نکنه اون وقت احتمالاً با مشکل چشمک زدن مواجه میشید و خودتون باید یه جوری حلش کنید.

خب اینا متد های Canvas بودن.خودش پس چی؟

خود Canvas یک کلاس abstract هست و برای استفاده از اون باید یک زیر کلاس ازش بسازید.

پس بیاید حرف رو تموم کنیم و مثال رو شروع کنیم.

ابتدا یک پروژه جدید ایجاد کنید.

یک کلاس  جدید ایجاد کنید به نام  MyCanvas و کد زیر رو توش بنویسید

 

 
  1. import javax.microedition.lcdui.Canvas;
  2. import javax.microedition.lcdui.Graphics;
  3.  
  4. public class MyCanvas extends Canvas {
  5.  
  6. protected void paint(Graphics g) {
  7. //no code here!
  8. }
  9. }

خب می بنیم که فقط یک زیر کلاس از Canvas ایجاد کردیم و داخل کلاس جدید هیچ کد خاصی ننوشتیم

حالا در داخل متد startApp در MIDlet اصلی برنامه امون کد زیر رو می نویسیم:

 

 
  1. public void startApp() {
  2. Form form=new Form("Safecomp");
  3. Canvas boom=new MyCanvas();
  4.  
  5. Command exit=new Command("exit",Command.EXIT, 1);
  6. Command help=new Command("help",Command.HELP,2);
  7. form.append("Height :"+String.valueOf(boom.getHeight()));
  8. form.append("Width :"+String.valueOf(boom.getWidth()));
  9. if(Display.getDisplay(this).isColor())
  10. form.append("colorful Display :"+Display.getDisplay(this).numColors()+" colors");
  11. else
  12. form.append("grayscale");
  13. form.addCommand(exit);
  14. form.addCommand(help);
  15. Display.getDisplay(this).setCurrent(form);
  16. }

کد که نیاز به توضیح خاصی نداره. از فرم استفاده کردیم که قبلاً توضیح دادم. بعد هم از متد های Canvas برای تشخیص طول و عرض صفحه استفاده کردم و نتیجه رو توی فرم نشون دادم

بعد هم از متد های Display استفاده کردم تا رنگی بودن یا نبودن صفحه رو تشخیص بدم و در صورت رنگی بودن تعداد رنگ ها رو چاپ کردم.

این هم خروجیش:

توجه کنید که دکمه های exit و help کار نمی کنن و همینجوری تمرینی به فرم اضافه کردم.

خب تا اینجا فقط از یه سری از متد های Canvas استفاده کردیم  ولی باز هم برنامه امون یه فرمه که API سطح بالاست حالا دیگه باید واقعاً بریم سراغ Canvas.

Canvas طوریه که نمیشه اونو به فرم اضافه کرد ولی چون خودش زیر کلاس Displayable هست قابلیت اضافه کردن Command رو داره ولی هیچ ابزار سطح بالایی (مثل textfied و ...) نمیشه بهش اضافه کرد.پس وقتی تصمیم می گیرید یک صفحه رو با Canvas ایجاد کنید همه اجزای داخلش رو باید خودتون طراحی کنید. البته من الآن هرچی بگم معلوم نمیشه دقیقاً منظورم چیه و باید در عمل خودتون ببینید و آشنا بشید.

 
  1. paint(Graphics g)

این متد مهم ترین متد Canvas هست و تمام اعمال گرافیکی بر روی بوم رو باید با استفاده از این متد انجام بدید

کلاس Graphics:

از این کلاس برای انجام کار های گرافیکی از قبیل رسم خط ،نمایش عکس،نمایش متن،پر کردن اشیا و .. استفاده می کنیم.

چند از متد های این کلاس رو ببینیم و یه برنامه باهاشون بنویسیم بعد در آیند با متد های بعدی آشنا میشیم

 
  1. public void setColor(int color)
  2.  
  3. public void setColor(int red,int green,int blue)

از این متد برای تنظیم رنگ استفاده می کنیم

 

 
  1. public void drawLine(int x1,int y1,int x2,int y2)

از این متد برای رسم یک پاره خط از نقطه X1 و y1 به نقطه x2 و y2 استفاده میشه

 

 
  1. public void setStrokeStyle(int style)

از این متد برای تعیین نحوه رسم خطوط استفاده می کنیم.آرگومان این تابع می تونه Graphics.DOTTED یا Graphics.SOLID باشه

خب بریم یه کد نمونه ببینیم

ابتدا کد MyCanvas تو برنامه قبلی رو به صورت زیر تغییر می دیم :

 

 
  1. import javax.microedition.lcdui.Canvas;
  2. import javax.microedition.lcdui.Graphics;
  3.  
  4. public class MyCanvas extends Canvas {
  5.  
  6. protected void paint(Graphics g) {
  7.  
  8. g.setColor(0, 0, 100);
  9. g.fillRect(0, 0, getWidth(), getHeight());
  10. g.setColor(200, 0, 0);
  11. g.setStrokeStyle(Graphics.SOLID);
  12. g.drawLine(10, 10, 100, 10);
  13. g.setColor(0, 200, 0);
  14. g.setStrokeStyle(Graphics.DOTTED);
  15. g.drawLine(10, 20, 100, 20);
  16.  
  17. }
  18. }

خب این کد چی کار می کنه؟ ساده است.ابتدا رنگ رو روی ۱۰۰ آبی تنظیم می کنیم سپس با متد fillRect کل صفحه رو رنگ می کنیم بعد رنگ رو به 200 قرمز تغییر می دیم و نوع رسم خط رو SOLID می زاریم و سپس یه خط از نقطه ۱۰ و ۱۰ به نقطه ۱۰۰ و ۱۰ می کشیم دوباره رنگ رو عوض می کنیم و یه خط دیگه هم می کشیم

حالا تو MIDlet اصلی متد startApp رو به صورت زیر تغییر می دیم:

 

 
  1. public void startApp() {
  2. MyCanvas boom=new MyCanvas();
  3. Display.getDisplay(this).setCurrent(boom);
  4. }

خروجی برنامه به صورت زیر خواهد بود:

می بینید که دو تا خط با دو تا شیوه متفاوت موازی هم رسم شدن.

و اما متد fillRect

 

 
  1. public void fillRect(int x, int y, int width, int height)

این متد یک مستطیل تو پر از نقطه x و y واقع در گوشه بالا سمت چپ به سمت پایین و راست با طول width و ارتفاع height رسم می کنه

خب این هم درس امروز .اون هم بعد از مدت های زیاد.

 

نظرات

سلام استاد ، خیلی اتفاقی

سلام استاد ، خیلی اتفاقی امروز با سایتتون آشنا شدم و فکر کردم که سوالی که چند روزه دارم روش کار میکنم رو باهاتون مطرح کنم شاید کمکم کنید.

میخواستم بپرسم آیا امکان کپی یک String در برنامه J2ME و پیست کردن آن در خارج برنامه مثلا در Message هامون هست یا خیر.

تا اونجایی که من سرچ کردم امکان کپی و پیست در داخل برنامه وجود دارد ولی به خاج آن نیست.

لطفا من را راهنمایی کنید.

سلام باید از کلیپبورد استفاده

سلام باید از کلیپبورد استفاده کنید.

این لینک بهتون کمک می کنه :

http://www.javapractices.com/topic/TopicAction.do?Id=82

 

Are you خودتی؟ :))))

Are you خودتی؟ :))))

خودت کیه؟؟؟ :)))

خودت کیه؟؟؟ :)))