Mipmap drawables cho các biểu tượng


449

Kể từ Android 4.3 (Jelly Bean), giờ đây chúng ta có thể sử dụng các res/mipmapthư mục để lưu trữ hình ảnh "mipmap".

Ví dụ: Chrome cho Android lưu trữ các biểu tượng của nó trong các thư mục này thay vì các res/drawablethư mục bình thường hơn .

Những hình ảnh mipmap này khác với những hình ảnh có thể vẽ quen thuộc khác như thế nào?

Tôi thấy rằng trong bảng kê khai của mình, chúng tôi sử dụng @mipmap/vòng loại, thay vì @drawable/, có nghĩa là được đặt tên thư mục tài nguyên:

<activity
    android:name=".MipmapDemp"
    android:icon="@mipmap/ic_launcher" />

Người giới thiệu:

Các Android 4.3 API tài liệu có những điều sau đây để nói:

Sử dụng mipmap làm nguồn cho bitmap hoặc drawable của bạn là một cách đơn giản để cung cấp hình ảnh chất lượng và các tỷ lệ hình ảnh khác nhau, có thể đặc biệt hữu ích nếu bạn mong muốn hình ảnh của mình được thu nhỏ trong khi hoạt hình.

Android 4.2 (API cấp 17) đã thêm hỗ trợ cho mipmap trong lớp Bitmap Android Android hoán đổi hình ảnh mip trong Bitmap của bạn khi bạn đã cung cấp nguồn mipmap và đã bật setHasMipMap (). Giờ đây trong Android 4.3, bạn cũng có thể bật mipmap cho một đối tượng BitmapDrawable, bằng cách cung cấp tài sản mipmap và đặt thuộc tính android: mipMap trong tệp tài nguyên bitmap hoặc bằng cách gọi hasMipMap ().

Tôi không thấy bất cứ điều gì trong đó giúp tôi hiểu.


Tài nguyên Bitmap XML có một thuộc android:mipMaptính:

Boolean. Cho phép hoặc vô hiệu hóa gợi ý mipmap. Xem setHasMipMap () để biết thêm thông tin. Giá trị mặc định là sai.

Điều này không áp dụng cho các biểu tượng launcher như xa như tôi có thể thấy.


Câu hỏi được đặt ra trên Google Groups ( Mục đích của tên tài nguyên "mipmap"?! ), Mà Romain Guy đã trả lời:

Thật hữu ích khi cung cấp hình ảnh ở độ phân giải lớn hơn thường được tính toán (ví dụ: trên thiết bị mdpi, Trình khởi chạy có thể muốn biểu tượng hdpi lớn hơn hiển thị các phím tắt ứng dụng lớn.)

Tôi cảm thấy như điều này gần như có ý nghĩa của nó, nhưng không hoàn toàn.

Tôi vẫn có xu hướng theo dõi Randy Sugianto:

Những lợi thế của điều này là gì? Có hướng dẫn nào về cách sử dụng mipmap, có thể cho các biểu tượng launcher tốt hơn không?


Tất nhiên, Wikipedia có một trang cho "Mipmap" , đề cập đến một kỹ thuật cũ hơn được phát minh vào năm 1983, mà tôi hoàn toàn không liên quan đến việc triển khai Android hiện tại.


Chúng ta có nên lưu trữ tất cả các biểu tượng ứng dụng của mình trong res/mipmapcác thư mục ngày nay không, và hướng dẫn cho những hình ảnh mipmap này là gì?


Cập nhật số 1

Đây là một bài viết trên blog cố gắng giải thích nó một chút.

Nhưng hình ảnh được sử dụng trong bài đăng trên blog đó cho thấy những gì trông giống như một tệp có nhiều logo trong đó. Đây không phải là những gì tôi thấy trong thư mục mipmap của Chrome.

mipmap-hdpiThư mục của Chrome chứa ba hình ảnh. Một là logo Chrome, trên chính nó.

Chrome mipmap-hdpi icon.png

