portaldacalheta.pt
  • หลัก
  • การเพิ่มขึ้นของระยะไกล
  • ผู้คนและทีมงาน
  • การวางแผนและการพยากรณ์
  • การออกแบบ Ux
มือถือ

การปรับแต่ง Android: วิธีสร้างส่วนประกอบ UI ที่ทำในสิ่งที่คุณต้องการ



ไม่ใช่เรื่องแปลกที่นักพัฒนาจะพบว่าตัวเองต้องการไฟล์ หัวหอม ส่วนประกอบที่ไม่ได้จัดเตรียมโดยแพลตฟอร์มที่พวกเขากำหนดเป้าหมายหรือมีให้ แต่ขาดคุณสมบัติหรือพฤติกรรมบางอย่าง คำตอบสำหรับทั้งสองสถานการณ์คือคอมโพเนนต์ UI ที่กำหนดเอง

โมเดล UI ของ Android สามารถปรับแต่งได้โดยเนื้อแท้โดยมีวิธีการ การปรับแต่ง Android , การทดสอบ และความสามารถในการสร้าง คอมโพเนนต์ UI ที่กำหนดเอง ในรูปแบบต่างๆ:



  • สืบทอดองค์ประกอบที่มีอยู่ (เช่น TextView, ImageView ฯลฯ ) และเพิ่ม / แทนที่ฟังก์ชันที่จำเป็น ตัวอย่างเช่น a CircleImageView ที่สืบทอด ImageView แทนที่ onDraw() ฟังก์ชัน จำกัด รูปภาพที่แสดงเป็นวงกลมและเพิ่ม loadFromFile() ฟังก์ชั่นโหลดภาพจากหน่วยความจำภายนอก



  • สร้างส่วนประกอบของสารประกอบ จากหลายองค์ประกอบ วิธีนี้มักจะใช้ประโยชน์จาก เลย์เอาต์ เพื่อควบคุมวิธีการจัดเรียงส่วนประกอบบนหน้าจอ ตัวอย่างเช่น a LabeledEditText ที่สืบทอด LinearLayout ด้วยแนวนอนและมีทั้ง a TextView ทำหน้าที่เป็นป้ายกำกับและ EditText ทำหน้าที่เป็นช่องป้อนข้อความ



    วิธีนี้สามารถใช้ประโยชน์จากแนวทางก่อนหน้านี้ได้เช่นส่วนประกอบภายในอาจเป็นแบบเนทีฟหรือกำหนดเอง

  • แนวทางที่หลากหลายและซับซ้อนที่สุดคือ สร้างส่วนประกอบที่วาดขึ้นเอง . ในกรณีนี้ส่วนประกอบจะสืบทอด View ทั่วไป คลาสและฟังก์ชันแทนที่เช่น onMeasure() เพื่อกำหนดเค้าโครง onDraw() เพื่อแสดงเนื้อหา ฯลฯ ส่วนประกอบที่สร้างด้วยวิธีนี้มักจะขึ้นอยู่กับ Android เป็นอย่างมาก API การวาดภาพ 2D .



กรณีศึกษาการปรับแต่ง Android: CalendarView

Android มีเนทีฟ CalendarView ส่วนประกอบ . ทำงานได้ดีและมีฟังก์ชันการทำงานขั้นต่ำที่คาดหวังจากส่วนประกอบปฏิทินใด ๆ โดยแสดงเดือนเต็มและไฮไลต์วันปัจจุบัน บางคนอาจบอกว่ามันดูดีเช่นกัน แต่ถ้าคุณอยากได้ลุคแบบเนทีฟและไม่สนใจที่จะปรับแต่งรูปลักษณ์ของมันเลย

ตัวอย่างเช่น CalendarView ส่วนประกอบไม่มีวิธีเปลี่ยนวิธีการทำเครื่องหมายวันใดวันหนึ่งหรือสีพื้นหลังที่จะใช้ นอกจากนี้ยังไม่มีวิธีการเพิ่มข้อความหรือกราฟิกที่กำหนดเองเพื่อทำเครื่องหมายในโอกาสพิเศษเป็นต้น กล่าวโดยย่อส่วนประกอบจะมีลักษณะดังนี้และแทบจะไม่สามารถเปลี่ยนแปลงอะไรได้:



ภาพหน้าจอ CalendarView ใน AppCompact.Light ธีม

