نمایش عکس و کار با ImageView ، در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست تاپیک:
  1. نمایش عکس در یک activity ، در برنامه اندروید
  2. تعریف id برای ImageView در برنامه نویسی اندروید
  3. تغییر عکس یک ImageView با کدنویسی، در برنامه نویسی اندروید
  4. حذف عکس نمایش داده شده در ImageView ، با کدنویسی، در برنامه اندروید
  5. تبدیل یک عکس (Image) به حالت Drawable ، در برنامه نویسی اندروید
  6. نمایش یک عکس در ImageView ، در صورت وجود فایل عکس در فولدر drawable ، در برنامه نویسی اندروید
  7. تعیین یک عکس به عنوان پس زمینه گوشی، در برنامه نویسی اندروید
  8. نمایش یک عکس در پس زمینه یک ImageView، در برنامه نویسی اندروید
  9. ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید
  10. تعریف Uri برای یک عکس موجود در فولدرهای drawable ، در برنامه نویسی اندروید
  11. تبدیل یک عکس (image) به Bitmap ، در برنامه نویسی اندروید
  12. چرخش یک عکس (بر حسب درجه) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید
  13. به دست آوردن اندازه عرض (width) و ارتفاع (height) یک عکس، در برنامه نویسی اندروید
  14. تغییر اندازه یک عکس (تغییر اندازه عرض و ارتفاع عکس) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید
  15. برطرف کردن مشکل عدم نمایش عکس افزوده شده به فولدرهای حافظه خارجی (External storage) در گالری (gallery) گوشی، تا زمان restart شدن گوشی، در برنامه نویسی اندروید
  16. تفاوت بین Drawable و Bitmap در برنامه نویسی اندروید
  17. نمایش تعدادی عکس، با استفاده از GridView ، در برنامه نویسی اندروید
  18. خواندن یک عکس از حافظه خارجی (External Storage)، تبدیل آن به Bitmap و نمایش آن در یک ImageView ، در برنامه نویسی اندروید
  19. نمایش یک عکس از نوع Bitmap ، در یک ImageView ، با روش setImageBitmap ، در برنامه نویسی اندروید
  20. تبدیل یک عکس به آرایه ای از جنس بایت (Byte Array) (یعنی byte[]) و سپس انجام معکوس این روند و نمایش عکس حاصل در یک ImageView ، در برنامه نویسی اندروید
  21. به دست آوردن نام تمامی عکس های (منابع) موجود در پوشه های drawable پروژه اندروید، به صورت یک آرایه (Array) از جنس رشته (String)، در برنامه نویسی اندروید


منبع: kelidestan.com
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش عکس در یک activity ، در برنامه اندروید

نمایش عکس در یک activity ، در برنامه اندروید

در این آموزش، قصد داریم که یک برنامه اندروید، شامل یک activity بسازیم که در آن، یک عکس نمایش داده شود.
در برنامه eclipse ، ابتدا یک پروژه اندروید با نام Kelidestan.com بسازید (نام package را برابر com.example.kelidestan انتخاب کنید. نام activity اصلی را برابر Activity1 انتخاب کنید و فایل xml متناظر آن را هم، activity_activity1 انتخاب کنید.).
قبل از هر چیز، باید عکسی که می خواهیم در برنامه اندروید نمایش داده شود را به درون یکی از فولدرهای مخصوص عکس آن قرار بدهیم. برای این منظور، نیازی نیست که حتما فولدر را در خود ویندوز باز کرده و عکس را در آن کپی کنید، بلکه تنها کافی است که ابتدا عکس را انتخاب و copy کنید و سپس در همان نرم افزار eclipse و در فولدربندی پروژه اندروید، بر روی فولدر مورد نظر، با موس، کلیک سمت راست نموده و گزینه paste را انتخاب نمایید.
فولدری که باید عکس را در آن کپی کنیم را در شکل زیر نمایش داده ایم (چندین فولدر برای اندازه های مختلف وجود دارد، اما فعلا در این یکی کپی می کنیم) :

android-95.jpg

عکس با نام kelidestan.jpg را در فولدر مورد نظر کپی می کنیم. بنابراین آن را می توانیم به این صورت مشاهده کنیم :

android-96.jpg

اکنون فایل activity_activity1.xml را باز کرده و به صورت گرافیکی آن را مشاهده کنید. به صورت شکل زیر خواهد بود :

android-93.jpg

ابتدا بر روی TextView که در آن، عبارت hello world نوشته شده است، کلیک کرده و با زدن دکمه delete از کیبورد، آن را حذف کنید. سپس بر روی منوی Images and Media که در شکل نشان داده ایم، کلیک کنید تا گزینه های آن به صورت شکل زیر نمایش داده شود :



android-94.jpg

گزینه ImageView را با موس گرفته و به درون صفحه نمایش گرافیکی بکشید. پنجره ای به شکل زیر باز می شود :

android-97.jpg

در این پنجره، لیست عکس های موجود در فولدربندی پروژه اندروید نمایش داده شده است. بر روی نام kelidestan کلیک کرده و سپس بر روی گزینه OK کلیک می کنیم.
عکس مورد نظر، به صورت زیر نمایش داده می شود (فعلا برایمان موقعیت نمایش عکی اهمیتی ندارد و در مباحث بعدی، نکات مربوط به آن را بررسی می کنیم) :

android-98.jpg

بد نیست بدانید که چگونه می توان بعدا تعیین کنیم که یک تصویر دیگر را به جای این تصویر قرار بدهیم. ابتدا باید properties مربوط به این ImageView را باز می کنیم. برای این منظور، بر روی ImageView ، با موس، کلیک سمت راست نموده و گزینه Show In و سپس گزینه Properties را انتخاب کنید. به شکل زیر دقت کنید :

android-99.png

همان طور که مشاهده می کنید، گزینه ای با نام Src در properties وجود دارد که عکسی که باید نمایش داده شود را مشخص کرده است. بنابراین برای تغییر عکس، تنها کافی است که این گزینه را تغییر بدهید.
در ضمن، باید id این ImageView ساخته شده را نیز بدانیم. در مباحث قبلی گفتیم که id هر عنصر ساخته شده در برنامه اندروید را می توان در properties آن یافت. به شکل زیر که مربوط به properties این ImageView است دقت کنید :

android-101.png

بنابراین id این ImageView ، برابر imageView1 می باشد (البته می توانید آن را به دلخواه تغییر بدهید، اما اهمیت زیادی ندارد).
اکنون باید فایل مربوط به activity را باز کنیم. نام آن را قبلا برابر Activity1.java انتخاب نمودیم :

android-100.png