Kỳ lạ thay, nó là 72x72, không phải 48x48 mà tôi mong đợi được thấy.

Có lẽ đó là tất cả để làm điều này - chúng ta chỉ cần giữ các biểu tượng lớn hơn trong các thư mục mipmap?


Cập nhật số 2

Bài đăng trên Blog dành cho nhà phát triển Android ngày 23/10/2014 một lần nữa xác nhận ý tưởng sử dụng các mipmapthư mục cho các biểu tượng ứng dụng:

Khi nói về mật độ màn hình Nexus 6, tác giả viết:

Cách tốt nhất là đặt các biểu tượng ứng dụng của bạn trong các thư mục mipmap- (không phải các thư mục có thể vẽ được) vì chúng được sử dụng ở độ phân giải khác với mật độ hiện tại của thiết bị. Ví dụ: biểu tượng ứng dụng xxxhdpi có thể được sử dụng trên trình khởi chạy cho thiết bị xxhdpi.


Cập nhật số 3

Lưu ý rằng Android Studio tạo các ic_launcher.pngbiểu tượng trong các mipmap...thư mục thay vì các drawable...thư mục mà Eclipse đã sử dụng để tạo chúng trong đó.


Câu trả lời:


260

Có hai cách sử dụng mipmap khác nhau:

  1. Đối với các biểu tượng trình khởi chạy khi xây dựng các APK cụ thể mật độ. Một số nhà phát triển xây dựng APK riêng cho mọi mật độ, để giảm kích thước APK. Tuy nhiên, một số trình khởi chạy (được cung cấp cùng với một số thiết bị hoặc có sẵn trên Cửa hàng Play) sử dụng kích thước biểu tượng lớn hơn 48dp tiêu chuẩn. Các trình khởi chạy sử dụng getDrawableForD mật độ và thu nhỏ lại nếu cần, thay vì lên, vì vậy các biểu tượng có chất lượng cao. Ví dụ: trên máy tính bảng hdpi, trình khởi chạy có thể tải biểu tượng xhdpi. Bằng cách đặt biểu tượng trình khởi chạy của bạn trong thư mục mipmap-xhdpi, nó sẽ không bị tước theo cách thư mục drawable-xhdpi khi xây dựng APK cho các thiết bị hdpi. Nếu bạn đang xây dựng một APK duy nhất cho tất cả các thiết bị, thì điều này thực sự không quan trọng vì trình khởi chạy có thể truy cập các tài nguyên có thể rút được với mật độ mong muốn.

  2. API mipmap thực tế từ 4.3. Tôi đã không sử dụng nó và không quen thuộc với nó. Nó không được sử dụng bởi các trình khởi chạy Dự án mã nguồn mở Android và tôi không biết về bất kỳ trình khởi chạy nào khác đang sử dụng.


2
Vì vậy, bạn đang đề xuất một tập lệnh xây dựng loại bỏ các thư mục mật độ không chính xác cho tất cả trừ tài nguyên mipmap, nếu tôi hiểu chính xác?
Richard Le Mesurier

20
Tôi khuyên bạn chỉ nên xây dựng một APK cho tất cả các mật độ và không phải lo lắng về nó. Nhưng vâng, lý do các thư mục mipmap đôi khi được sử dụng cho các biểu tượng trình khởi chạy là do các tập lệnh xây dựng (aapt --preferred-configure) tước các thư mục drawable- {mật độ} chứ không phải các thư mục mipmap- {mật độ}. Nó gần như khai thác một lỗi, nhưng trích dẫn của bạn từ bài đăng của Romain Guy và Diane Hackborn tại plus.google.com/105051985738280261832/posts/QTA9McYan1L cho thấy đó là do thiết kế.
Kevin TeslaCoil

3
do đó, quá trình xóa mipmap điển hình của tôi, đặt các biểu tượng của tôi trong các hình vẽ và xây dựng một APK là hoàn hảo. Nghe có vẻ như mipmap là không điển hình đối với hầu hết chúng ta, nhưng nó bị ép buộc đối với tất cả chúng ta.
Ai đó ở đâu đó