สร้างของคุณเอง

แล้วจะสร้างมุมมองปฏิทินของตัวเองได้อย่างไร วิธีการใด ๆ ข้างต้นจะได้ผล อย่างไรก็ตามการใช้งานจริงมักจะแยกแยะตัวเลือกที่สาม (กราฟิก 2D) และปล่อยให้เราใช้วิธีการอื่นอีกสองวิธีและเราจะใช้ทั้งสองอย่างผสมกันในบทความนี้



คุณสามารถค้นหาซอร์สโค้ดเพื่อติดตาม ที่นี่ .

1. เค้าโครงส่วนประกอบ

ก่อนอื่นมาเริ่มกันที่ลักษณะของส่วนประกอบ เพื่อให้ง่ายขึ้นให้แสดงวันในตารางและที่ด้านบนสุดชื่อของเดือนพร้อมกับปุ่ม 'เดือนถัดไป' และ 'เดือนก่อนหน้า'



ภาพหน้าจอ มุมมองปฏิทินที่กำหนดเอง

เค้าโครงนี้ถูกกำหนดไว้ในไฟล์ control_calendar.xml ดังต่อไปนี้ โปรดทราบว่ามาร์กอัปซ้ำ ๆ บางส่วนถูกย่อด้วย ...:



... Repeat for MON - SAT.

2. คลาสส่วนประกอบ

สามารถรวมเค้าโครงก่อนหน้าตามที่เป็นอยู่ใน Activity หรือ a Fragment และมันจะทำงานได้ดี แต่การห่อหุ้มเป็นส่วนประกอบ UI แบบสแตนด์อโลนจะป้องกันไม่ให้โค้ดซ้ำและอนุญาตให้มีการออกแบบโมดูลาร์โดยที่แต่ละโมดูลจะจัดการความรับผิดชอบเดียว

คอมโพเนนต์ UI ของเราจะเป็น LinearLayout เพื่อให้ตรงกับรูทของไฟล์เลย์เอาต์ XML โปรดทราบว่าเฉพาะส่วนที่สำคัญเท่านั้นที่จะแสดงจากโค้ด การใช้งานส่วนประกอบอยู่ใน CalendarView.java:

public class CalendarView extends LinearLayout { // internal components private LinearLayout header; private ImageView btnPrev; private ImageView btnNext; private TextView txtDate; private GridView grid; public CalendarView(Context context) { super(context); initControl(context); } /** * Load component XML layout */ private void initControl(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); inflater.inflate(R.layout.control_calendar, this); // layout is inflated, assign local variables to components header = (LinearLayout)findViewById(R.id.calendar_header); btnPrev = (ImageView)findViewById(R.id.calendar_prev_button); btnNext = (ImageView)findViewById(R.id.calendar_next_button); txtDate = (TextView)findViewById(R.id.calendar_date_display); grid = (GridView)findViewById(R.id.calendar_grid); } }

รหัสค่อนข้างตรงไปตรงมา เมื่อสร้างคอมโพเนนต์จะขยายเค้าโครง XML และเมื่อเสร็จแล้วจะกำหนดการควบคุมภายในให้กับตัวแปรโลคัลเพื่อให้เข้าถึงได้ง่ายขึ้นในภายหลัง

3. ตรรกะบางอย่างจำเป็น

เพื่อให้ส่วนประกอบนี้ทำงานเป็นมุมมองปฏิทินได้จริงตรรกะทางธุรกิจบางอย่างจึงเป็นไปตามลำดับ มันอาจจะดูซับซ้อนในตอนแรก แต่ก็มีไม่มากนัก มาดูรายละเอียดกัน:

การปรับประสิทธิภาพของฐานข้อมูลเซิร์ฟเวอร์ sql
  1. มุมมองปฏิทินกว้างเจ็ดวันและรับประกันได้ว่าทุกเดือนจะเริ่มต้นที่ใดที่หนึ่งในแถวแรก

  2. ขั้นแรกเราต้องหาตำแหน่งที่เดือนเริ่มต้นจากนั้นเติมตำแหน่งทั้งหมดก่อนหน้านั้นด้วยตัวเลขจากเดือนก่อนหน้า (30, 29, 28 .. ฯลฯ ) จนกว่าเราจะถึงตำแหน่ง 0

  3. จากนั้นเรากรอกวันสำหรับเดือนปัจจุบัน (1, 2, 3 ... ฯลฯ )

