בפרק זה נצייר צורות על המסך. הפרויקט יזדקק לשורת ג'אווה אחת או שתיים, כשהטיפול בתצוגה (UI - User Interface) נעשה ע"י קבצי xml מספריית res: - קובץ layout וקבצי draw. את קבצי ה-res הצגנו כבר בפרק Hello World.
תוצאת התרגיל לאחר הרצתו על האמולטור מוצגת בתמונה הבאה.
כל קבצי המקור ניתנים להורדה - לחץ על הקישור.
נתחיל עם בחינת קובץ ה- layout המובא להלן. אבל רק עוד רגע לפני כן, עוד כמה מילים על סוגי ה- layout.
ה- layout מכיל מסגרות המגדירות מלבנים של איזור התצוגה. בתוך המלבנים מוגדרים אובייקט או אובייקטים בנים, כמו למשל תיבת טקסט, תמונה, וכיו"ב, והנחיות כיצד למקם את אותם אובייקטים בנים בתוך מסגרת המלבן של ה"אבא". סוגי ה-layout הנפוצים:
- FrameLayout: הבנים שלו כולם מונחים אחד על גבי השני בתוך המלבן המגדיר את המסגרת, כשהם מוצמדים לפינה השמאלית העליונה של התצוגה.
- LinearLayout: הבנים מסודרים בטור או בשורה.
- RelativeLayout: הבנים מסודרים במיקום יחסי לבנים אחרים שבאותו layout.
- TableLayout: מגדיר טבלה עם שורות ועמודות. האובייקטים הבנים המגדירים שורה מסומנים כ TableRow.
- ScrollView - סידור אנכי של האלמנטים, המאפשר גלילה של התצוגה במקרה שגודל התצוגה חורג מגודל הצג הפיזי.
כעת חזרה לקובץ הlayout- שלנו.
- <?xml version="1.0" encoding="utf-8"?>
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <ImageView android:layout_width="fill_parent"
- android:layout_height="50dip"
- android:src="@drawable/shape_1" />
- <ImageView android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/line" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="150dip"
- android:src="@drawable/shape_2" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="50dip"
- android:src="@drawable/shape_3" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/line" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="50dip"
- android:src="@drawable/shape_4" />
- <ImageView
- android:layout_width="fill_parent"
- android:layout_height="50dip"
- android:src="@drawable/shape_5" />
- </LinearLayout>
- </ScrollView>
הסבר:
שורה 2, מגדירה את כל התצוגה כ ScrollView, כך שתתאפשר גלילה של המסך.
שורה 5 מגדירה את סידור המסך כ LinearLayout
כששורה 6 מגדירה את הסידור כאנכי - Vertical, כלומר כל האובייקטים הבנים של ה-Layout החיצוני יסודרו אחד אחרי השני על גבי הציר האנכי.
שורה 7 ו 8 כפי שכבר הוסבר בעבר מגדירות את הסידור של כל אחד מהבנים בתוך המבנה. fill_parent ברוחב משמעותו הקצאה של כל רוחב התצוגה לכל אחד מהאובייקטים. wrap_content באורך משמעותו הקצאה של האורך הדרוש בהתאם לגודל האוביקט.
שורה 9 מגדירה אובייקט מסוג ImageView. האובייקטים מהסוג הזה כוללים הגדרה של רוחב (שורה 9), גובה (שורה 10), והקובץ המכיל את הגדרת הצורה (שורה 11), שם הקובץ shape_1.xml.
נבחן כעת את הקובץ shape_1.xml:
שורה 5 מגדירה את סידור המסך כ LinearLayout
כששורה 6 מגדירה את הסידור כאנכי - Vertical, כלומר כל האובייקטים הבנים של ה-Layout החיצוני יסודרו אחד אחרי השני על גבי הציר האנכי.
שורה 7 ו 8 כפי שכבר הוסבר בעבר מגדירות את הסידור של כל אחד מהבנים בתוך המבנה. fill_parent ברוחב משמעותו הקצאה של כל רוחב התצוגה לכל אחד מהאובייקטים. wrap_content באורך משמעותו הקצאה של האורך הדרוש בהתאם לגודל האוביקט.
שורה 9 מגדירה אובייקט מסוג ImageView. האובייקטים מהסוג הזה כוללים הגדרה של רוחב (שורה 9), גובה (שורה 10), והקובץ המכיל את הגדרת הצורה (שורה 11), שם הקובץ shape_1.xml.
נבחן כעת את הקובץ shape_1.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android"
- type="oval" >
- <solid android:color="#00000000"/>
- <padding android:left="10sp" android:top="4sp" android:right="10sp"
- android:bottom="4sp" />
- <stroke android:width="10dp" android:color="#FFFFFFFF"/>
- </shape>
שורה 3: הגדרת הצורה.
שורה 4: הגדרת הצבע. פורמט ARGB. ראה הרחבה על הפורמט כאן למטה.
שורה -6,5: הגדרת padding בכל ארבעת הכיוונים- ביחידות מדידה ( sp - (scale-independent pixels, שהיא יחידה אבסטרקטית שגודלה תלוי בצפיפות הפיקסלים במסך ובגודל ה- fonts.
שורה 7: מגדירה מסגרת ברוחב 10dp, כאשר
(dp -(density-independent pixels relative to a 160-dpi screen, יחדה שגודלה כגודל פיקסל עבור תצוגה שרוחבה 160 נקודות לאינץ.
בנוגע ליצוג צבעים בפורמט ARGB
יצוג הצבעים בפורמט זה, הידוע גם בכינויו 8888 נעשה ע"י 4 בתים (Bytes):
ה- Byte הראשון: מקדם Alpha קובע את השקיפות, כאשר 0 יתן צבע שקוף בעוד ff יתן צבע אטום.
שלושת ה-Bytes הנותרים קובעים את חלקם של 3 צבעי היסוד (Red, Green, Blue) בגוון.
הנה מספר ערכים עבור צבעים נבחרים:
אדום - 0xffff0000
ירוק - 0xff00ff00
כחול - 0xff0000ff
שחור - 0xff000000
לבן - 0xffffffff
שקוף - 0x00000000
אפור - 0xff888888
אפור כהה - 0xff444444
צהוב - 0xffffff00
חסר לי קישור להשלמת ידע
השבמחקאיזה סוגיי צורות חישוביי צבעים וכולי
נקודה חשובה , כאשר משתמשים בScrollView ניתן להוסיף לו רק בן מסוג אחד ולא כמה , לדוגמה לשגיאה שקיבלתי : ScrollView can host only one direct child
השבמחקהי לאוניד, אתה בהחלט צודק. תודה על העלאת הנקודה. רונן.
השבמחקהי דוד,
השבמחקהוספתי פרטים על קודי הצבעים בהתאם להערתך. תודה, רונן.
i am using the RelativeLayout , you can make the ui like you need. example:
השבמחקandroid:layout_width="100dip"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/ButtonGet"
android:layout_alignTop="@+id/ButtonGet"
android:layout_below="@+id/EditTextPhone"
...
כל הכבוד רונן, הפוסטים מאד ברורים. מה שהכי מצויין, ולא מצאתי באף פוסט בחו"ל, שקודם כל שמת תמונה של התוצאה, וכך אנחנו יכולים לדעת לאן אתה חותר. תמשיך ככה. טלי
השבמחקבלוג מעולה !
השבמחקלא הבנתי, איך אתה מוסיף את הצורות ? יש איזה פקד לצורות ?
שאלה:
השבמחקאיך אתה מתמודד עם הרזולוציות השונות של המכשירים
אני משתמש ב RelativeLayout
במכשיר אחד זה נראה מצוין במכשיר אחר העיצוב נהרס לגמרי(אובייקטים עולים אחד על השני).
יש איזושהי דרך למתוח\לכווץ את התצוגה, כלומר שהתצוגה תהיה זה לכל הרזולוציות?
היי, מצטרף לשאלה של Lirans לגבי רזולוציות שונות.
השבמחקנ.ב מדריך מעולה! ישר כוח!!!
היכן קובץ ה- java? זה מצויין בשורה הראשונה של הפוסט, אך היכן הקובץ ?
השבמחקתודה
ארז
איפה ממקמים את הקובץ shape_1.xml
השבמחקיש ליצור לכל תצוגה בקובץ dimen שלה את הגדלים המתאימים,
מחקולקרוא לגודל כל פעם מקובץ ה-dimen,
כיצד ניתן ליצור עמוד כמו master page?
השבמחק