Trong tài liệu có ghi: "mipmap: Các tệp có thể vẽ cho mật độ biểu tượng trình khởi chạy khác nhau." developer.android.com/guide/topics/resource/ từ
hoạt động

79

Có vẻ như Google đã cập nhật tài liệu của họ vì tất cả những câu trả lời này, vì vậy hy vọng điều này sẽ giúp người khác trong tương lai :) Tôi vừa xem câu hỏi này, đồng thời tạo ra một dự án mới (mới).

TL; DR: drawables có thể được loại bỏ như là một phần của tối ưu hóa tài nguyên dành riêng cho dp. Mipmaps sẽ không bị tước.

Các ứng dụng trình khởi chạy màn hình chính khác nhau trên các thiết bị khác nhau hiển thị các biểu tượng trình khởi chạy ứng dụng ở các độ phân giải khác nhau. Khi các kỹ thuật tối ưu hóa tài nguyên ứng dụng loại bỏ tài nguyên cho mật độ màn hình không sử dụng, các biểu tượng trình khởi chạy có thể cuộn lên trông mờ vì ứng dụng trình khởi chạy phải nâng cấp biểu tượng có độ phân giải thấp hơn để hiển thị. Để tránh những sự cố hiển thị này, các ứng dụng nên sử dụng các mipmap/thư mục tài nguyên cho các biểu tượng trình khởi chạy. Hệ thống Android bảo tồn các tài nguyên này bất kể tước mật độ và đảm bảo rằng các ứng dụng trình khởi chạy có thể chọn các biểu tượng có độ phân giải tốt nhất để hiển thị.

(từ http://developer.android.com/tools/projects/index.html#mipmap )


2
Điều này phù hợp với vị trí mặc định của Android Studio khi nhập tài sản hình ảnh. Biểu tượng trình khởi chạy đi vào mipmap; những người khác đi vào drawable.
Edward Brey

2
Tài liệu dường như đã thay đổi một lần nữa, mipmap dường như không tồn tại trong developer.android.com/tools/projects/index.html (mặc dù các bit khác của tài liệu Android vẫn cố gắng giới thiệu nó).
Ai đóElse

28

Những hình ảnh mipmap này khác với những hình ảnh có thể vẽ quen thuộc khác như thế nào?

Đây là hai xu của tôi trong việc cố gắng giải thích sự khác biệt. Có hai trường hợp bạn xử lý khi làm việc với hình ảnh trong Android:

  1. Bạn muốn tải một hình ảnh cho mật độ thiết bị của bạn và bạn sẽ sử dụng nó "như hiện tại", mà không thay đổi kích thước thực tế của nó . Trong trường hợp này, bạn nên làm việc với drawables và Android sẽ cung cấp cho bạn hình ảnh phù hợp nhất.

  2. Bạn muốn tải một hình ảnh cho mật độ thiết bị của bạn, nhưng hình ảnh này sẽ được thu nhỏ lên hoặc xuống . Chẳng hạn, điều này là cần thiết khi bạn muốn hiển thị một biểu tượng trình khởi chạy lớn hơn hoặc bạn có một hình ảnh động, làm tăng kích thước hình ảnh. Trong những trường hợp như vậy, để đảm bảo chất lượng hình ảnh tốt nhất, bạn nên đặt hình ảnh của mình vào thư mục mipmap . Những gì Android sẽ làm là, nó sẽ cố gắng chọn hình ảnh từ một thùng mật độ cao hơn thay vì tăng tỷ lệ lên. Điều này sẽ tăng độ sắc nét (chất lượng) của hình ảnh.

Do đó, quy tắc ngón tay cái để quyết định nơi đưa hình ảnh của bạn vào sẽ là:

  • Biểu tượng Launcher luôn đi vào thư mục mipmap .
  • Hình ảnh, thường được thu nhỏ (hoặc cực kỳ thu nhỏ) và chất lượng của nó rất quan trọng cho ứng dụng, cũng đi vào thư mục mipmap .
  • Tất cả các hình ảnh khácdrawable thông thường .

Vậy các biểu tượng cho thanh hành động hay biểu tượng cho nút nổi đi trong mipmap?
Juan De la Cruz

Không, chúng là những đồ rút thông thường.
sergej shafarenka

23

Việc triển khai Android của mipmap trong 4.3 chính xác là kỹ thuật từ năm 1983 được giải thích trong bài viết Wikipedia :)