  4. หลังจากนั้นก็มาถึงวันของเดือนถัดไป (อีกครั้ง, 1, 2, 3 .. ฯลฯ ) แต่คราวนี้เราจะเติมตำแหน่งที่เหลือในแถวสุดท้ายของตารางเท่านั้น

แผนภาพต่อไปนี้แสดงขั้นตอนเหล่านี้:

ไฟล์ .cpp คืออะไร

ภาพหน้าจอ ตรรกะทางธุรกิจในมุมมองปฏิทินที่กำหนดเอง

ความกว้างของเส้นตารางถูกระบุไว้แล้วว่าเป็นเซลล์เจ็ดเซลล์ซึ่งแสดงถึงปฏิทินรายสัปดาห์ แต่ความสูงล่ะ? ขนาดที่ใหญ่ที่สุดสำหรับกริดสามารถกำหนดได้จากสถานการณ์กรณีที่เลวร้ายที่สุดของเดือน 31 วันที่เริ่มต้นในวันเสาร์ซึ่งเป็นเซลล์สุดท้ายในแถวแรกและจะต้องเพิ่มอีก 5 แถวเพื่อแสดงแบบเต็ม ดังนั้นการตั้งค่าปฏิทินให้แสดงหกแถว (รวม 42 วัน) จะเพียงพอที่จะรองรับทุกกรณี

แต่ไม่ใช่ทุกเดือนมี 31 วัน! เราสามารถหลีกเลี่ยงภาวะแทรกซ้อนที่เกิดขึ้นได้โดยใช้ฟังก์ชันวันที่ในตัวของ Android โดยไม่ต้องคิดจำนวนวันด้วยตัวเอง

ดังที่ได้กล่าวไว้ก่อนหน้าฟังก์ชันวันที่ที่จัดทำโดย Calendar คลาสทำให้การใช้งานค่อนข้างตรงไปตรงมา ในส่วนประกอบของเรา updateCalendar() ฟังก์ชันใช้ตรรกะนี้:

private void updateCalendar() { ArrayList cells = new ArrayList(); Calendar calendar = (Calendar)currentDate.clone(); // determine the cell for current month's beginning calendar.set(Calendar.DAY_OF_MONTH, 1); int monthBeginningCell = calendar.get(Calendar.DAY_OF_WEEK) - 1; // move calendar backwards to the beginning of the week calendar.add(Calendar.DAY_OF_MONTH, -monthBeginningCell); // fill cells (42 days calendar as per our business logic) while (cells.size()

4. ปรับแต่งได้ที่ Heart

เนื่องจากคอมโพเนนต์ที่รับผิดชอบในการแสดงแต่ละวันคือ GridView สถานที่ที่ดีในการกำหนดวิธีการแสดงวันคือ Adapter เนื่องจากมีหน้าที่ในการเก็บข้อมูลและขยายมุมมองสำหรับเซลล์กริดแต่ละเซลล์

สำหรับตัวอย่างนี้เราต้องการสิ่งต่อไปนี้จาก CalendearView ของเรา:

  • ปัจจุบันควรอยู่ในข้อความสีน้ำเงินตัวหนา.
  • วันที่อยู่นอกเดือนปัจจุบันควรเป็นเป็นสีเทา.
  • วันที่มีกิจกรรมควรแสดงไอคอนพิเศษ
  • ส่วนหัวของปฏิทินควรเปลี่ยนสีตามฤดูกาล (ฤดูร้อนฤดูใบไม้ร่วงฤดูหนาวฤดูใบไม้ผลิ)

ข้อกำหนดสามข้อแรกทำได้ง่ายโดยการเปลี่ยนแอตทริบิวต์ข้อความและทรัพยากรพื้นหลัง มาใช้ CalendarAdapter เพื่อดำเนินงานนี้ ง่ายพอที่จะเป็นคลาสสมาชิกใน CalendarView โดยการแทนที่ getView() ฟังก์ชั่นเราสามารถบรรลุข้อกำหนดข้างต้น:

@Override public View getView(int position, View view, ViewGroup parent) { // day in question Date date = getItem(position); // today Date today = new Date(); // inflate item if it does not exist yet if (view == null) view = inflater.inflate(R.layout.control_calendar_day, parent, false); // if this day has an event, specify event image view.setBackgroundResource(eventDays.contains(date)) ? R.drawable.reminder : 0); // clear styling view.setTypeface(null, Typeface.NORMAL); view.setTextColor(Color.BLACK); if (date.getMonth() != today.getMonth() || date.getYear() != today.getYear()) { // if this day is outside current month, grey it out view.setTextColor(getResources().getColor(R.color.greyed_out)); } else if (date.getDate() == today.getDate()) { // if it is today, set it to blue/bold view.setTypeface(null, Typeface.BOLD); view.setTextColor(getResources().getColor(R.color.today)); } // set text view.setText(String.valueOf(date.getDate())); return view; }

ข้อกำหนดการออกแบบขั้นสุดท้ายใช้เวลาทำงานมากขึ้นเล็กน้อย ก่อนอื่นเรามาเพิ่มสีของฤดูกาลทั้งสี่ใน /res/values/colors.xml:

#44eebd82 #44d8d27e #44a1c1da #448da64b

จากนั้นเรามาใช้อาร์เรย์เพื่อกำหนดฤดูกาลสำหรับแต่ละเดือน (สมมติว่าเป็นซีกโลกเหนือเพื่อความเรียบง่ายขออภัยออสเตรเลีย!) ใน CalendarView เราเพิ่มตัวแปรสมาชิกต่อไปนี้:

// seasons' rainbow int[] rainbow = new int[] { R.color.summer, R.color.fall, R.color.winter, R.color.spring }; int[] monthSeason = new int[] {2, 2, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2};

ด้วยวิธีนี้การเลือกสีที่เหมาะสมทำได้โดยการเลือกฤดูกาลที่เหมาะสม (monthSeason[currentMonth]) จากนั้นเลือกสีที่ตรงกัน (rainbow[monthSeason[currentMonth]) ซึ่งจะถูกเพิ่มลงใน updateCalendar() เพื่อให้แน่ใจว่าได้เลือกสีที่เหมาะสมเมื่อใดก็ตามที่ปฏิทินมีการเปลี่ยนแปลง

// set header color according to current season int month = currentDate.get(Calendar.MONTH); int season = monthSeason[month]; int color = rainbow[season]; header.setBackgroundColor(getResources().getColor(color));

ด้วยเหตุนี้เราจึงได้ผลลัพธ์ดังต่อไปนี้:

การปรับแต่ง Android สีของส่วนหัวจะเปลี่ยนไปตามฤดูกาล

โน๊ตสำคัญ เนื่องจากวิธี HashSet เปรียบเทียบวัตถุตรวจสอบด้านบน eventDays.contains(date) ใน updateCalendar() จะไม่ให้ค่าเป็นจริงสำหรับออบเจ็กต์วันที่เว้นแต่จะเหมือนกันทุกประการ จะไม่ทำการตรวจสอบพิเศษใด ๆ สำหรับ Date ประเภทข้อมูล. ในการหลีกเลี่ยงปัญหานี้การตรวจสอบนี้จะถูกแทนที่ด้วยรหัสต่อไปนี้:

for (Date eventDate : eventDays) { if (eventDate.getDate() == date.getDate() && eventDate.getMonth() == date.getMonth() && eventDate.getYear() == date.getYear()) { // mark this day for event view.setBackgroundResource(R.drawable.reminder); break; } }

5. เวลาออกแบบมันดูน่าเกลียด

ตัวเลือกของ Android สำหรับตัวยึดตำแหน่งในเวลาออกแบบอาจเป็นเรื่องที่น่าสงสัย โชคดีที่ Android สร้างอินสแตนซ์คอมโพเนนต์ของเราเพื่อแสดงผลในตัวออกแบบ UI และเราสามารถใช้ประโยชน์จากสิ่งนี้ได้โดยเรียก updateCalendar() ในตัวสร้างส่วนประกอบ วิธีนี้ส่วนประกอบจะสมเหตุสมผลในเวลาออกแบบ

ภาพหน้าจอ

หากการเริ่มต้นคอมโพเนนต์เรียกร้องให้มีการประมวลผลจำนวนมากหรือโหลดข้อมูลจำนวนมากอาจส่งผลต่อประสิทธิภาพของ IDE ในกรณีนี้ Android มีฟังก์ชันที่ดีที่เรียกว่า isInEditMode() ที่สามารถใช้เพื่อ จำกัด ปริมาณข้อมูลที่ใช้เมื่อคอมโพเนนต์ถูกสร้างอินสแตนซ์ในตัวออกแบบ UI ตัวอย่างเช่นหากมีเหตุการณ์มากมายให้โหลดลงใน CalendarView เราสามารถใช้ isInEditMode() ภายใน updateCalendar() ฟังก์ชันเพื่อจัดเตรียมรายการเหตุการณ์ว่าง / จำกัด ในโหมดออกแบบและโหลดรายการจริงไม่เช่นนั้น

6. การเรียกใช้ส่วนประกอบ

ส่วนประกอบสามารถรวมอยู่ในไฟล์เลย์เอาต์ XML (ตัวอย่างการใช้งานสามารถพบได้ใน activity_main.xml):

HashSet events = new HashSet(); events.add(new Date()); CalendarView cv = ((CalendarView)findViewById(R.id.calendar_view)); cv.updateCalendar(events);

และดึงมาเพื่อโต้ตอบเมื่อโหลดเลย์เอาต์:

HashSet

โค้ดด้านบนสร้าง CalendarView ของเหตุการณ์เพิ่มวันปัจจุบันเข้าไปแล้วส่งต่อไปที่ CalendarView เป็นผลให้ CalendarView จะแสดงวันปัจจุบันเป็นสีน้ำเงินตัวหนาและใส่เครื่องหมายเหตุการณ์ไว้ด้วย:

ภาพหน้าจอ CalendarView การแสดงเหตุการณ์

7. การเพิ่มคุณสมบัติ

สิ่งอำนวยความสะดวกอื่นที่ Android มีให้คือการกำหนดแอตทริบิวต์ให้กับส่วนประกอบที่กำหนดเอง สิ่งนี้ช่วยให้ นักพัฒนา Android โดยใช้ส่วนประกอบเพื่อเลือกการตั้งค่าผ่าน XML เค้าโครงและดูผลลัพธ์ทันทีในตัวออกแบบ UI ซึ่งต่างจากที่ต้องรอดูว่า dateFormat ดูเหมือนในรันไทม์ มาเพิ่มความสามารถในการเปลี่ยนการแสดงรูปแบบวันที่ในส่วนประกอบเช่นสะกดชื่อเต็มของเดือนแทนตัวย่อสามตัวอักษร

ในการดำเนินการนี้จำเป็นต้องมีขั้นตอนต่อไปนี้:

  • ประกาศแอตทริบิวต์ เรียกว่า string และให้ /res/values/attrs.xml ประเภทข้อมูล. เพิ่มไปที่ 'MMMM yyyy':
TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.CalendarView); dateFormat = ta.getString(R.styleable.CalendarView_dateFormat);
  • ใช้แอตทริบิวต์ในเค้าโครงที่ใช้ส่วนประกอบและให้ค่าเป็น CalendarView:
Fragment
  • สุดท้ายให้ส่วนประกอบใช้ประโยชน์จากค่าแอตทริบิวต์:
Activity

] สร้างโครงการและคุณจะสังเกตเห็นการเปลี่ยนแปลงวันที่ที่แสดงในไฟล์ ตัวออกแบบ UI ใช้ชื่อเต็มของเดือนเช่น“ กรกฎาคม 2015” ลองระบุค่าต่างๆและดูว่าเกิดอะไรขึ้น

ภาพหน้าจอ การเปลี่ยน // long-pressing a day grid.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView view, View cell, int position, long id) { // handle long-press if (eventHandler == null) return false; Date date = view.getItemAtPosition(position); eventHandler.onDayLongPress(date); return true; } }); คุณลักษณะ.

8. การโต้ตอบกับคอมโพเนนต์

คุณได้ลองกดในวันใดวันหนึ่งแล้วหรือยัง? องค์ประกอบ UI ภายในในคอมโพเนนต์ของเรายังคงทำงานตามปกติและจะเริ่มการทำงานของเหตุการณ์เพื่อตอบสนองต่อการกระทำของผู้ใช้ แล้วเราจะจัดการกับเหตุการณ์เหล่านั้นอย่างไร?

คำตอบเกี่ยวข้องกับสองส่วน:

  • จับภาพเหตุการณ์ภายในองค์ประกอบและ
  • รายงานเหตุการณ์ไปยังพาเรนต์ของคอมโพเนนต์ (อาจเป็น eventHandler, CalendarView หรือแม้แต่คอมโพเนนต์อื่น)

ส่วนแรกค่อนข้างตรงไปตรงมา ตัวอย่างเช่นในการจัดการรายการตารางที่กดยาวเรากำหนด Listener ที่เกี่ยวข้องในคลาสส่วนประกอบของเรา:

public interface EventHandler { void onDayLongPress(Date date); }

มีหลายวิธีในการรายงานเหตุการณ์ สิ่งที่ง่ายและตรงไปตรงมาคือการคัดลอกวิธีที่ Android ทำ: มีอินเทอร์เฟซสำหรับเหตุการณ์ของคอมโพเนนต์ที่นำไปใช้โดยพาเรนต์ของคอมโพเนนต์ (setEventHandler() ในข้อมูลโค้ดด้านบน)

ฟังก์ชันของอินเทอร์เฟซสามารถส่งผ่านข้อมูลใด ๆ ที่เกี่ยวข้องกับแอปพลิเคชัน ในกรณีของเราอินเทอร์เฟซจำเป็นต้องแสดงตัวจัดการเหตุการณ์หนึ่งตัวซึ่งส่งผ่านวันที่สำหรับวันที่กด อินเทอร์เฟซต่อไปนี้ถูกกำหนดไว้ใน @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); HashSet events = new HashSet(); events.add(new Date()); CalendarView cv = ((CalendarView)findViewById(R.id.calendar_view)); cv.updateCalendar(events); // assign event handler cv.setEventHandler(new CalendarView.EventHandler() { @Override public void onDayLongPress(Date date) { // show returned day DateFormat df = SimpleDateFormat.getDateInstance(); Toast.makeText(MainActivity.this, df.format(date), LENGTH_SHORT).show(); } }); } :

GridView

การนำไปใช้โดยผู้ปกครองสามารถส่งไปยังมุมมองปฏิทินผ่านทาง onDayLongPress() นี่คือตัวอย่างการใช้งานจาก `MainActivity.java ':

Intents

การกดนานวันจะทำให้เหตุการณ์กดยาวที่จับและจัดการโดย BroadcastReceivers และรายงานโดยโทร Activity ในการใช้งานที่จัดเตรียมไว้ซึ่งจะแสดงวันที่ของวันที่กดบนหน้าจอ:

ภาพหน้าจอ

อีกวิธีหนึ่งขั้นสูงในการจัดการปัญหานี้คือการใช้ Android Service และ Activity . สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อจำเป็นต้องแจ้งให้ส่วนประกอบหลายอย่างเกี่ยวกับกิจกรรมของปฏิทิน ตัวอย่างเช่นหากการกดวันในปฏิทินต้องการให้แสดงข้อความใน EventHandler และไฟล์ที่จะดาวน์โหลดโดยใช้พื้นหลัง Service.

การใช้แนวทางก่อนหน้านี้จะต้องใช้ Intent เพื่อให้ Activity ไปยังคอมโพเนนต์จัดการเหตุการณ์แล้วส่งต่อไปยัง Service ให้คอมโพเนนต์ออกอากาศเป็น BroadcastReceivers แทน และทั้ง Activity และ Service รับผ่านทาง isInEditMode() ไม่เพียง แต่ทำให้ชีวิตง่ายขึ้น แต่ยังช่วยแยก

|_+_|
และ
|_+_|
ในคำถาม.

สรุป

ดูพลังที่ยอดเยี่ยมของการปรับแต่ง Android! ทวีต

ดังนั้นนี่คือวิธีสร้างส่วนประกอบที่กำหนดเองของคุณเองในไม่กี่ขั้นตอนง่ายๆ:

  • สร้างเค้าโครง XML และจัดรูปแบบให้เหมาะกับความต้องการของคุณ
  • รับคลาสคอมโพเนนต์ของคุณจากคอมโพเนนต์พาเรนต์ที่เหมาะสมตามเค้าโครง XML ของคุณ
  • เพิ่มตรรกะทางธุรกิจของส่วนประกอบของคุณ
  • ใช้แอตทริบิวต์เพื่อให้ผู้ใช้ปรับเปลี่ยนพฤติกรรมของคอมโพเนนต์
  • เพื่อให้ง่ายต่อการใช้คอมโพเนนต์ในตัวออกแบบ UI ให้ใช้
    |_+_|
    ของ Android ฟังก์ชัน

ในบทความนี้เราได้สร้างมุมมองปฏิทินไว้เป็นตัวอย่างส่วนใหญ่เนื่องจากไม่มีมุมมองปฏิทินหุ้นในหลาย ๆ ด้าน แต่คุณไม่มีข้อ จำกัด ว่าจะสร้างส่วนประกอบประเภทใดได้บ้าง คุณสามารถใช้เทคนิคเดียวกันเพื่อสร้างทุกสิ่งที่คุณต้องการท้องฟ้ามีขีด จำกัด !

หลักการกำหนดรูปแบบการออกแบบ

ขอขอบคุณที่อ่านคู่มือนี้ขอให้คุณโชคดีในการเขียนโค้ด!

พลังแห่งการสัมผัส - วิวัฒนาการของการออกแบบปุ่ม (พร้อมอินโฟกราฟิก)

การออกแบบ Ux

พลังแห่งการสัมผัส - วิวัฒนาการของการออกแบบปุ่ม (พร้อมอินโฟกราฟิก)
อิทธิพลจากการออกแบบ - คำแนะนำเกี่ยวกับสีและอารมณ์

อิทธิพลจากการออกแบบ - คำแนะนำเกี่ยวกับสีและอารมณ์

เครื่องมือและบทช่วยสอน

โพสต์ยอดนิยม
ความจริงเสมือนในอุตสาหกรรมยานยนต์
ความจริงเสมือนในอุตสาหกรรมยานยนต์
วิธีใช้ Bootstrap และสร้าง. NET Projects
วิธีใช้ Bootstrap และสร้าง. NET Projects
วิธีทำความเข้าใจและประเมินการลงทุนในกองทุนอสังหาริมทรัพย์ส่วนบุคคล
วิธีทำความเข้าใจและประเมินการลงทุนในกองทุนอสังหาริมทรัพย์ส่วนบุคคล
4 ไปวิจารณ์ภาษา
4 ไปวิจารณ์ภาษา
ข้อมูลเบื้องต้นเกี่ยวกับ Magento: การนำทางในระบบนิเวศอีคอมเมิร์ซยอดนิยม
ข้อมูลเบื้องต้นเกี่ยวกับ Magento: การนำทางในระบบนิเวศอีคอมเมิร์ซยอดนิยม
 
วีซ่า H-1B: การเดินทางของนักพัฒนา iOS จากฮอนดูรัสไปยัง Silicon Valley
วีซ่า H-1B: การเดินทางของนักพัฒนา iOS จากฮอนดูรัสไปยัง Silicon Valley
ข้อผิดพลาดทั่วไปในการสื่อสารกับลูกค้า: จะไม่ทำให้ลูกค้าของคุณผิดหวังได้อย่างไร
ข้อผิดพลาดทั่วไปในการสื่อสารกับลูกค้า: จะไม่ทำให้ลูกค้าของคุณผิดหวังได้อย่างไร
การออกแบบที่คาดหวัง: วิธีสร้างประสบการณ์ผู้ใช้ที่มีมนต์ขลัง
การออกแบบที่คาดหวัง: วิธีสร้างประสบการณ์ผู้ใช้ที่มีมนต์ขลัง
กราฟิก 3 มิติ: บทช่วยสอน WebGL
กราฟิก 3 มิติ: บทช่วยสอน WebGL
การออกแบบ VUI - Voice User Interface
การออกแบบ VUI - Voice User Interface
โพสต์ยอดนิยม
  • เทมเพลตคู่มือสไตล์อินเทอร์เฟซผู้ใช้
  • เมื่อนำหลักการออกแบบของรายการที่เกี่ยวข้องกับ __________ มารวมกลุ่มเข้าด้วยกัน
  • ขั้นตอนที่สำคัญที่สุดในการวิเคราะห์โครงการคือ:
  • แอตทริบิวต์คลาสเทียบกับแอตทริบิวต์อินสแตนซ์ python
  • สัญญาเทียบกับเครื่องคิดเลขเงินเดือนเต็มเวลา
  • การพัฒนาซอฟต์แวร์ c++
หมวดหมู่
  • การเพิ่มขึ้นของระยะไกล
  • ผู้คนและทีมงาน
  • การวางแผนและการพยากรณ์
  • การออกแบบ Ux
  • © 2022 | สงวนลิขสิทธิ์

    portaldacalheta.pt