کدهای این فایل، به صورت زیر می باشند :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.example.kelidestan[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.Menu[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Activity1 [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_activity1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onCreateOptionsMenu[COLOR=#009900]([/COLOR][COLOR=#003399]Menu[/COLOR] menu[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#666666][I]// Inflate the menu; this adds items to the action bar if it is present.[/I][/COLOR]
                getMenuInflater[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]menu[/COLOR].[COLOR=#006633]activity1[/COLOR], menu[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
باید کدهای مربوط به ImageView ساخته شده را در این کدها بنویسیم. برای این منظور، کدها را به صورت زیر تکمیل می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.example.kelidestan[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.Menu[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] Activity1 [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_activity1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                iv.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]kelidestan[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onCreateOptionsMenu[COLOR=#009900]([/COLOR][COLOR=#003399]Menu[/COLOR] menu[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [COLOR=#666666][I]// Inflate the menu; this adds items to the action bar if it is present.[/I][/COLOR]
                getMenuInflater[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]inflate[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]menu[/COLOR].[COLOR=#006633]activity1[/COLOR], menu[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
حالا کدهایی که اضافه شده اند را بررسی می کنیم. قبل از هر چیز، یک package که مربوط به ImageView است را import کرده ایم (وارد کرده ایم) که کد مربوط به آن، به صورت زیر است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین کدهای زیر را نیز برای تعریف ImageView نوشته ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]kelidestan[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
برنامه اندروید آماده است و اکنون می توانید برنامه اندروید ساخته شده را با روشی دلخواه، تست کنید.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تعریف id برای ImageView در برنامه نویسی اندروید

تعریف id برای ImageView در برنامه نویسی اندروید

معمولا id یک ImageView به صورت زیر تعریف می شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]myImageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اما گاهی نیاز داریم که تعریف id برای ImageView به گونه ای باشد که بتوانیم با استفاده از رشته های (string) مورد نظرمان، id را بسازیم، تا آزادی عمل بیشتری داشته باشیم.

برای این منظور، id برای ImageView را به صورت زیر تعریف می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] imageId [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"myImageView"[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageId , [COLOR=#0000FF]"id"[/COLOR], getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
ImageView image [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین در هنگام تعریف یک عکس جدید برای ImageView نیز می توان از این روش استفاده نمود. به کدهای زیر توجه کنید، این کدها روش عادی برای تعیین id مربوط به عکسی است که می خواهیم در ImageView نمایش داده شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]myImageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]picture[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
به جای کدهای بالا، می توانیم از کدهای زیر استفاده کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]myImageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] imageName [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"picture"[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageName, [COLOR=#0000FF]"drawable"[/COLOR], getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تغییر عکس یک ImageView با کدنویسی، در برنامه نویسی اندروید

تغییر عکس یک ImageView با کدنویسی، در برنامه نویسی اندروید

همان طور که می دانید، در فایل xml متناظر با activity ، که در آن ImageView تعریف شده است، می توانیم هنگام تعریف ImageView ، عکسی را هم که در آن نمایش داده می شود، تعیین کنیم. اما گاهی نیاز داریم که عکس نمایش داده شده در ImageView را تغییر بدهیم و یا اینکه اصلا با کدنویسی، عکس مورد نظرمان برای نمایش در آن را تعیین کنیم.

فرض کنید که قبلا عکسی با نام image_1.jpg (پسوند عکس مهم نیست) را در پوشه مخصوص عکس در پروژه اندروید کپی کرده باشیم و همچنین، در فایل متناظر با activity ، یک ImageView با id برابر imageView1 تعریف کرده باشیم. اکنون برای اینکه عکس image_1.jpg در آن ImageView نمایش داده شود، باید کدهای زیر را در فایل مربوط به activity بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین با کد زیر نیز می توان این کار را انجام داد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] imageName [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"image_1"[/COLOR][COLOR=#339933];[/COLOR]                           
[COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageName,[COLOR=#0000FF]"drawable"[/COLOR],getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
حذف عکس نمایش داده شده در ImageView ، با کدنویسی، در برنامه اندروید

حذف عکس نمایش داده شده در ImageView ، با کدنویسی، در برنامه اندروید

فرض کنید در یک ImageView ، تصویری نمایش داده شده است و ما قصد داریم که با کدنویسی، در میانه های برنامه، عکس نمایش داده شده در ImageView را حذف کنیم تا دیگر در ImageView نمایش داده نشود (منظورمان از حذف تصویر، برداشتن آن از ImageView می باشد). فرض کنید که ImageView مورد نظر، دارای id با نام imageView1 باشد، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
img.[COLOR=#006633]setImageDrawable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تبدیل یک عکس (Image) به حالت Drawable ، در برنامه نویسی اندروید

تبدیل یک عکس (Image) به حالت Drawable ، در برنامه نویسی اندروید

فرض کنید عکسی با نام image_1 داریم که درون فولدرهای مخصوص عکس پروژه اندروید قرار دارد، اگر در برنامه اندروید، بخواهیم از این عکس به صورت Drawable استفاده کنیم، باید ابتدا آن را به Drawable تبدیل کنیم. برای این منظور، باید کدهای زیر را در برنامه اندروید بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Drawable d [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getDrawable[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون سایر کدهای مورد نظرمان را می توانیم برای d بنویسیم (همان عکس image_1 به صورت Drawable).
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش یک عکس در ImageView ، در صورت وجود فایل عکس در فولدر drawable ، در برنامه نویسی اندروید

نمایش یک عکس در ImageView ، در صورت وجود فایل عکس در فولدر drawable ، در برنامه نویسی اندروید

قبلا شیوه نمایش یک عکس در یک ImageView توسط کد را آموزش دادیم. گاهی نیاز داریم که بررسی کنیم که آیا یک عکس وجود دارد یا خیر و در صورت وجود داشتن در پوشه drawable ، آنگاه عکس در ImageView نمایش داده شود. برای این منظور می توانیم از ترکیب try و catch استفاده کنیم. این ترکیب، زمانی به کار می رود که یک سری دستور داریم و می خواهیم در صورتی که در هنگام اجرای آنها، خطایی رخ داد، آنگاه یک سری دستور دیگر نمایش داده شود.

با فرض اینکه ImageView دارای id با نام imageView1 باشد و نام عکس مورد نظرمان که در پوشه drawable قرار گرفته است، برابر image_1 باشد (با پسوند دلخواه، مثلا png)، آنگاه کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] imageName [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"image_1"[/COLOR][COLOR=#339933];[/COLOR]   
[B]try[/B] [COLOR=#009900]{[/COLOR]
    [COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageName,[COLOR=#0000FF]"drawable"[/COLOR],getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]Exception[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تعیین یک عکس به عنوان پس زمینه گوشی، در برنامه نویسی اندروید

تعیین یک عکس به عنوان پس زمینه گوشی، در برنامه نویسی اندروید

فرض کنید که در فولدرهای مخصوص عکس در پروژه اندروید، یک عکس با نام image_1.jpg (پسوند فایل مهم نیست) را کپی کرده باشیم و اکنون بخواهیم که این عکس به عنوان پس زمینه گوشی نمایش داده شود. برای این منظور، باید کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]WallpaperManager wpm [COLOR=#339933]=[/COLOR] WallpaperManager.[COLOR=#006633]getInstance[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[B]try[/B] [COLOR=#009900]{[/COLOR]
    wpm.[COLOR=#006633]setResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
    e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
همچنین با کد زیر نیز می توان این کار را انجام داد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] imageName [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"image_1"[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageName,[COLOR=#0000FF]"drawable"[/COLOR],getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
WallpaperManager wpm [COLOR=#339933]=[/COLOR] WallpaperManager.[COLOR=#006633]getInstance[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[B]try[/B] [COLOR=#009900]{[/COLOR]
    wpm.[COLOR=#006633]setResource[/COLOR][COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR] [B]catch[/B] [COLOR=#009900]([/COLOR][COLOR=#003399]IOException[/COLOR] e[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [COLOR=#666666][I]// TODO Auto-generated catch block[/I][/COLOR]
    e.[COLOR=#006633]printStackTrace[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
در هر دو صورت، باید کد زیر در فایل AndroidManifest.xml پروژه اندروید، قرار داده شود تا برنامه اندروید، اجازه تغییر عکس پس زمینه گوشی را داشته باشد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.SET_WALLPAPER"[/COLOR] [COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش یک عکس در پس زمینه یک ImageView، در برنامه نویسی اندروید

نمایش یک عکس در پس زمینه یک ImageView، در برنامه نویسی اندروید

زمانی که یک عکس را برای نمایش در ImageView انتخاب می کنیم، آن عکس، کل مساحت ImageView را پر نمی کند، بلکه به گونه ای در ImageView نمایش داده می شود که نسبت طول و عرض آن، حفظ شود. اگر بخواهیم که عکس، کل مساحت ImageView را پر کند، باید آن را به عنوان پس زمینه (Background) برای ImageView تعیین کنیم.فرض کنید که یک ImageView با id برابر imageView1 داریم و می خواهیم عکسی با نام image_1 (با هر پسوند دلخواه) را به عنوان پس زمینه (Background) آن تعیین کنیم، برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setBackgroundResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
به شکل زیر نیز می توان کدها را نوشت :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR] imageName [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"image_1"[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] resID [COLOR=#339933]=[/COLOR] getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]getIdentifier[/COLOR][COLOR=#009900]([/COLOR]imageName, [COLOR=#0000FF]"drawable"[/COLOR], getPackageName[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setBackgroundResource[/COLOR][COLOR=#009900]([/COLOR]resID[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

ایجاد امکان بزرگنمایی (zoom) دو انگشتی برای عکس نمایش داده شده در ImageView ، با توسعه عنصر ImageView ، در برنامه نویسی اندروید

در این مبحث، عنصر ImageView را توسعه (extend) می دهیم و یک عنصر جدید با نام TouchImageView می سازیم که ویزگی های ImageView را دارد و در عین حال، دارای قابلیت بزرگنمایی (zoom) دو انگشتی نیز می باشد.
در این پروژه اندروید، کدهای کلاس TouchImageView.java را بنده قبلا از یک سایت انگلیسی زبان گرفته بودم، اما متاسفانه آدرس آن را به خاطر ندارم که لینک منبع را ذکر کنم.
به عنوان یک مثال، پس از ساخت عنصر TouchImageView ، عکس زیر را در آن قرار می دهیم :

176.jpg

گوشی را می چرخانیم تا عکس، بهتر نمایش داده شود (بخش بیشتری از عنصر را بپوشاند) :


175.jpg

سپس با استفاده از قابلیت بزرگنمایی (zoom) دو انگشتی، بخشی از عکس را بزرگتر نمایش می دهیم :


174.jpg
پروژه اندروید را می توانید از انتهای این مبحث، دانلود نمایید.
در ادامه، بخش های مهم پروژه اندروید را شرح می دهیم.
در برنامه eclipse ، ابتدا یک پروژه اندروید با نام ImageViewZoom می سازیم (نام package را برابر com.kelidestan.imageviewzoom انتخاب می کنیم. نام Activity اصلی را برابر MainActivity انتخاب می کنیم و فایل xml متناظر آن را هم برابر activity_main قرار می دهیم).
یک عکس با نام image.jpg را در پوشه drawable-hdpi قرار می دهیم (همان عکسی که می خواهیم نمایش داده شود) :



177.jpg

همان طور که گفتیم، باید عنصر ImageView را توسعه (extend) بدهیم و یک عنصر جدید با نام دلخواه TouchImageView بسازیم. برای این منظور، یک کلاس (class) با نام TouchImageView بسازیم :


180.jpg

کدهای فایل TouchImageView.java را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageviewzoom[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.Matrix[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.PointF[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.graphics.drawable.Drawable[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.AttributeSet[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.Log[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.MotionEvent[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.ScaleGestureDetector[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] TouchImageView [B]extends[/B] ImageView [COLOR=#009900]{[/COLOR]

    Matrix matrix[COLOR=#339933];[/COLOR]

    [COLOR=#666666][I]// We can be in one of these 3 states[/I][/COLOR]
    [B]static[/B] [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] NONE [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
    [B]static[/B] [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] DRAG [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]1[/COLOR][COLOR=#339933];[/COLOR]
    [B]static[/B] [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] ZOOM [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]int[/B][/COLOR] mode [COLOR=#339933]=[/COLOR] NONE[COLOR=#339933];[/COLOR]

    [COLOR=#666666][I]// Remember some things for zooming[/I][/COLOR]
    PointF last [COLOR=#339933]=[/COLOR] [B]new[/B] PointF[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    PointF start [COLOR=#339933]=[/COLOR] [B]new[/B] PointF[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]float[/B][/COLOR] minScale [COLOR=#339933]=[/COLOR] 1f[COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]float[/B][/COLOR] maxScale [COLOR=#339933]=[/COLOR] 3f[COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] m[COLOR=#339933];[/COLOR]


    [COLOR=#000066][B]int[/B][/COLOR] viewWidth, viewHeight[COLOR=#339933];[/COLOR]
    [B]static[/B] [B]final[/B] [COLOR=#000066][B]int[/B][/COLOR] CLICK [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]3[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]float[/B][/COLOR] saveScale [COLOR=#339933]=[/COLOR] 1f[COLOR=#339933];[/COLOR]
    [B]protected[/B] [COLOR=#000066][B]float[/B][/COLOR] origWidth, origHeight[COLOR=#339933];[/COLOR]
    [COLOR=#000066][B]int[/B][/COLOR] oldMeasuredWidth, oldMeasuredHeight[COLOR=#339933];[/COLOR]


    ScaleGestureDetector mScaleDetector[COLOR=#339933];[/COLOR]

    [COLOR=#003399]Context[/COLOR] context[COLOR=#339933];[/COLOR]

    [B]public[/B] TouchImageView[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B][COLOR=#009900]([/COLOR]context[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        sharedConstructing[COLOR=#009900]([/COLOR]context[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] TouchImageView[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context, [COLOR=#003399]AttributeSet[/COLOR] attrs[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B][COLOR=#009900]([/COLOR]context, attrs[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        sharedConstructing[COLOR=#009900]([/COLOR]context[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [B]private[/B] [COLOR=#000066][B]void[/B][/COLOR] sharedConstructing[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]setClickable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [B]this[/B].[COLOR=#006633]context[/COLOR] [COLOR=#339933]=[/COLOR] context[COLOR=#339933];[/COLOR]
        mScaleDetector [COLOR=#339933]=[/COLOR] [B]new[/B] ScaleGestureDetector[COLOR=#009900]([/COLOR]context, [B]new[/B] ScaleListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        matrix [COLOR=#339933]=[/COLOR] [B]new[/B] Matrix[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        m [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#CC66CC]9[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        setImageMatrix[COLOR=#009900]([/COLOR]matrix[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        setScaleType[COLOR=#009900]([/COLOR]ScaleType.[COLOR=#006633]MATRIX[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

        setOnTouchListener[COLOR=#009900]([/COLOR][B]new[/B] OnTouchListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

            @Override
            [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onTouch[COLOR=#009900]([/COLOR][COLOR=#003399]View[/COLOR] v, MotionEvent event[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                mScaleDetector.[COLOR=#006633]onTouchEvent[/COLOR][COLOR=#009900]([/COLOR]event[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                PointF curr [COLOR=#339933]=[/COLOR] [B]new[/B] PointF[COLOR=#009900]([/COLOR]event.[COLOR=#006633]getX[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], event.[COLOR=#006633]getY[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

                [B]switch[/B] [COLOR=#009900]([/COLOR]event.[COLOR=#006633]getAction[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    [B]case[/B] MotionEvent.[COLOR=#006633]ACTION_DOWN[/COLOR][COLOR=#339933]:[/COLOR]
                        last.[COLOR=#006633]set[/COLOR][COLOR=#009900]([/COLOR]curr[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        start.[COLOR=#006633]set[/COLOR][COLOR=#009900]([/COLOR]last[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        mode [COLOR=#339933]=[/COLOR] DRAG[COLOR=#339933];[/COLOR]
                        [B]break[/B][COLOR=#339933];[/COLOR]
                        
                    [B]case[/B] MotionEvent.[COLOR=#006633]ACTION_MOVE[/COLOR][COLOR=#339933]:[/COLOR]
                        [B]if[/B] [COLOR=#009900]([/COLOR]mode [COLOR=#339933]==[/COLOR] DRAG[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                            [COLOR=#000066][B]float[/B][/COLOR] deltaX [COLOR=#339933]=[/COLOR] curr.[COLOR=#006633]x[/COLOR] [COLOR=#339933]-[/COLOR] last.[COLOR=#006633]x[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#000066][B]float[/B][/COLOR] deltaY [COLOR=#339933]=[/COLOR] curr.[COLOR=#006633]y[/COLOR] [COLOR=#339933]-[/COLOR] last.[COLOR=#006633]y[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#000066][B]float[/B][/COLOR] fixTransX [COLOR=#339933]=[/COLOR] getFixDragTrans[COLOR=#009900]([/COLOR]deltaX, viewWidth, origWidth [COLOR=#339933]*[/COLOR]saveScale[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            [COLOR=#000066][B]float[/B][/COLOR] fixTransY [COLOR=#339933]=[/COLOR] getFixDragTrans[COLOR=#009900]([/COLOR]deltaY, viewHeight, origHeight [COLOR=#339933]*[/COLOR]saveScale[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            matrix.[COLOR=#006633]postTranslate[/COLOR][COLOR=#009900]([/COLOR]fixTransX, fixTransY[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            fixTrans[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                            last.[COLOR=#006633]set[/COLOR][COLOR=#009900]([/COLOR]curr.[COLOR=#006633]x[/COLOR], curr.[COLOR=#006633]y[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#009900]}[/COLOR]
                        [B]break[/B][COLOR=#339933];[/COLOR]

                    [B]case[/B] MotionEvent.[COLOR=#006633]ACTION_UP[/COLOR][COLOR=#339933]:[/COLOR]
                        mode [COLOR=#339933]=[/COLOR] NONE[COLOR=#339933];[/COLOR]
                        [COLOR=#000066][B]int[/B][/COLOR] xDiff [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#003399]Math[/COLOR].[COLOR=#006633]abs[/COLOR][COLOR=#009900]([/COLOR]curr.[COLOR=#006633]x[/COLOR] [COLOR=#339933]-[/COLOR] start.[COLOR=#006633]x[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [COLOR=#000066][B]int[/B][/COLOR] yDiff [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#003399]Math[/COLOR].[COLOR=#006633]abs[/COLOR][COLOR=#009900]([/COLOR]curr.[COLOR=#006633]y[/COLOR] [COLOR=#339933]-[/COLOR] start.[COLOR=#006633]y[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]if[/B] [COLOR=#009900]([/COLOR]xDiff [COLOR=#339933]<[/COLOR] CLICK [COLOR=#339933]&&[/COLOR] yDiff [COLOR=#339933]<[/COLOR] CLICK[COLOR=#009900])[/COLOR]
                            performClick[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                        [B]break[/B][COLOR=#339933];[/COLOR]

                    [B]case[/B] MotionEvent.[COLOR=#006633]ACTION_POINTER_UP[/COLOR][COLOR=#339933]:[/COLOR]
                        mode [COLOR=#339933]=[/COLOR] NONE[COLOR=#339933];[/COLOR]
                        [B]break[/B][COLOR=#339933];[/COLOR]
                [COLOR=#009900]}[/COLOR]
                
                setImageMatrix[COLOR=#009900]([/COLOR]matrix[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                invalidate[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// indicate event was handled[/I][/COLOR]
            [COLOR=#009900]}[/COLOR]

        [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] setMaxZoom[COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR] x[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        maxScale [COLOR=#339933]=[/COLOR] x[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [B]private[/B] [B]class[/B] ScaleListener [B]extends[/B] ScaleGestureDetector.[COLOR=#006633]SimpleOnScaleGestureListener[/COLOR] [COLOR=#009900]{[/COLOR]
        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onScaleBegin[COLOR=#009900]([/COLOR]ScaleGestureDetector detector[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            mode [COLOR=#339933]=[/COLOR] ZOOM[COLOR=#339933];[/COLOR]
            [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        @Override
        [B]public[/B] [COLOR=#000066][B]boolean[/B][/COLOR] onScale[COLOR=#009900]([/COLOR]ScaleGestureDetector detector[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] mScaleFactor [COLOR=#339933]=[/COLOR] detector.[COLOR=#006633]getScaleFactor[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] origScale [COLOR=#339933]=[/COLOR] saveScale[COLOR=#339933];[/COLOR]
            saveScale [COLOR=#339933]*=[/COLOR] mScaleFactor[COLOR=#339933];[/COLOR]
            [B]if[/B] [COLOR=#009900]([/COLOR]saveScale [COLOR=#339933]>[/COLOR] maxScale[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                saveScale [COLOR=#339933]=[/COLOR] maxScale[COLOR=#339933];[/COLOR]
                mScaleFactor [COLOR=#339933]=[/COLOR] maxScale [COLOR=#339933]/[/COLOR] origScale[COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR] [B]else[/B] [B]if[/B] [COLOR=#009900]([/COLOR]saveScale [COLOR=#339933]<[/COLOR] minScale[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                saveScale [COLOR=#339933]=[/COLOR] minScale[COLOR=#339933];[/COLOR]
                mScaleFactor [COLOR=#339933]=[/COLOR] minScale [COLOR=#339933]/[/COLOR] origScale[COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]

            [B]if[/B] [COLOR=#009900]([/COLOR]origWidth [COLOR=#339933]*[/COLOR] saveScale [COLOR=#339933]<=[/COLOR] viewWidth [COLOR=#339933]||[/COLOR] origHeight [COLOR=#339933]*[/COLOR] saveScale [COLOR=#339933]<=[/COLOR] viewHeight[COLOR=#009900])[/COLOR]
                matrix.[COLOR=#006633]postScale[/COLOR][COLOR=#009900]([/COLOR]mScaleFactor, mScaleFactor, viewWidth [COLOR=#339933]/[/COLOR] [COLOR=#CC66CC]2[/COLOR], viewHeight [COLOR=#339933]/[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]else[/B]
                matrix.[COLOR=#006633]postScale[/COLOR][COLOR=#009900]([/COLOR]mScaleFactor, mScaleFactor, detector.[COLOR=#006633]getFocusX[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], detector.[COLOR=#006633]getFocusY[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

            fixTrans[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [COLOR=#000066][B]void[/B][/COLOR] fixTrans[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        matrix.[COLOR=#006633]getValues[/COLOR][COLOR=#009900]([/COLOR]m[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]float[/B][/COLOR] transX [COLOR=#339933]=[/COLOR] m[COLOR=#009900][[/COLOR]Matrix.[COLOR=#006633]MTRANS_X[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]float[/B][/COLOR] transY [COLOR=#339933]=[/COLOR] m[COLOR=#009900][[/COLOR]Matrix.[COLOR=#006633]MTRANS_Y[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#000066][B]float[/B][/COLOR] fixTransX [COLOR=#339933]=[/COLOR] getFixTrans[COLOR=#009900]([/COLOR]transX, viewWidth, origWidth [COLOR=#339933]*[/COLOR] saveScale[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#000066][B]float[/B][/COLOR] fixTransY [COLOR=#339933]=[/COLOR] getFixTrans[COLOR=#009900]([/COLOR]transY, viewHeight, origHeight [COLOR=#339933]*[/COLOR] saveScale[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

        [B]if[/B] [COLOR=#009900]([/COLOR]fixTransX [COLOR=#339933]!=[/COLOR] [COLOR=#CC66CC]0[/COLOR] [COLOR=#339933]||[/COLOR] fixTransY [COLOR=#339933]!=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#009900])[/COLOR]
            matrix.[COLOR=#006633]postTranslate[/COLOR][COLOR=#009900]([/COLOR]fixTransX, fixTransY[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    [COLOR=#000066][B]float[/B][/COLOR] getFixTrans[COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR] trans, [COLOR=#000066][B]float[/B][/COLOR] viewSize, [COLOR=#000066][B]float[/B][/COLOR] contentSize[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [COLOR=#000066][B]float[/B][/COLOR] minTrans, maxTrans[COLOR=#339933];[/COLOR]

        [B]if[/B] [COLOR=#009900]([/COLOR]contentSize [COLOR=#339933]<=[/COLOR] viewSize[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            minTrans [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
            maxTrans [COLOR=#339933]=[/COLOR] viewSize [COLOR=#339933]-[/COLOR] contentSize[COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR] [B]else[/B] [COLOR=#009900]{[/COLOR]
            minTrans [COLOR=#339933]=[/COLOR] viewSize [COLOR=#339933]-[/COLOR] contentSize[COLOR=#339933];[/COLOR]
            maxTrans [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        [B]if[/B] [COLOR=#009900]([/COLOR]trans [COLOR=#339933]<[/COLOR] minTrans[COLOR=#009900])[/COLOR]
            [B]return[/B] [COLOR=#339933]-[/COLOR]trans [COLOR=#339933]+[/COLOR] minTrans[COLOR=#339933];[/COLOR]
        [B]if[/B] [COLOR=#009900]([/COLOR]trans [COLOR=#339933]>[/COLOR] maxTrans[COLOR=#009900])[/COLOR]
            [B]return[/B] [COLOR=#339933]-[/COLOR]trans [COLOR=#339933]+[/COLOR] maxTrans[COLOR=#339933];[/COLOR]
        [B]return[/B] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
    
    [COLOR=#000066][B]float[/B][/COLOR] getFixDragTrans[COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR] delta, [COLOR=#000066][B]float[/B][/COLOR] viewSize, [COLOR=#000066][B]float[/B][/COLOR] contentSize[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]if[/B] [COLOR=#009900]([/COLOR]contentSize [COLOR=#339933]<=[/COLOR] viewSize[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            [B]return[/B] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        [B]return[/B] delta[COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]

    @Override
    [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onMeasure[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] widthMeasureSpec, [COLOR=#000066][B]int[/B][/COLOR] heightMeasureSpec[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
        [B]super[/B].[COLOR=#006633]onMeasure[/COLOR][COLOR=#009900]([/COLOR]widthMeasureSpec, heightMeasureSpec[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        viewWidth [COLOR=#339933]=[/COLOR] MeasureSpec.[COLOR=#006633]getSize[/COLOR][COLOR=#009900]([/COLOR]widthMeasureSpec[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        viewHeight [COLOR=#339933]=[/COLOR] MeasureSpec.[COLOR=#006633]getSize[/COLOR][COLOR=#009900]([/COLOR]heightMeasureSpec[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
        [COLOR=#666666][I]//[/I][/COLOR]
        [COLOR=#666666][I]// Rescales image on rotation[/I][/COLOR]
        [COLOR=#666666][I]//[/I][/COLOR]
        [B]if[/B] [COLOR=#009900]([/COLOR]oldMeasuredHeight [COLOR=#339933]==[/COLOR] viewWidth [COLOR=#339933]&&[/COLOR] oldMeasuredHeight [COLOR=#339933]==[/COLOR] viewHeight
                [COLOR=#339933]||[/COLOR] viewWidth [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]0[/COLOR] [COLOR=#339933]||[/COLOR] viewHeight [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#009900])[/COLOR]
            [B]return[/B][COLOR=#339933];[/COLOR]
        oldMeasuredHeight [COLOR=#339933]=[/COLOR] viewHeight[COLOR=#339933];[/COLOR]
        oldMeasuredWidth [COLOR=#339933]=[/COLOR] viewWidth[COLOR=#339933];[/COLOR]

        [B]if[/B] [COLOR=#009900]([/COLOR]saveScale [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            [COLOR=#666666][I]//Fit to screen.[/I][/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] scale[COLOR=#339933];[/COLOR]

            Drawable drawable [COLOR=#339933]=[/COLOR] getDrawable[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]if[/B] [COLOR=#009900]([/COLOR]drawable [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]null[/B][/COLOR] [COLOR=#339933]||[/COLOR] drawable.[COLOR=#006633]getIntrinsicWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]0[/COLOR] [COLOR=#339933]||[/COLOR]drawable.[COLOR=#006633]getIntrinsicHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]==[/COLOR] [COLOR=#CC66CC]0[/COLOR][COLOR=#009900])[/COLOR]
                [B]return[/B][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]int[/B][/COLOR] bmWidth [COLOR=#339933]=[/COLOR] drawable.[COLOR=#006633]getIntrinsicWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]int[/B][/COLOR] bmHeight [COLOR=#339933]=[/COLOR] drawable.[COLOR=#006633]getIntrinsicHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            
            Log.[COLOR=#006633]d[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"bmSize"[/COLOR], [COLOR=#0000FF]"bmWidth: "[/COLOR] [COLOR=#339933]+[/COLOR] bmWidth [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" bmHeight : "[/COLOR] [COLOR=#339933]+[/COLOR] bmHeight[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

            [COLOR=#000066][B]float[/B][/COLOR] scaleX [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] viewWidth [COLOR=#339933]/[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] bmWidth[COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] scaleY [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] viewHeight [COLOR=#339933]/[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] bmHeight[COLOR=#339933];[/COLOR]
            scale [COLOR=#339933]=[/COLOR] [COLOR=#003399]Math[/COLOR].[COLOR=#006633]min[/COLOR][COLOR=#009900]([/COLOR]scaleX, scaleY[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            matrix.[COLOR=#006633]setScale[/COLOR][COLOR=#009900]([/COLOR]scale, scale[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

            [COLOR=#666666][I]// Center the image[/I][/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] redundantYSpace [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] viewHeight [COLOR=#339933]-[/COLOR] [COLOR=#009900]([/COLOR]scale [COLOR=#339933]*[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] bmHeight[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#000066][B]float[/B][/COLOR] redundantXSpace [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] viewWidth [COLOR=#339933]-[/COLOR] [COLOR=#009900]([/COLOR]scale [COLOR=#339933]*[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] bmWidth[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            redundantYSpace [COLOR=#339933]/=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]
            redundantXSpace [COLOR=#339933]/=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] [COLOR=#CC66CC]2[/COLOR][COLOR=#339933];[/COLOR]

            matrix.[COLOR=#006633]postTranslate[/COLOR][COLOR=#009900]([/COLOR]redundantXSpace, redundantYSpace[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

            origWidth [COLOR=#339933]=[/COLOR] viewWidth [COLOR=#339933]-[/COLOR] [COLOR=#CC66CC]2[/COLOR] [COLOR=#339933]*[/COLOR] redundantXSpace[COLOR=#339933];[/COLOR]
            origHeight [COLOR=#339933]=[/COLOR] viewHeight [COLOR=#339933]-[/COLOR] [COLOR=#CC66CC]2[/COLOR] [COLOR=#339933]*[/COLOR] redundantYSpace[COLOR=#339933];[/COLOR]
            setImageMatrix[COLOR=#009900]([/COLOR]matrix[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        fixTrans[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
به این خط از کدها توجه کنید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [B]class[/B] TouchImageView [B]extends[/B] ImageView [COLOR=#009900]{[/COLOR][/FONT]
[/FONT][/COLOR]
این خط از کدها بیان می کند که کلاس TouchImageView بر اساس توسعه (extend) کلاس ImageView (عنصر ImageView) ساخته شود.

چون یک عنصر جدید ساخته ایم، باید در فایل xml مربوط به Activity (یعنی فایل activity_main.xml)، عنصر TouchImageView را به جای عنصر ImageView به کار ببریم (در واقع، برای هر عکسی که می خواهیم قابلیت بزرگنمایی دو انگشتی داشته باشد) :

178.jpg


بنابراین، کدهای فایل activity_main.xml را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]LinearLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    xmlns[COLOR=#339933]:[/COLOR]tools[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/tools"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    tools[COLOR=#339933]:[/COLOR]context[COLOR=#339933]=[/COLOR][COLOR=#0000FF]".MainActivity"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]com.[COLOR=#006633]kelidestan[/COLOR].[COLOR=#006633]imageviewzoom[/COLOR].[COLOR=#006633]TouchImageView[/COLOR]
            android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/touchImageView"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
            android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR] [COLOR=#339933]/>[/COLOR]

[COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
نکته مهم در کد بالا این است که ما به جای نام TouchImageView ، نام زیر را برای عنصر نوشته ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]com.[COLOR=#006633]kelidestan[/COLOR].[COLOR=#006633]imageviewzoom[/COLOR].[COLOR=#006633]TouchImageView[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، com.kelidestan.imageviewzoom برابر همان نام package برنامه اندروید ما می باشد، بنابراین دقت داشته باشید که در برنامه اندروید خود، ابتدا نام package برنامه خود را بنویسید و سپس نام TouchImageView را در انتهای آن قرار بدهید (اگر نام package را اشتباه بنویسید، یک خطا به وجود می آید و برنامه اندروید با Force Close روبرو می شود).و در آخر، به سراغ فایل مربوط به Activity برنامه می رویم (یعنی فایل MainActivity.java) :

179.jpg

کدهای فایل MainActivity.java را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.imageviewzoom[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                TouchImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TouchImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]touchImageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                img.[COLOR=#006633]setImageResource[/COLOR][COLOR=#009900]([/COLOR]R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                img.[COLOR=#006633]setMaxZoom[/COLOR][COLOR=#009900]([/COLOR]4f[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]


[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
مشاهده می کنید که در هنگام تعریف عنصر TouchImageView در فایل java ، به صورت زیر عمل شده است :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]TouchImageView img [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]TouchImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]touchImageView[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
فایل های پروژه اندروید را می توانید از لینک های زیر دانلود کنید :

دانلود فایل های پروژه اندروید
دانلود فایل apk برنامه اندروید
 

پیوست ها

  • 9.zip
    1.1 مگایابت · بازدیدها: 0
  • 10.rar
    455.2 کیلوبایت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تعریف Uri برای یک عکس موجود در فولدرهای drawable ، در برنامه نویسی اندروید

تعریف Uri برای یک عکس موجود در فولدرهای drawable ، در برنامه نویسی اندروید

فرض کنید یک عکس با نام image_name درون فولدرهای مخصوص عکس پروژه اندروید (drawable) کپی کرده ایم و اکنون می خواهیم که یک Uri برای آن تعریف کنیم، برای این منظور، باید کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Uri imageUri [COLOR=#339933]=[/COLOR] Uri.[COLOR=#006633]parse[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"android.resource://com.example.cartoon/"[/COLOR] [COLOR=#339933]+[/COLOR] R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_name[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تبدیل یک عکس (image) به Bitmap ، در برنامه نویسی اندروید

تبدیل یک عکس (image) به Bitmap ، در برنامه نویسی اندروید

فرض کنید که در پوشه های drawable از پروژه اندروید، یک عکس با نام myImage داریم و می خواهیم که از آن، یک Bitmap بسازیم، برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Bitmap bm [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeResource[/COLOR][COLOR=#009900]([/COLOR]getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]myImage[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
چرخش یک عکس (بر حسب درجه) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

چرخش یک عکس (بر حسب درجه) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

فرض کنید که در پوشه های drawable از پروژه اندروید، یک عکس با نام myImage داریم و می خواهیم که آن را 90 درجه بچرخانیم (در جهت عقربه های ساعت) و سپس عکس چرخیده را در یک ImageView با id برابر imageView1 قرار بدهیم. برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Bitmap bm_1 [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeResource[/COLOR][COLOR=#009900]([/COLOR]getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]myImage[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

Matrix matrix [COLOR=#339933]=[/COLOR] [B]new[/B] Matrix[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]float[/B][/COLOR] angle [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]90[/COLOR][COLOR=#339933];[/COLOR]
matrix.[COLOR=#006633]postRotate[/COLOR][COLOR=#009900]([/COLOR]angle[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

Bitmap bm_2 [COLOR=#339933]=[/COLOR] Bitmap.[COLOR=#006633]createBitmap[/COLOR][COLOR=#009900]([/COLOR]bm_1, [COLOR=#CC66CC]0[/COLOR], [COLOR=#CC66CC]0[/COLOR], bm_1.[COLOR=#006633]getWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], bm_1.[COLOR=#006633]getHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], matrix, [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bm_2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
چنانچه بخواهیم مقدار چرخش، یک زاویه دیگر باشد، باید در کدهای بالا، مقدار متغیر angle را تغییر بدهیم.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
به دست آوردن اندازه عرض (width) و ارتفاع (height) یک عکس، در برنامه نویسی اندروید

به دست آوردن اندازه عرض (width) و ارتفاع (height) یک عکس، در برنامه نویسی اندروید

فرض کنید که در پوشه های drawable از پروژه اندروید، یک عکس با نام myImage داریم و می خواهیم که اندازه عرض (width) و ارتفاع (height) آن را به دست آوریم. برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]BitmapFactory.[COLOR=#006633]Options[/COLOR] dimensions [COLOR=#339933]=[/COLOR] [B]new[/B] BitmapFactory.[COLOR=#006633]Options[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
dimensions.[COLOR=#006633]inJustDecodeBounds[/COLOR] [COLOR=#339933]=[/COLOR] [COLOR=#000066][B]true[/B][/COLOR][COLOR=#339933];[/COLOR]
Bitmap myBitmap [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeResource[/COLOR][COLOR=#009900]([/COLOR]getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]myImage[/COLOR], dimensions[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] height [COLOR=#339933]=[/COLOR] dimensions.[COLOR=#006633]outHeight[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] width [COLOR=#339933]=[/COLOR]  dimensions.[COLOR=#006633]outWidth[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
اندازه عرض (width) عکس در متغیر width و اندازه ارتفاع (height) عکس در متغیر height ذخیره می شود.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تغییر اندازه یک عکس (تغییر اندازه عرض و ارتفاع عکس) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

تغییر اندازه یک عکس (تغییر اندازه عرض و ارتفاع عکس) و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

فرض کنید که در پوشه های drawable از پروژه اندروید، یک عکس با نام myImage وجود دارد و قصد داریم که اندازه آن را تغییر بدهیم (یعنی تغییر اندازه عرض (width) و ارتفاع (height) عکس). علاوه بر این، می خواهیم عکس جدید را در یک ImageView با id برابر imageView1 نمایش بدهیم، برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Bitmap bm [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeResource[/COLOR][COLOR=#009900]([/COLOR]getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]myImage[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
[COLOR=#000066][B]int[/B][/COLOR] width [COLOR=#339933]=[/COLOR] bm.[COLOR=#006633]getWidth[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] height [COLOR=#339933]=[/COLOR] bm.[COLOR=#006633]getHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] newWidth [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]150[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] newHeight [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]150[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]float[/B][/COLOR] scaleWidth [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] newWidth[COLOR=#009900])[/COLOR] [COLOR=#339933]/[/COLOR] width[COLOR=#339933];[/COLOR]
[COLOR=#000066][B]float[/B][/COLOR] scaleHeight [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR][COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR][COLOR=#009900])[/COLOR] newHeight[COLOR=#009900])[/COLOR] [COLOR=#339933]/[/COLOR] height[COLOR=#339933];[/COLOR]
        
Matrix matrix [COLOR=#339933]=[/COLOR] [B]new[/B] Matrix[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
matrix.[COLOR=#006633]postScale[/COLOR][COLOR=#009900]([/COLOR]scaleWidth, scaleHeight[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
Bitmap resizedBitmap [COLOR=#339933]=[/COLOR] Bitmap.[COLOR=#006633]createBitmap[/COLOR][COLOR=#009900]([/COLOR]bm, [COLOR=#CC66CC]0[/COLOR], [COLOR=#CC66CC]0[/COLOR], width, height, matrix, [COLOR=#000066][B]true[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        
BitmapDrawable bmd [COLOR=#339933]=[/COLOR] [B]new[/B] BitmapDrawable[COLOR=#009900]([/COLOR]resizedBitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageDrawable[/COLOR][COLOR=#009900]([/COLOR]bmd[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
مقادیر جدید برای اندازه عرض (width) و ارتفاع (height) عکس را در دو متغیر newWidth و newHeight تعریف کرده ایم.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
برطرف کردن مشکل عدم نمایش عکس افزوده شده به فولدرهای حافظه خارجی در گالری گوشی،تا زمان restart شدن گوشی

برطرف کردن مشکل عدم نمایش عکس افزوده شده به فولدرهای حافظه خارجی در گالری گوشی،تا زمان restart شدن گوشی

برطرف کردن مشکل عدم نمایش عکس افزوده شده به فولدرهای حافظه خارجی (External storage) در گالری (gallery) گوشی،
تا زمان restart شدن گوشی، در برنامه نویسی اندروید

روشی که در ادامه شرح داده می شود، بر روی دو گوشی (یکی قدیمی و دیگری جدید) تست شده است، برای گوشی جدید، درست عمل می کند اما برای گوشی قدیمی، به طور صحیح عمل نمی کند.

هنگامی که یک عکس را به فولدری در حافظه خارجی (External Storage) اضافه می کنیم، آن عکس تا هنگام restart شدن گوشی موبایل، در گالری (gallery) گوشی نمایش داده نخواهد شد. برای رفع این مشکل و نمایش عکس در گالری، به محض کپی شدن عکس در حافظه خارجی (External Storage)، باید پس از کپی کردن عکس در حافظه خارجی (External Storage)، کدهای زیر را بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]sendBroadcast[COLOR=#009900]([/COLOR][B]new[/B] Intent[COLOR=#009900]([/COLOR]Intent.[COLOR=#006633]ACTION_MEDIA_MOUNTED[/COLOR], 
              Uri.[COLOR=#006633]parse[/COLOR][COLOR=#009900]([/COLOR][COLOR=#0000FF]"file://"[/COLOR][COLOR=#339933]+[/COLOR] dir[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
که در آن، dir برابر آدرس فولدری در حافظه خارجی (External Storage) است که در آن عکس را کپی کرده ایم. dir متغیری از نوع File می باشد و باید آن را تعریف کنید.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تفاوت بین Drawable و Bitmap در برنامه نویسی اندروید

تفاوت بین Drawable و Bitmap در برنامه نویسی اندروید

اگر با عکس ها در برنامه نویسی اندروید کار کرده باشید، مشاهده کردید که اغلب با دو حالت Drawable و Bitmap سر و کار داریم.

باید دقت داشت که Bitmap زیرمجموعه ای از Drawable است (البته از نظر مفهوم، در ادامه شرح خواهیم داد که در برنامه نویسی اندروید، قبل از نمایش یک Bitmap، آن را به BitmapDrawable تبدیل می کنند که زیرمجموعه ای از Drawable است). در واقع، Bitmap یک عکس با فرمت PNG یا JPEG یا ... است، اما Drawable شامل تمام مواردی است که قابل رسم کردن می باشند (یعنی شامل Bitmap نیز می باشد). در اکثر موارد، آنچه که از آن به عنوان Bitmap برای نمایش عکس در برنامه نویسی اندروید نام می بریم، همان BitmapDrawable می باشد.

برای Drawable در برنامه نویسی اندروید، کلاس (class) زیر را داریم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]android.[COLOR=#006633]graphics[/COLOR].[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]Drawable[/COLOR][/FONT]
[/FONT][/COLOR]
برای BitmapDrawable در برنامه نویسی اندروید، کلاس (class) زیر را داریم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]android.[COLOR=#006633]graphics[/COLOR].[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]BitmapDrawable[/COLOR][/FONT]
[/FONT][/COLOR]
برای بیان تفاوت بین Drawable و Bitmap ، بهتر است در مورد روش های نمایش عکس در یک Imageview صحبت کنیم. برای تعیین عکس برای یک Imageview ، به یکی از 4 روش زیر می توانیم اقدام کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#CC66CC]1[/COLOR][COLOR=#339933]-[/COLOR] setImageDrawable[COLOR=#009900]([/COLOR]Drawable drawable[COLOR=#009900])[/COLOR]
[COLOR=#CC66CC]2[/COLOR][COLOR=#339933]-[/COLOR] setImageBitmap[COLOR=#009900]([/COLOR]Bitmap bm[COLOR=#009900])[/COLOR]
[COLOR=#CC66CC]3[/COLOR][COLOR=#339933]-[/COLOR] setImageResource[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] resId[COLOR=#009900])[/COLOR]
[COLOR=#CC66CC]4[/COLOR][COLOR=#339933]-[/COLOR] setImageURI[COLOR=#009900]([/COLOR]URI uri[COLOR=#009900])[/COLOR][/FONT]
[/FONT][/COLOR]
وقتی از setImageBitmap استفاده می کنیم، ابتدا Bitmap به BitmapDrawable تبدیل می شود و سپس setImageDrawable فراخوانده می شود. این مسئله را از روی کدهای setImageBitmap می توان متوجه شد :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] setImageBitmap[COLOR=#009900]([/COLOR]Bitmap bm[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    setImageDrawable[COLOR=#009900]([/COLOR][B]new[/B] BitmapDrawable[COLOR=#009900]([/COLOR]mContext.[COLOR=#006633]getResources[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], bm[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اگر در مورد setImageResource و setImageURI نیز کمی تحقیق کنید، متوجه خواهید شد که آنها برای ساخت یک Bitmap از روی یک مسیر (path) یا Uri و یا فایل منبع (resource file) به کار می روند. بنابراین این دو مورد نیز همانند setImageBitmap می باشند و در کل، می توان نتیجه گرفت که این سه تابع، بر اساس تابع setImageDrawable هستند.

چنانچه بخواهیم انواع دیگری از Drawable (به غیر از Bitmap ، یا در واقع به غیر از BitmapDrawable) را در یک Imageview نمایش بدهیم، باید از خود تابع setImageDrawable استفاده کنیم.

کلمه Bitmap خود از دو کلمه بیت (Bit) و نقشه (Map) تشکیل شده است و همین دو کلمه، ساختار آن را بیان می کند. یعنی مثلا وقتی شما یک عکس 16 در 16 پیکسل دارید، اگر آن را به صورت Bitmap داشته باشید، یعنی آن عکس به صورت تعداد ((16 ضرب در 16 ضرب در n)) مقدار برای پیکس های عکس، ذخیره شده است (برای هر پیکسل ، n مقدار). این مقادیر به صورت آرایه ای از بیت ها (bit array) ذخیره می شوند (هر بیت هم که یعنی مقدار 0 یا 1). مثلا فرمت PNG که برای عکس به کار می رود، یک Bitmap می باشد (n=3).


کلمه Drawable هم از دو کلمه draw و able تشکیل شده است که در مجموع، به معنای ((قابل رسم کردن)) می باشد. قبل از اینکه اصطلاحات ما را گیج کنند، باید بگویم که دو اصطلاح ((Bitmap Drawables)) و ((Vector Drawables)) را داریم که در برنامه نویسی اندروید، ((Bitmap Drawables)) را BitmapDrawables می نامیم و به ((Vector Drawables)) ، به طور خلاصه، Drawables می گوییم (این مورد تذکر داده شد تا اگر بعدا با اصطلاحات دیگری برخورد کردید، این اصطلاحات گیجتان نکند). بگذارید به زبان ساده بگویم، فرض کنید که ما قصد داریم که عکسی شامل یک دایره داشته باشیم، اگر بخواهیم مطابق تعریف Bitmap ها عمل کنیم، باید اطلاعات مربوط به تعداد زیادی پیکسل را داشته باشیم، اما می توانستیم یک جور دیگر نیز اطلاعات مربوط به عکس دایره را ذخیره کنیم و آن این است که مختصات نقطه مرکز دایره و همچنین شعاع دایره را به عنوان اطلاعات ذخیره کنیم، بنابراین با کمی پردازش، می توان عکس را ساخت و نیاز به ذخیره و بازیابی اطلاعات مربوط به تعداد زیادی پیکسل نیز نمی باشد. می توان گفت که Drawable به این صورت عمل می کند و به جای اینکه بر اساس اطلاعات تعداد زیادی پیکسل باشد، با یک سری بردار (vector)، عکس های (images) آماده و متن (text)، عکس نهایی را می سازد. بنابراین مشاهده می کنید که در Drawable ، حتی متن ها را هم می توان به عکس اضافه نمود (کار با چندین لایه از عکس، رسم خط و دایره و ... و به کار بردن متن و اعمال خیلی از انواع تغییرات بر روی عکس).
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش تعدادی عکس، با استفاده از GridView ، در برنامه نویسی اندروید

نمایش تعدادی عکس، با استفاده از GridView ، در برنامه نویسی اندروید

در این مبحث قصد داریم که چگونگی نمایش تعدادی عکس با استفاده از GridView را شرح بدهیم. نتیجه به صورت زیر می باشد :

947.jpg
948.jpg

و با چرخاندن گوشی، خروجی به صورت زیر است (در حالت افقی) :

949.jpg

همچنین با اشاره کاربر بر روی هر یک از item های موجود در GridView ، یک پیام بر اساس شماره item به کاربر نمایش داده می شود (یک پیام کوتاه چند ثانیه ای با استفاده از روش Toast). این مورد را برای این منظور به پروژه اندروید افزوده ایم که متوجه شوید چگونه یک سری کد را تعیین کنید که بعد از اشاره کاربر بر روی هر item از GridView ، اجرا شوند :



950.jpg
فایل پروژه اندروید و همچنین فایل apk ساخته شده از آن را می توانید از انتهای مبحث دانلود نمایید.
کدهای این مبحث را قبلا در برنامه اندرویدی با نام ((کاریکاتور)) به کار برده بودم. در آن زمان یادم است که برای نمایش عکس ها با استفاده از GridView مشکل داشتم زیرا در گوشی های با صفحه نمایش های با اندازه مختلف، عکس ها بر روی یکدیگر قرار می گرفتند و یا به صورتی بودند که مد نظر من نبود. البته در آن زمان، می دانستم که باید چندین فایل xml برای صفحه نمایش های با اندازه مختلف (4 دسته) بسازم ، اما این مورد نیز کمکی نکرد، بنابراین از این روش استفاده نکردم و ترجیح دادم کدها را به گونه ای بنویسم که تنها یک فایل xml کافی باشد و بر اساس تنظیم پارامترهای مربوط به اندازه عنصرها، آن را به صورت مناسب برای تمامی صفحه های نمایش با اندازه های مختلف، در بیاورم. بنابراین ممکن است که کدهای استفاده شده برای GridView ، کمی با کدهای سایر سایت ها متفاوت باشد. اما به هر حال از هر کدی که استفاده می کنید، به نکته مهم زیر توجه کنید :
((GridView یکی از عناصری است که اگر کدهای آن را به درستی تعیین نکنید، به شدت به اندازه صفحه نمایش حساس می باشد و ممکن است که طراحی شما، برای برخی صفحه های نمایش با اندازه های مختلف، خراب شود. پس حتما GridView را در صفحه نمایش های با اندازه مختلف آزمایش کنید و نتیجه را ببینید)).

نام پروژه اندروید را برابر GridViewImage انتخاب کرده ایم (نام package برابر com.kelidestan.gridviewimage انتخاب شده است. نام Activity اصلی را برابر MainActivity.java انتخاب کرده ایم و فایل xml متناظر آن را هم برابر activity_main.xml قرار داده ایم) :

942.jpg

قبل از هر چیز، در پروژه اندروید، به 30 عدد عکس نیاز داریم که آنها را در پوشه drawable-hdpi کپی کرده ایم :

943.jpg

فایل activity_main.xml ، فایل xml متناظر برای Activity اصلی برنامه است (البته تنها یک Activity داریم) که ظاهر گرافیکی آن را تعیین می کند :

944.jpg

کدهای فایل activity_main.xml را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]LinearLayout xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]orientation[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"vertical"[/COLOR] [COLOR=#339933]>[/COLOR]
    
[COLOR=#339933]<[/COLOR]GridView 
    android[COLOR=#339933]:[/COLOR]id[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@+id/gridview"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_width[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"fill_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]layout_height[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"match_parent"[/COLOR]
    android[COLOR=#339933]:[/COLOR]numColumns[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"3"[/COLOR]
    android[COLOR=#339933]:[/COLOR]columnWidth[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"150dp"[/COLOR]
    android[COLOR=#339933]:[/COLOR]horizontalSpacing[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"10dp"[/COLOR]
    android[COLOR=#339933]:[/COLOR]verticalSpacing[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"10dp"[/COLOR]
    android[COLOR=#339933]:[/COLOR]gravity[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"center"[/COLOR] 
    [COLOR=#339933]>[/COLOR]
[COLOR=#339933]</[/COLOR]GridView[COLOR=#339933]>[/COLOR] 

[COLOR=#339933]</[/COLOR]LinearLayout[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که مشاهده می کنید، یک عنصر GridView تعریف کرده ایم. با استفاده از مشخصه numColumns ، تعداد ستون های GridView را برابر 3 ستون قرار داده ایم.

ظاهر گرافیکی فایل activity_main.xml به صورت زیر می باشد (در برنامه eclipse) :

946.jpg

اکنون به سراغ Activity اصلی برنامه اندروید می رویم که کدهای آن در فایل MainActivity.java نوشته شده اند :

945.jpg

کدهای فایل MainActivity.java را به صورت زیر می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]package[/B] [COLOR=#006699]com.kelidestan.gridviewimage[/COLOR][COLOR=#339933];[/COLOR]

[B]import[/B] [COLOR=#006699]android.app.Activity[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.Context[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.content.res.Resources[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.os.Bundle[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.util.TypedValue[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.View[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.view.ViewGroup[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.AdapterView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.AdapterView.OnItemClickListener[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.BaseAdapter[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.GridView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.ImageView[/COLOR][COLOR=#339933];[/COLOR]
[B]import[/B] [COLOR=#006699]android.widget.Toast[/COLOR][COLOR=#339933];[/COLOR]

[B]public[/B] [B]class[/B] MainActivity [B]extends[/B] Activity [COLOR=#009900]{[/COLOR]
        
        [B]public[/B] [COLOR=#003399]Integer[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] myImages [COLOR=#339933]=[/COLOR] [COLOR=#009900]{[/COLOR]
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_2[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_3[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_4[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_5[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_6[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_7[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_8[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_9[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_10[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_11[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_12[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_13[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_14[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_15[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_16[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_17[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_18[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_19[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_20[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_21[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_22[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_23[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_24[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_25[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_26[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_27[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_28[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_29[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_30[/COLOR]
        [COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR]

        @Override
        [B]protected[/B] [COLOR=#000066][B]void[/B][/COLOR] onCreate[COLOR=#009900]([/COLOR]Bundle savedInstanceState[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                [B]super[/B].[COLOR=#006633]onCreate[/COLOR][COLOR=#009900]([/COLOR]savedInstanceState[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                setContentView[COLOR=#009900]([/COLOR]R.[COLOR=#006633]layout[/COLOR].[COLOR=#006633]activity_main[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                
                GridView gridview [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]GridView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]gridview[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]   
                gridview.[COLOR=#006633]setAdapter[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] ImageAdapter[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  
        
                gridview.[COLOR=#006633]setOnItemClickListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] OnItemClickListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    @Override
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onItemClick[COLOR=#009900]([/COLOR]AdapterView[COLOR=#339933]<?>[/COLOR] parent, [COLOR=#003399]View[/COLOR] v,
                            [COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#000066][B]long[/B][/COLOR] id[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]String[/COLOR] position_string [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"you pressed the item number "[/COLOR] [COLOR=#339933]+[/COLOR][COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]position[COLOR=#339933]+[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" in GridView"[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], position_string, Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]

        
        [B]public[/B] [B]static[/B] [COLOR=#000066][B]int[/B][/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR] dp, [COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            Resources resources [COLOR=#339933]=[/COLOR] context.[COLOR=#006633]getResources[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900])[/COLOR] TypedValue.[COLOR=#006633]applyDimension[/COLOR][COLOR=#009900]([/COLOR]
                    TypedValue.[COLOR=#006633]COMPLEX_UNIT_DIP[/COLOR],
                    dp, 
                    resources.[COLOR=#006633]getDisplayMetrics[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR]
            [COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]
        
        
        [B]public[/B] [B]class[/B] ImageAdapter [B]extends[/B] BaseAdapter[COLOR=#009900]{[/COLOR]
        [B]private[/B] [COLOR=#003399]Context[/COLOR] mContext[COLOR=#339933];[/COLOR]
        [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] getCount[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] myImages.[COLOR=#006633]length[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]                               
        [B]public[/B] [COLOR=#003399]Object[/COLOR] getItem[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] myImages[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]                               
        [B]public[/B] [COLOR=#000066][B]long[/B][/COLOR] getItemId[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]    
        [B]public[/B] ImageAdapter[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] c[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            mContext [COLOR=#339933]=[/COLOR] c[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]                         
                             
       [B]public[/B] [COLOR=#003399]View[/COLOR] getView[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#003399]View[/COLOR] convertView, ViewGroup parent[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            ImageView imageView[COLOR=#339933];[/COLOR]
            [B]if[/B] [COLOR=#009900]([/COLOR]convertView [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]  
               imageView [COLOR=#339933]=[/COLOR] [B]new[/B] ImageView[COLOR=#009900]([/COLOR]mContext[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]float[/B][/COLOR] w [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]float[/B][/COLOR] h [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]int[/B][/COLOR] width_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]w,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]int[/B][/COLOR] height_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]h,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setLayoutParams[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] GridView.[COLOR=#006633]LayoutParams[/COLOR][COLOR=#009900]([/COLOR]width_pixel, height_pixel[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 
               imageView.[COLOR=#006633]setScaleType[/COLOR][COLOR=#009900]([/COLOR]ImageView.[COLOR=#006633]ScaleType[/COLOR].[COLOR=#006633]CENTER_CROP[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setPadding[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setMaxHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]60[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR][B]else[/B][COLOR=#009900]{[/COLOR]
                imageView [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] convertView[COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            imageView.[COLOR=#006633]setBackgroundResource[/COLOR][COLOR=#009900]([/COLOR]myImages[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] imageView[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
                                   
   
        [COLOR=#009900]}[/COLOR]
        
        

[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
اکنون کدها را شرح می دهیم :

کدهای زیر را در نظر بگیرید :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        [B]public[/B] [COLOR=#003399]Integer[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] myImages [COLOR=#339933]=[/COLOR] [COLOR=#009900]{[/COLOR]
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_1[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_2[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_3[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_4[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_5[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_6[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_7[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_8[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_9[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_10[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_11[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_12[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_13[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_14[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_15[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_16[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_17[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_18[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_19[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_20[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_21[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_22[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_23[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_24[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_25[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_26[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_27[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_28[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_29[/COLOR],
                         R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]image_30[/COLOR]
        [COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
با کدهای بالا، یک آرایه (Array) از جنس Integer و با نام myImages تعریف کرده ایم که در آن، مشخصات (resource Id ، یا به اختصار : resId) مربوط به عکس هایی که می خواهیم در GridView نمایش داده شوند، نوشته شده است (برای ارجاع به عکس ها).

در روش onCreate ، کدهای زیر برای GridView نوشته شده است (کدهای روش onCreate ، به محض اجرای Activity ، اجرا خواهند شد) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                GridView gridview [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]GridView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]gridview[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]   
                gridview.[COLOR=#006633]setAdapter[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] ImageAdapter[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  
        
                gridview.[COLOR=#006633]setOnItemClickListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] OnItemClickListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    @Override
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onItemClick[COLOR=#009900]([/COLOR]AdapterView[COLOR=#339933]<?>[/COLOR] parent, [COLOR=#003399]View[/COLOR] v,
                            [COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#000066][B]long[/B][/COLOR] id[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]String[/COLOR] position_string [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"you pressed the item number "[/COLOR] [COLOR=#339933]+[/COLOR][COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]position[COLOR=#339933]+[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" in GridView"[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], position_string, Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
ابتدا با کد زیر، GridView را بر اساس id آن شناسایی کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]GridView gridview [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]GridView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]gridview[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
سپس یک Adapter را برای GridView تعیین کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]gridview.[COLOR=#006633]setAdapter[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] ImageAdapter[COLOR=#009900]([/COLOR][B]this[/B][COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که در کد بالا، یک شیء (object) از کلاس (class) با نام ImageAdapter ساخته ایم و آن را با استفاده از روش setAdapter ، به عنوان Adapter برای GridView تعیین کرده ایم. همان طور که می دانید، در ساخت یک شیء از یک کلاس، از کلمه new استفاده می شود و این مورد، نکته ای ساده برای تشخیص ساختن یک شیء از یک کلاس می باشد. کلاس ImageAdapter را هم در انتهای کدهای همین Activity تعریف کرده ایم (بعدا کدهای آن را شرح می دهیم).

با کدهای زیر تعیین کرده ایم که اگر کاربر بر روی یک از item های (خانه های) GridView اشاره کرد، چه کدهایی اجرا شوند (برای این منظور، روش setOnItemClickListener را به کار برده ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]                gridview.[COLOR=#006633]setOnItemClickListener[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] OnItemClickListener[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                    @Override
                    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] onItemClick[COLOR=#009900]([/COLOR]AdapterView[COLOR=#339933]<?>[/COLOR] parent, [COLOR=#003399]View[/COLOR] v,
                            [COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#000066][B]long[/B][/COLOR] id[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
                        [COLOR=#003399]String[/COLOR] position_string [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"you pressed the item number "[/COLOR] [COLOR=#339933]+[/COLOR][COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]position[COLOR=#339933]+[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" in GridView"[/COLOR][COLOR=#339933];[/COLOR]
                        Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], position_string, Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
                    [COLOR=#009900]}[/COLOR]
                [COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
پس بر اساس کدهای بالا، با اشاره کاربر بر روی یک item از GridView ، کدهای زیر اجرا خواهد شد (کدهایی برای نمایش یک پیام کوتاه به کاربر، که در آن، شماره item اشاره شده را اعلام می کنیم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] position_string [COLOR=#339933]=[/COLOR] [COLOR=#0000FF]"you pressed the item number "[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#003399]String[/COLOR].[COLOR=#006633]valueOf[/COLOR][COLOR=#009900]([/COLOR]position[COLOR=#339933]+[/COLOR][COLOR=#CC66CC]1[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#339933]+[/COLOR] [COLOR=#0000FF]" in GridView"[/COLOR][COLOR=#339933];[/COLOR]
Toast.[COLOR=#006633]makeText[/COLOR][COLOR=#009900]([/COLOR]getApplicationContext[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], position_string, Toast.[COLOR=#006633]LENGTH_SHORT[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]show[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
دقت کنید که در متغیر position ، شماره مربوط به item ای را که بر روی آن اشاره شده، ذخیره شده است. البته مقدار position از صفر شروع می شود (یعنی item اول را برابر 0 در نظر می گیرد) و بنابراین یک واحد به آن اضافه کرده ایم. برای نمایش پیام، از روش Toast استفاده کرده ایم که یک پیام را در چند ثانیه نمایش می دهد.

در کدهای Activity ، یک تابع با نام convertDpToPixels تعریف کرده ایم:
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        [B]public[/B] [B]static[/B] [COLOR=#000066][B]int[/B][/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR][COLOR=#000066][B]float[/B][/COLOR] dp, [COLOR=#003399]Context[/COLOR] context[COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]
            Resources resources [COLOR=#339933]=[/COLOR] context.[COLOR=#006633]getResources[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR][COLOR=#009900])[/COLOR] TypedValue.[COLOR=#006633]applyDimension[/COLOR][COLOR=#009900]([/COLOR]
                    TypedValue.[COLOR=#006633]COMPLEX_UNIT_DIP[/COLOR],
                    dp, 
                    resources.[COLOR=#006633]getDisplayMetrics[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR]
            [COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
این تابع، یک مقدار را بر اساس واحد dp دریافت می کند و سپس مقدار متناظر با آن را بر حسب تعداد پیکسل (pixels) بر می گرداند. اگر یادتان باشد، در ابتدای مبحث گفتم که کدها را به گونه ای نوشته ام که بر روی صفحه نمایش های با اندازه مختلف، مشکلی نداشته باشد و به طور صحیح نمایش داده شود و نیازی هم به ساخت چند فایل xml برای صفحه نمایش های با اندازه های مختلف نباشد. یکی از مواردی که برای رسیدن به این هدف نیاز داریم، استفاده از همین تابع است زیرا در بخشی از کدها، نیاز داریم که واحد را به صورت پیکسل (pixels) داشته باشیم.

و اما بخش آخر کدها که همان ImageAdapter است (Adapter تعیین شده برای GridView) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]        [B]public[/B] [B]class[/B] ImageAdapter [B]extends[/B] BaseAdapter[COLOR=#009900]{[/COLOR]
        [B]private[/B] [COLOR=#003399]Context[/COLOR] mContext[COLOR=#339933];[/COLOR]
        [B]public[/B] [COLOR=#000066][B]int[/B][/COLOR] getCount[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] myImages.[COLOR=#006633]length[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]                               
        [B]public[/B] [COLOR=#003399]Object[/COLOR] getItem[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] myImages[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]                               
        [B]public[/B] [COLOR=#000066][B]long[/B][/COLOR] getItemId[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
             [B]return[/B] [COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR]
        [COLOR=#009900]}[/COLOR]    
        [B]public[/B] ImageAdapter[COLOR=#009900]([/COLOR][COLOR=#003399]Context[/COLOR] c[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            mContext [COLOR=#339933]=[/COLOR] c[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]                         
                             
       [B]public[/B] [COLOR=#003399]View[/COLOR] getView[COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR] position, [COLOR=#003399]View[/COLOR] convertView, ViewGroup parent[COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
            ImageView imageView[COLOR=#339933];[/COLOR]
            [B]if[/B] [COLOR=#009900]([/COLOR]convertView [COLOR=#339933]==[/COLOR] [COLOR=#000066][B]null[/B][/COLOR][COLOR=#009900])[/COLOR][COLOR=#009900]{[/COLOR]  
               imageView [COLOR=#339933]=[/COLOR] [B]new[/B] ImageView[COLOR=#009900]([/COLOR]mContext[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]float[/B][/COLOR] w [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]float[/B][/COLOR] h [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]int[/B][/COLOR] width_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]w,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               [COLOR=#000066][B]int[/B][/COLOR] height_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]h,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setLayoutParams[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] GridView.[COLOR=#006633]LayoutParams[/COLOR][COLOR=#009900]([/COLOR]width_pixel, height_pixel[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  
               imageView.[COLOR=#006633]setScaleType[/COLOR][COLOR=#009900]([/COLOR]ImageView.[COLOR=#006633]ScaleType[/COLOR].[COLOR=#006633]CENTER_CROP[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setPadding[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
               imageView.[COLOR=#006633]setMaxHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]60[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR][B]else[/B][COLOR=#009900]{[/COLOR]
                imageView [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] convertView[COLOR=#339933];[/COLOR]
            [COLOR=#009900]}[/COLOR]
            imageView.[COLOR=#006633]setBackgroundResource[/COLOR][COLOR=#009900]([/COLOR]myImages[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
            [B]return[/B] imageView[COLOR=#339933];[/COLOR]
       [COLOR=#009900]}[/COLOR]
                                   
   
        [COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
همان طور که قبلا گفتیم، یک شئ (object) از این کلاس (class) ساختیم و آن را به عنوان Adapter برای GridView تعیین کردیم. Adapter برای ساخت GridView به کار خواهد رفت و item های آن را می سازد و ویژگی ها و منابع مربوط به item ها در میان کدهای Adapter (یعنی همین Adapter با نام ImageAdapter) نوشته شده است.

چون قصد داریم که در هر item ، یک عکس نمایش داده شود، بنابراین در هر item ، باید یک ImageView داشته باشیم که در آن، عکس نمایش داده شود. بنابراین کد زیر را می نویسیم تا در هر item ، یک ImageView ساخته شود (ساخت یک شیء از کلاس ImageView) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]imageView [COLOR=#339933]=[/COLOR] [B]new[/B] ImageView[COLOR=#009900]([/COLOR]mContext[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کدهای زیر، با استفاده از همان تابع convertDpToPixels ، دو مقدار ارتفاع و عرض (برای تعیین اندازه های ImageView) را بر حسب پیکسل به دست آورده ایم (یعنی یک مقدار را بر حسب dp تعیین کرده ایم و چون dp در گوشی های با صفحه نمایش مختلف، متفاوت است، می خواهیم مقادیر مورد نظرمان را بر حسب پیکسل به دست آوریم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#000066][B]float[/B][/COLOR] w [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]float[/B][/COLOR] h [COLOR=#339933]=[/COLOR] [COLOR=#CC66CC]100[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] width_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]w,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#000066][B]int[/B][/COLOR] height_pixel [COLOR=#339933]=[/COLOR] convertDpToPixels[COLOR=#009900]([/COLOR]h,MainActivity.[B]this[/B][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
شاید کاری که انجام می دهیم، برایتان کمی مبهم باشد. در واقع، ما ابتدا واحد را بر حسب dp بیان کرده ایم و چون واحد dp یک واحد نسبی است و بر اساس اندازه صفحه نمایش گوشی تعیین می شود، بنابراین مقادیر w و h به طور مستقل از اندازه صفحه نمایش ذخیره شده اند. اکنون چون می خواهیم این دو مقدار را برای روشی به کار ببریم که واحد را بر حسب پیکسل (pixels) دریافت می کند، پس آن دو را به واحد پیکسل (pixels) تبدیل می کنیم.

سپس ویژگی های مربوط به اندازه و پارامترهای ظاهری ImageView را مشخص کرده ایم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]imageView.[COLOR=#006633]setLayoutParams[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] GridView.[COLOR=#006633]LayoutParams[/COLOR][COLOR=#009900]([/COLOR]width_pixel, height_pixel[COLOR=#009900])[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  
imageView.[COLOR=#006633]setScaleType[/COLOR][COLOR=#009900]([/COLOR]ImageView.[COLOR=#006633]ScaleType[/COLOR].[COLOR=#006633]CENTER_CROP[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
imageView.[COLOR=#006633]setPadding[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR], [COLOR=#CC66CC]8[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
imageView.[COLOR=#006633]setMaxHeight[/COLOR][COLOR=#009900]([/COLOR][COLOR=#CC66CC]60[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کل، می توانید این موارد (و همچنین مقادیر h و w و پارامترهای تعیین شده در فایل xml) را مطابق سلیقه خود تغییر بدهید، اما حتما نتیجه را بر روی گوشی های با صفحه نمایش های با اندازه مختلف، آزمایش کنید.

در آخر، تعیین کرده ایم که بر اساس مقدار ذخیره شده در متغیر position که متناظر با شماره مربوط به item است، یکی از عکس هایی که در آرایه myImages ، مقدار مربوط به resource ID آن را ذکر کرده ایم، در ImageView نمایش داده شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]imageView.[COLOR=#006633]setBackgroundResource[/COLOR][COLOR=#009900]([/COLOR]myImages[COLOR=#009900][[/COLOR]position[COLOR=#009900]][/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
نکته :

معمولا در برنامه های اندرویدی که ممکن است از نظر حافظه (memory)، مشکلی به وجود بیاید (مثلا یک force close ایجاد شده و برنامه به اجبار بسته شود)، در فایل AndroidManifest.xml ، یک مشخصه با نام largeHeap را باید برابر true قرار بدهیم تا این مشکل، تا حدودی رفع شود. من برای مواردی که احتمالا تعداد عکس ها زیاد است، توصیه می کنم که این مشخصه نیز در پروژه اندروید ذکر شود. برای این منظور، فایل AndroidManifest.xml از پروژه اندروید را باز می کنیم :

951.png

اکنون باید کد زیر را به تگ application اضافه کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]android[COLOR=#339933]:[/COLOR]largeHeap[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR][/FONT]
[/FONT][/COLOR]
برای اینکه موقعیت آن را به درستی متوجه شوید، کل کدهای فایل AndroidManifest.xml از پروژه اندروید را در زیر نمایش داده ام :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<?[/COLOR]xml version[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] encoding[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"utf-8"[/COLOR][COLOR=#339933]?>[/COLOR]
[COLOR=#339933]<[/COLOR]manifest xmlns[COLOR=#339933]:[/COLOR]android[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"http://schemas.android.com/apk/res/android"[/COLOR]
    [B]package[/B][COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.gridviewimage"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionCode[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1"[/COLOR]
    android[COLOR=#339933]:[/COLOR]versionName[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"1.0"[/COLOR] [COLOR=#339933]>[/COLOR]

    [COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]sdk
        android[COLOR=#339933]:[/COLOR]minSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"8"[/COLOR]
        android[COLOR=#339933]:[/COLOR]targetSdkVersion[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"18"[/COLOR] [COLOR=#339933]/>[/COLOR]

    [COLOR=#339933]<[/COLOR]application
        android[COLOR=#339933]:[/COLOR]largeHeap[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]allowBackup[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"true"[/COLOR]
        android[COLOR=#339933]:[/COLOR]icon[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@drawable/ic_launcher"[/COLOR]
        android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR]
        android[COLOR=#339933]:[/COLOR]theme[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@style/AppTheme"[/COLOR] [COLOR=#339933]>[/COLOR]
        [COLOR=#339933]<[/COLOR]activity
            android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"com.kelidestan.gridviewimage.MainActivity"[/COLOR]
            android[COLOR=#339933]:[/COLOR]label[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"@string/app_name"[/COLOR] [COLOR=#339933]>[/COLOR]
            [COLOR=#339933]<[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
                [COLOR=#339933]<[/COLOR]action android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.action.MAIN"[/COLOR] [COLOR=#339933]/>[/COLOR]

                [COLOR=#339933]<[/COLOR]category android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.intent.category.LAUNCHER"[/COLOR] [COLOR=#339933]/>[/COLOR]
            [COLOR=#339933]</[/COLOR]intent[COLOR=#339933]-[/COLOR]filter[COLOR=#339933]>[/COLOR]
        [COLOR=#339933]</[/COLOR]activity[COLOR=#339933]>[/COLOR]
    [COLOR=#339933]</[/COLOR]application[COLOR=#339933]>[/COLOR]

[COLOR=#339933]</[/COLOR]manifest[COLOR=#339933]>[/COLOR][/FONT]
[/FONT][/COLOR]
ساخت پروژه اندروید تمام شد و اکنون می توانیم آن را تست کنیم :

947 (1).jpg


948 (1).jpg

و با چرخاندن گوشی، خروجی به صورت زیر است (در حالت افقی) :


949 (1).jpg

همچنین با اشاره کاربر بر روی هر یک از item های موجود در GridView ، یک پیام بر اساس شماره item به کاربر نمایش داده می شود :


950 (1).jpg

فایل های پروژه اندروید را می توانید از لینک های زیر دریافت کنید :
 

پیوست ها

  • 97.zip
    1.7 مگایابت · بازدیدها: 0
  • 96.zip
    2.4 مگایابت · بازدیدها: 0

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
خواندن یک عکس از حافظه خارجی (External Storage)، تبدیل آن به Bitmap و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

خواندن یک عکس از حافظه خارجی (External Storage)، تبدیل آن به Bitmap و نمایش آن در یک ImageView ، در برنامه نویسی اندروید

فرض کنید یک عکس با نام myImage در یک پوشه با نام myFolder در حافظه خارجی (External Storage) داریم. برای اینکه عکس را از حافظه خارجی (External Storage) خوانده، تبدیل به Bitmap کرده و سپس در یک ImageView نمایش بدهیم، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]String[/COLOR] photoPath [COLOR=#339933]=[/COLOR] [COLOR=#003399]Environment[/COLOR].[COLOR=#006633]getExternalStorageDirectory[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933]+[/COLOR][COLOR=#0000FF]"/myFolder/myImage.png"[/COLOR][COLOR=#339933];[/COLOR]

BitmapFactory.[COLOR=#006633]Options[/COLOR] options [COLOR=#339933]=[/COLOR] [B]new[/B] BitmapFactory.[COLOR=#006633]Options[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
options.[COLOR=#006633]inPreferredConfig[/COLOR] [COLOR=#339933]=[/COLOR] Bitmap.[COLOR=#006633]Config[/COLOR].[COLOR=#006633]ARGB_8888[/COLOR][COLOR=#339933];[/COLOR]
Bitmap bitmap [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeFile[/COLOR][COLOR=#009900]([/COLOR]photoPath, options[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]   
                
ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
در کد بالا، فرض کرده ایم که ImageView دارای id برابر imageView1 می باشد.

دقت شود که در صورت کدنویسی برای فرآیندی که نیاز به دسترسی به حافظه خارجی (External Storage) دارد، باید کدهای زیر درون AndroidManifest.xml نوشته شود (برای اجازه دادن برای نوشتن در حافظه خارجی و یا خواندن از حافظه خارجی) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.WRITE_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR]
[COLOR=#339933]<[/COLOR]uses[COLOR=#339933]-[/COLOR]permission android[COLOR=#339933]:[/COLOR]name[COLOR=#339933]=[/COLOR][COLOR=#0000FF]"android.permission.READ_EXTERNAL_STORAGE"[/COLOR] [COLOR=#339933]/>[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
نمایش یک عکس از نوع Bitmap ، در یک ImageView ، با روش setImageBitmap ، در برنامه نویسی اندروید

نمایش یک عکس از نوع Bitmap ، در یک ImageView ، با روش setImageBitmap ، در برنامه نویسی اندروید

برای نمایش یک عکس از نوع Bitmap در یک ImageView ، از روش setImageBitmap استفاده می کنیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bitmap[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
تبدیل یک عکس به آرایه ای از جنس بایت (Byte Array) (یعنی byte[]) و سپس انجام معکوس این روند و نمایش عکس حاصل در یک ImageView

تبدیل یک عکس به آرایه ای از جنس بایت (Byte Array) (یعنی byte[]) و سپس انجام معکوس این روند و نمایش عکس حاصل در یک ImageView

تبدیل یک عکس به آرایه ای از جنس بایت (Byte Array) (یعنی byte[]) و سپس انجام معکوس این روند و نمایش عکس حاصل در یک ImageView،
در برنامه نویسی اندروید :


در این مبحث قصد داریم که یک عکس را از پوشه های drawable فراخوانی کرده و تبدیل به آرایه ای از جنس بایت (Byte Array) (یعنی byte[]) کنیم، سپس آرایه را به عکس (از نوع Bitmap) تبدیل کرده و سپس نتیجه را در یک ImageView نمایش بدهیم. برای این منظور، کدهای زیر را می نویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]Bitmap bm [COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeResource[/COLOR][COLOR=#009900]([/COLOR]getResources[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR], R.[COLOR=#006633]drawable[/COLOR].[COLOR=#006633]ic_launcher[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]ByteArrayOutputStream[/COLOR] baos [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]ByteArrayOutputStream[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]  
bm.[COLOR=#006633]compress[/COLOR][COLOR=#009900]([/COLOR]Bitmap.[COLOR=#006633]CompressFormat[/COLOR].[COLOR=#006633]PNG[/COLOR], [COLOR=#CC66CC]100[/COLOR], baos[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] [COLOR=#666666][I]// PNG (you can choose JPEG)[/I][/COLOR]
[COLOR=#000066][B]byte[/B][/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] b [COLOR=#339933]=[/COLOR] baos.[COLOR=#006633]toByteArray[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR] 

[COLOR=#003399]ByteArrayInputStream[/COLOR] bais [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]ByteArrayInputStream[/COLOR][COLOR=#009900]([/COLOR]b[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
Bitmap bm2[COLOR=#339933]=[/COLOR] BitmapFactory.[COLOR=#006633]decodeStream[/COLOR][COLOR=#009900]([/COLOR]bais[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]

ImageView iv [COLOR=#339933]=[/COLOR] [COLOR=#009900]([/COLOR]ImageView[COLOR=#009900])[/COLOR] findViewById[COLOR=#009900]([/COLOR]R.[COLOR=#006633]id[/COLOR].[COLOR=#006633]imageView1[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
iv.[COLOR=#006633]setImageBitmap[/COLOR][COLOR=#009900]([/COLOR]bm2[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
نام عکس را برابر ic_launcher در نظر گرفته ایم. همچنین id مربوط به ImageView را برابر imageView1 در نظر گرفته ایم.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
به دست آوردن نام تمامی عکس های موجود در پوشه های drawable پروژه اندروید، به صورت یک آرایه از جنس رشته

به دست آوردن نام تمامی عکس های موجود در پوشه های drawable پروژه اندروید، به صورت یک آرایه از جنس رشته

به دست آوردن نام تمامی عکس های (منابع) موجود در پوشه های drawable پروژه اندروید،
به صورت یک آرایه (Array) از جنس رشته (String)،
در برنامه نویسی اندروید :


با استفاده از کد زیر می توانیم نام تمامی عکس های (منابع) موجود در پوشه های drawable پروژه اندروید را به صورت یک آرایه (Array) از جنس رشته (String)، به دست آوریم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]Field[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] fields [COLOR=#339933]=[/COLOR] R.[COLOR=#006633]drawable[/COLOR].[B]class[/B].[COLOR=#006633]getFields[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR][COLOR=#009900]][/COLOR] allDrawablesNames [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]String[/COLOR][COLOR=#009900][[/COLOR]fields.[COLOR=#006633]length[/COLOR][COLOR=#009900]][/COLOR][COLOR=#339933];[/COLOR]
[B]for[/B] [COLOR=#009900]([/COLOR][COLOR=#000066][B]int[/B][/COLOR]  i [COLOR=#339933]=[/COLOR][COLOR=#CC66CC]0[/COLOR][COLOR=#339933];[/COLOR] i [COLOR=#339933]<[/COLOR] fields.[COLOR=#006633]length[/COLOR][COLOR=#339933];[/COLOR] i[COLOR=#339933]++[/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]           
    allDrawablesNames[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR] [COLOR=#339933]=[/COLOR] fields[COLOR=#009900][[/COLOR]i[COLOR=#009900]][/COLOR].[COLOR=#006633]getName[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#009900]}[/COLOR][/FONT]
[/FONT][/COLOR]
بنابراین نام تمامی عکس های (منابع) موجود در پوشه های drawable را در آرایه ای با نام allDrawablesNames خواهیم داشت.

دقت شود که برای استفاده از کد بالا، package زیر را وارد (import) می کنیم (دستور کامل import را نوشته ایم) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]import[/B] [COLOR=#006699]java.lang.reflect.Field[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 
بالا