Mỗi hình ảnh bitmap của bộ mipmap là một bản sao được thu nhỏ của kết cấu chính, nhưng ở một mức độ chi tiết giảm nhất định. Mặc dù kết cấu chính vẫn sẽ được sử dụng khi chế độ xem đủ để hiển thị chi tiết đầy đủ, trình kết xuất sẽ chuyển sang hình ảnh mipmap phù hợp (...) khi kết cấu được xem từ xa hoặc ở kích thước nhỏ.

Mặc dù điều này được mô tả như là một kỹ thuật cho đồ họa 3D (vì nó đề cập đến "xem từ xa"), nhưng nó cũng áp dụng cho 2D (được dịch là "vẽ là một không gian nhỏ hơn", tức là "thu nhỏ").

Đối với một ví dụ cụ thể về Android, hãy tưởng tượng bạn có Chế độ xem với một nền có thể vẽ được (cụ thể là a BitmapDrawable). Bây giờ bạn sử dụng một hình ảnh động để chia tỷ lệ thành 0,15 kích thước ban đầu của nó. Thông thường, điều này sẽ yêu cầu hạ thấp bitmap nền cho mỗi khung. Tuy nhiên, việc thu nhỏ "cực đoan" này có thể tạo ra các tạo tác trực quan.

Tuy nhiên, bạn có thể cung cấp một mipmap, có nghĩa là hình ảnh đã được kết xuất trước cho một vài tỷ lệ cụ thể (giả sử 1.0, 0.5 và 0.25). Bất cứ khi nào hoạt hình "vượt qua" ngưỡng 0,5, thay vì tiếp tục hạ thấp hình ảnh gốc, có kích thước 1.0, nó sẽ chuyển sang hình ảnh 0,5 và hạ thấp nó, điều này sẽ mang lại kết quả tốt hơn. Và như vậy khi hoạt hình tiếp tục.

Đây là một chút lý thuyết, vì nó thực sự được thực hiện bởi trình kết xuất. Theo nguồn của lớp Bitmap, đó chỉ là một gợi ý và trình kết xuất có thể hoặc không thể tôn vinh nó.

/**
 * Set a hint for the renderer responsible for drawing this bitmap
 * indicating that it should attempt to use mipmaps when this bitmap
 * is drawn scaled down.
 *
 * If you know that you are going to draw this bitmap at less than
 * 50% of its original size, you may be able to obtain a higher
 * quality by turning this property on.
 * 
 * Note that if the renderer respects this hint it might have to
 * allocate extra memory to hold the mipmap levels for this bitmap.
 *
 * This property is only a suggestion that can be ignored by the
 * renderer. It is not guaranteed to have any effect.
 *
 * @param hasMipMap indicates whether the renderer should attempt
 *                  to use mipmaps
 *
 * @see #hasMipMap()
 */
public final void setHasMipMap(boolean hasMipMap) {
    nativeSetHasMipMap(mNativeBitmap, hasMipMap);
}

Tôi không chắc chắn tại sao điều này sẽ đặc biệt phù hợp cho các biểu tượng ứng dụng, mặc dù. Mặc dù Android trên máy tính bảng, cũng như một số trình khởi chạy (ví dụ GEL), yêu cầu biểu tượng "cao hơn một mật độ" để hiển thị lớn hơn, nhưng điều này được cho là được thực hiện bằng cơ chế thông thường (ví dụ drawable-xxxhdpi: & c).


