การออกแบบภาพที่ดีเป็นสิ่งสำคัญสำหรับแอปที่ประสบความสำเร็จ และรูปแบบสีเป็นองค์ประกอบหลักของการออกแบบ ไลบรารี Palette เป็นไลบรารี Jetpack ที่ดึงสีที่โดดเด่นจากรูปภาพเพื่อสร้างแอปที่ดึงดูดสายตา
คุณสามารถใช้ไลบรารี Palette เพื่อออกแบบธีมเลย์เอาต์และใช้สีแบบกำหนดเองกับองค์ประกอบภาพในแอปได้ เช่น คุณสามารถใช้จานสีเพื่อสร้างการ์ดไตเติ้ลที่มีสีสอดคล้องกันสำหรับเพลงโดยอิงตามปกอัลบั้ม หรือเพื่อปรับสีแถบเครื่องมือของแอปเมื่อภาพพื้นหลังเปลี่ยนไป ออบเจ็กต์ Palette ช่วยให้คุณเข้าถึงสีในรูปภาพ Bitmap ได้ และยังมีโปรไฟล์สีหลัก 6 โปรไฟล์จากบิตแมปเพื่อช่วยในการเลือกดีไซน์
ตั้งค่าคลัง
หากต้องการใช้ไลบรารี Palette ให้เพิ่มโค้ดต่อไปนี้ลงใน build.gradle
Kotlin
android { compileSdkVersion(36) ... } dependencies { ... implementation("androidx.palette:palette:1.0.0") }
ดึงดูด
android { compileSdkVersion 36 ... } dependencies { ... implementation 'androidx.palette:palette:1.0.0' }
สร้างจานสี
ออบเจ็กต์ Palette ช่วยให้คุณเข้าถึงสีหลักในรูปภาพ รวมถึงสีที่สอดคล้องกันสำหรับข้อความที่วางซ้อน ใช้ชุดสีเพื่อออกแบบสไตล์ของแอปและเปลี่ยนรูปแบบสีของแอปแบบไดนามิกตามรูปภาพต้นฉบับที่ระบุ
หากต้องการสร้างชุดสี ให้สร้างอินสแตนซ์ Palette.Builder จาก Bitmap ก่อน จากนั้นคุณจะใช้ Palette.Builder เพื่อปรับแต่งจานสีก่อนสร้างได้ ส่วนนี้จะอธิบายการสร้างและการปรับแต่งจานสีจากภาพบิตแมป
สร้างอินสแตนซ์ Palette
สร้างอินสแตนซ์ Palette โดยใช้เมธอด from(Bitmap bitmap) เพื่อสร้าง Palette.Builder จาก Bitmap ก่อน
เครื่องมือสร้างสามารถสร้างจานสีแบบซิงโครนัสหรือแบบอะซิงโครนัสได้ ใช้การสร้างชุดสีแบบซิงโครนัสหากต้องการสร้างชุดสีในชุดข้อความเดียวกับเมธอดที่เรียกใช้ หากคุณสร้างจานสีแบบอะซิงโครนัสในชุดข้อความอื่น ให้ใช้เมธอด onGenerated() เพื่อเข้าถึงจานสีทันทีหลังจากสร้าง
ข้อมูลโค้ดต่อไปนี้แสดงตัวอย่างเมธอดสำหรับการสร้างจานสีทั้ง 2 ประเภท
Kotlin
// Generate palette synchronously and return it. fun createPaletteSync(bitmap: Bitmap): Palette = Palette.from(bitmap).generate() // Generate palette asynchronously and use it on a different thread using onGenerated(). fun createPaletteAsync(bitmap: Bitmap) { Palette.from(bitmap).generate { palette -> // Use generated instance. } }
Java
// Generate palette synchronously and return it. public Palette createPaletteSync(Bitmap bitmap) { Palette p = Palette.from(bitmap).generate(); return p; } // Generate palette asynchronously and use it on a different thread using onGenerated(). public void createPaletteAsync(Bitmap bitmap) { Palette.from(bitmap).generate(new PaletteAsyncListener() { public void onGenerated(Palette p) { // Use generated instance. } }); }
หากต้องการสร้างจานสีสำหรับรายการรูปภาพหรือออบเจ็กต์ที่จัดเรียงอย่างต่อเนื่อง ให้พิจารณาแคชอินสแตนซ์ Palette เพื่อป้องกันไม่ให้ประสิทธิภาพของ UI ช้าลง อย่าสร้างจานสีในเธรดหลัก
ปรับแต่งชุดสี
Palette.Builderช่วยให้คุณปรับแต่งจานสีได้โดยเลือกจำนวนสีในจานสีที่ได้ พื้นที่ของรูปภาพที่เครื่องมือสร้างใช้เพื่อสร้างจานสี และสีที่รวมอยู่ในจานสี เช่น คุณสามารถกรองสีดำออกหรือตรวจสอบว่าเครื่องมือสร้างใช้เฉพาะครึ่งบนของรูปภาพเพื่อสร้างจานสี
ปรับแต่งขนาดและสีของจานสีด้วยเมธอดต่อไปนี้จากคลาส Palette.Builder
addFilter()- เมธอดนี้จะเพิ่มตัวกรองที่ระบุสีที่อนุญาตในชุดสีที่ได้ ส่ง
Palette.Filterของคุณเองและแก้ไขเมธอดisAllowed()เพื่อกำหนดสีที่จะกรองออกจากชุดสี maximumColorCount()- วิธีนี้จะกำหนดจำนวนสีสูงสุดในชุดสี ค่าเริ่มต้นคือ 16 และค่าที่เหมาะสมที่สุดจะขึ้นอยู่กับรูปภาพต้นฉบับ สำหรับภาพทิวทัศน์ ค่าที่เหมาะสมจะอยู่ในช่วง 8-16 ส่วนภาพที่มีใบหน้ามักจะมีค่าตั้งแต่ 24-32
Palette.Builderจะใช้เวลานานกว่าในการสร้างจานสีที่มีสีมากกว่า setRegion()- วิธีนี้จะระบุพื้นที่ของบิตแมปที่เครื่องมือสร้างใช้เมื่อสร้างจานสี คุณจะใช้วิธีนี้ได้เฉพาะเมื่อสร้างจานสีจากบิตแมป และวิธีนี้จะไม่ส่งผลต่อรูปภาพต้นฉบับ
addTarget()- วิธีนี้ช่วยให้คุณจับคู่สีได้เองโดยเพิ่ม
Targetโปรไฟล์สีลงในเครื่องมือสร้าง หากTargetเริ่มต้นไม่เพียงพอ นักพัฒนาซอฟต์แวร์ขั้นสูงสามารถสร้างTargetของตนเองได้โดยใช้Target.Builder
ดึงข้อมูลโปรไฟล์สี
ไลบรารี Palette จะดึงโปรไฟล์สีที่ใช้กันโดยทั่วไปจากรูปภาพโดยอิงตามมาตรฐานของ Material Design แต่ละโปรไฟล์จะกำหนดโดย Target และสีที่ดึงมาจากรูปภาพบิตแมปจะได้รับการให้คะแนนเทียบกับแต่ละโปรไฟล์โดยอิงตามความอิ่มตัว ความสว่าง และจำนวนประชากร (จำนวนพิกเซลในบิตแมปที่แสดงด้วยสี) สำหรับแต่ละโปรไฟล์ สีที่มีคะแนนดีที่สุดจะเป็นตัวกำหนดโปรไฟล์สีนั้นสำหรับรูปภาพที่ระบุ
โดยค่าเริ่มต้น ออบเจ็กต์ Palette จะมีสีหลัก 16 สีจากรูปภาพที่ระบุ เมื่อสร้างจานสี คุณสามารถปรับแต่งจำนวนสีได้โดยใช้ Palette.Builder การดึงสีออกมามากขึ้นจะทำให้มีสีที่อาจตรงกันมากขึ้นสำหรับโปรไฟล์สีแต่ละโปรไฟล์ แต่ก็ทำให้ Palette.Builder ใช้เวลานานขึ้นเมื่อสร้างชุดสี
ไลบรารี Palette จะพยายามดึงโปรไฟล์สี 6 รายการต่อไปนี้
- สีสดใสสว่าง
- ฉูดฉาด
- สีเข้มสดใส
- ปิดเสียงแล้ว
- ปิดเสียง
- สีเข้มหม่น
เมธอด get<Profile>Color() แต่ละรายการใน Palette จะแสดงผลสีในจานสีที่เชื่อมโยงกับโปรไฟล์นั้นๆ โดยที่ <Profile> จะถูกแทนที่ด้วยชื่อของโปรไฟล์สี 1 ใน 6 รายการ เช่น วิธีรับโปรไฟล์สี Dark Vibrant คือ getDarkVibrantColor()
เนื่องจากรูปภาพบางรูปอาจไม่มีโปรไฟล์สีทั้งหมด ให้ระบุสีเริ่มต้นที่จะแสดงผล
รูปที่ 1 แสดงรูปภาพและโปรไฟล์สีที่เกี่ยวข้องจากเมธอด get<Profile>Color()
ใช้แถบสีเพื่อสร้างรูปแบบสี
คลาส Palette ยังสร้างออบเจ็กต์ Palette.Swatch สำหรับโปรไฟล์สีแต่ละโปรไฟล์ด้วย ออบเจ็กต์ Palette.Swatch มีสีที่เชื่อมโยงสำหรับโปรไฟล์นั้น รวมถึงจำนวนพิกเซลของสีนั้น
ตัวอย่างสีมีเมธอดเพิ่มเติมสำหรับการเข้าถึงข้อมูลเพิ่มเติมเกี่ยวกับโปรไฟล์สี เช่น ค่า HSL และจำนวนพิกเซล คุณสามารถใช้แถบสีเพื่อช่วยสร้างรูปแบบสีและธีมแอปที่ครอบคลุมมากขึ้นโดยใช้วิธี getBodyTextColor() และ getTitleTextColor() เมธอดเหล่านี้จะแสดงสีที่เหมาะสมสำหรับการใช้งานเหนือสีของแถบสี
แต่ละเมธอด get<Profile>Swatch() จาก Palette จะแสดงผลแถบสีที่เชื่อมโยงกับโปรไฟล์นั้นๆ โดยที่ <Profile> จะแทนที่ด้วยชื่อของโปรไฟล์สี 1 ใน 6 โปรไฟล์ แม้ว่าเมธอด get<Profile>Swatch() ของจานสีจะไม่ต้องใช้พารามิเตอร์ค่าเริ่มต้น แต่จะแสดงผล null หากไม่มีโปรไฟล์นั้นในรูปภาพ ดังนั้นให้ตรวจสอบว่าแถบสีไม่เป็นค่าว่างก่อนที่จะใช้ ตัวอย่างเช่น โค้ดต่อไปนี้จะรับสีข้อความชื่อจากจานสีหากตัวอย่างสี Vibrant ไม่ใช่ค่า Null
Kotlin
val vibrant = myPalette.vibrantSwatch // In Kotlin, check for null before accessing properties on the vibrant swatch. val titleColor = vibrant?.titleTextColor
Java
Palette.Swatch vibrant = myPalette.getVibrantSwatch(); if(vibrant != null){ int titleColor = vibrant.getTitleTextColor(); // ... }
หากต้องการเข้าถึงสีทั้งหมดในชุดสี เมธอด getSwatches() จะแสดงรายการตัวอย่างสีทั้งหมดที่สร้างจากรูปภาพ รวมถึงโปรไฟล์สีมาตรฐาน 6 โปรไฟล์
ข้อมูลโค้ดต่อไปนี้ใช้เมธอดจากข้อมูลโค้ดก่อนหน้าเพื่อสร้างจานสีแบบซิงโครนัส รับตัวอย่างสีสดใส และเปลี่ยนสีของแถบเครื่องมือให้ตรงกับรูปภาพบิตแมป รูปที่ 2 แสดงรูปภาพและแถบเครื่องมือที่ได้
Kotlin
// Set the background and text colors of a toolbar given a bitmap image to // match. fun setToolbarColor(bitmap: Bitmap) { // Generate the palette and get the vibrant swatch. val vibrantSwatch = createPaletteSync(bitmap).vibrantSwatch // Set the toolbar background and text colors. // Fall back to default colors if the vibrant swatch isn't available. with(findViewById<Toolbar>(R.id.toolbar)) { setBackgroundColor(vibrantSwatch?.rgb ?: ContextCompat.getColor(context, R.color.default_title_background)) setTitleTextColor(vibrantSwatch?.titleTextColor ?: ContextCompat.getColor(context, R.color.default_title_color)) } }
Java
// Set the background and text colors of a toolbar given a bitmap image to // match. public void setToolbarColor(Bitmap bitmap) { // Generate the palette and get the vibrant swatch. // See the createPaletteSync() method from the preceding code snippet. Palette p = createPaletteSync(bitmap); Palette.Swatch vibrantSwatch = p.getVibrantSwatch(); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); // Load default colors. int backgroundColor = ContextCompat.getColor(getContext(), R.color.default_title_background); int textColor = ContextCompat.getColor(getContext(), R.color.default_title_color); // Check that the Vibrant swatch is available. if(vibrantSwatch != null){ backgroundColor = vibrantSwatch.getRgb(); textColor = vibrantSwatch.getTitleTextColor(); } // Set the toolbar background and text colors. toolbar.setBackgroundColor(backgroundColor); toolbar.setTitleTextColor(textColor); }