Điều này không thực sự giải thích sự khác biệt từ các drawablethư mục cũng chứa hình ảnh bị nhòe.
Timmmm

2
Trong thực tế, câu trả lời này là hoàn toàn sai. Sự khác biệt duy nhất là liệu các tệp có bị tước hay không - nó không liên quan gì đến việc có sử dụng mipmapping hay không (trong cả hai trường hợp). Các thư mục là loại tên xấu; có lẽ họ nên gọi nó drawable-nostriphoặc cái gì đó
Timmmm

2
Lời giải thích hay về mipmap, nhưng câu trả lời của Kazuaki đề cập đến một mục tài liệu của Google dường như ngụ ý nó thực sự không phải là lý do.
Trilarion

11

Một điều tôi đã đề cập trong một chủ đề khác đáng để chỉ ra - nếu bạn đang xây dựng các phiên bản khác nhau của ứng dụng cho các mật độ khác nhau, bạn nên biết về thư mục tài nguyên "mipmap". Đây chính xác giống như tài nguyên "có thể vẽ", ngoại trừ nó không tham gia vào việc tách mật độ khi tạo các mục tiêu apk khác nhau.

https://plus.google.com/105051985738280261832/posts/QTA9McYan1L


... đúng vậy, như Kevin đã đề cập trong câu trả lời được chấp nhận. Đây dường như là lý do chính đằng sau nó.
Richard Le Mesurier

@RichardLeMesurier có, chỉ để làm cho nó ngắn gọn và rõ ràng
kreker

4

Vì tôi đang tìm kiếm một câu trả lời rõ ràng cho vấn đề này để xác định đúng loại cho các biểu tượng thông báo, tôi muốn thêm tuyên bố rõ ràng này vào chủ đề. Đó là từ http://developer.android.com/tools/help/image-asset-studio.html#saving

Lưu ý: Các tệp biểu tượng Trình khởi chạy nằm ở một vị trí khác với các biểu tượng khác. Chúng được đặt trong mipmap / thư mục. Tất cả các tệp biểu tượng khác nằm trong thư mục drawable / của dự án của bạn.


2

Khi xây dựng các apks riêng biệt cho các mật độ khác nhau, các thư mục có thể rút ra cho các mật độ khác sẽ bị tước bỏ. Điều này sẽ làm cho các biểu tượng xuất hiện mờ trong các thiết bị sử dụng biểu tượng launcher có mật độ cao hơn. Vì các thư mục mipmap không bị tước, nên tốt nhất là sử dụng chúng để bao gồm các biểu tượng trình khởi chạy.


2

Có hai trường hợp bạn xử lý khi làm việc với hình ảnh trong Android:

  1. Bạn muốn tải một hình ảnh cho mật độ thiết bị của bạn và bạn sẽ sử dụng nó, như là, mà không thay đổi kích thước thực tế của nó. Trong trường hợp này, bạn nên làm việc với drawables và Android sẽ cung cấp cho bạn hình ảnh phù hợp nhất.
  2. Bạn muốn tải một hình ảnh cho mật độ thiết bị của bạn, nhưng hình ảnh này sẽ được thu nhỏ lên hoặc xuống. Chẳng hạn, điều này là cần thiết khi bạn muốn hiển thị một biểu tượng trình khởi chạy lớn hơn hoặc bạn có một hình ảnh động, làm tăng kích thước hình ảnh. Trong những trường hợp như vậy, để đảm bảo chất lượng hình ảnh tốt nhất, bạn nên đặt hình ảnh của mình vào thư mục mipmap. Những gì Android sẽ làm là, nó sẽ cố gắng chọn hình ảnh từ một thùng mật độ cao hơn thay vì tăng tỷ lệ lên.

VÌ THẾ

Do đó, quy tắc ngón tay cái để quyết định nơi đưa hình ảnh của bạn vào sẽ là:

  1. Biểu tượng Launcher luôn đi vào thư mục mipmap.

  2. Hình ảnh, thường được thu nhỏ (hoặc cực kỳ thu nhỏ) và chất lượng của nó rất quan trọng cho ứng dụng, cũng đi vào thư mục mipmap.

  3. Tất cả các hình ảnh khác là drawable thông thường.

Trích dẫn từ này bài viết.


1
res/
mipmap-mdpi/ic_launcher.png (48x48 pixels)
mipmap-hdpi/ic_launcher.png (72x72)
mipmap-xhdpi/ic_launcher.png (96x96)
mipmap-xxhdpi/ic_launcher.png (144x144)
mipmap-xxxhdpi/ic_launcher.png (192x192)

MipMap cho biểu tượng ứng dụng cho launcher

http://android-developers.blogspot.co.uk/2014/10/getting-your-apps- yet-for-nexus-6-and.html

https://androidbycode.wordpress.com/2015/02/14/goodbye-launcher-drawables-hello-mipmaps/


Cảm ơn cho bài viết blog thứ hai! Nó làm rõ sự khác biệt giữa việc sử dụng drawable-XXXmipmap-XXXcác thư mục thực sự tốt: Biểu tượng trình khởi chạy khác với các tài nguyên khác vì có thể biểu tượng có độ phân giải cao hơn được hiển thị trong trình khởi chạy người dùng. Nếu hình ảnh có độ phân giải cao hơn đó đã bị xóa khỏi thư mục drawables của bạn, thì biểu tượng mật độ thấp hơn sẽ được tăng tỷ lệ theo chương trình. Điều này có thể gây ra một biểu tượng mờ không hấp dẫn.
winklerrr

Ít nhất là trong Android 8.1 trên Nexus P6, các biểu tượng khởi chạy trong các thư mục drawables KHÔNG được thu nhỏ. Trên thực tế không tìm thấy gì cả và ứng dụng gặp sự cố khi mở.
Matthew

1

Nếu bạn xây dựng APK cho độ phân giải màn hình mục tiêu như HDPI, công cụ đóng gói tài sản Android, AAPT, có thể loại bỏ các bản vẽ cho độ phân giải khác mà bạn không cần. Nhưng nếu nó nằm trong thư mục mipmap, thì các tài sản này sẽ ở trong APK, bất kể độ phân giải mục tiêu.


-1

Sự hiểu biết tôi có về mipmap ít nhiều như thế này:

Khi một hình ảnh cần được vẽ, do chúng ta có các kích thước màn hình khác nhau là độ phân giải, một số tỷ lệ sẽ phải tham gia.

Nếu bạn có một hình ảnh phù hợp với điện thoại di động cấp thấp, khi bạn phóng to nó thành kích thước của máy tính bảng 10 ", bạn phải" phát minh "các pixel không thực sự tồn tại. Điều này được thực hiện với một số thuật toán nội suy. Số lượng pixel phải được phát minh càng nhiều, quá trình càng mất nhiều thời gian và chất lượng bắt đầu thất bại. Chất lượng tốt nhất thu được với các thuật toán phức tạp hơn mất nhiều thời gian hơn (ví dụ trung bình của các pixel xung quanh so với sao chép pixel gần nhất).

Để giảm số lượng pixel phải được phát minh, với mipmap, bạn cung cấp các kích thước / rsolutions khác nhau của cùng một hình ảnh và hệ thống sẽ chọn hình ảnh gần nhất với độ phân giải phải được hiển thị và thực hiện chia tỷ lệ từ đó. Điều này sẽ làm giảm số lượng pixel được phát minh tiết kiệm tài nguyên được sử dụng để tính toán các pixel này để cung cấp hình ảnh có chất lượng tốt.

Tôi đã đọc về điều này trong một bài viết giải thích một vấn đề về hiệu suất trong libgdx khi chia tỷ lệ hình ảnh:

http://www.badlogicgames.com/wordpress/?p=1403

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.