2017-06-08 30 views
7

yılında Bitmap AdaptiveIconDrawable dönüştürün. Uygulamamın bir kısmı, yüklenen uygulamaları ilişkili simgelerle listelemektir.Bu sürüme benim uygulamayı güncellemeye başladık yeni önizleme sürümü dün ile Android Ç önizleme

Drawable drawable = mPackageManager.getApplicationIcon(packageName); 

Uygulamanın bu kısmı hala çalışıyor. Saat, hesap makinesi veya mesajlar gibi uygulamalar simgelerin yeni sürümlerini zaten desteklediğinden, bir AdaptiveIconDrawable döndürürler.

Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); 

Bu parça artık çalışmıyor. AdaptiveIconDrawable'u Bitmap ürününe dönüştürmenin başka yolu var mı? Şimdiden teşekkürler. Biz yol izleyerek elde edebilirsiniz

cevap

10

Bu çözüm çok daha evrenseldir:

@NonNull 
private Bitmap getBitmapFromDrawable(@NonNull Drawable drawable) { 
    final Bitmap bmp = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); 
    final Canvas canvas = new Canvas(bmp); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
    drawable.draw(canvas); 
    return bmp; 
} 

Ayrıca, kendi kullanmak istemiyorsanız, sistem tanımlı biçimde arka plan oluşturur.

Sen VectorDrawable için çok da, herhangi bir çizilebilir üzerinde kullanabilirsiniz. Ayrıca BitmapDrawable üzerinde çalışacak, sadece getBitmap() daha fazla bellek verimli olacak.

+0

Bu, 'LayerDrawable' rigmarole'a gitmekten daha iyi bir yanıt gibi görünüyor. Ayrıca, "(BitmapDrawable çekilebilir instanceof) {return ((BitmapDrawable) çekilebilir) .getBitmap(); Ortak durumda en iyi duruma getirmek için fonksiyonun üst kısmına. –

3

, eğer biz, bu ise, uygulama ikonu almak için AppIconHelperV26 sınıfını çağırabilirsiniz (26> =) Android O destekleyen cihaz için

public class AppIconHelper { 

    public static Bitmap getAppIcon(PackageManager mPackageManager, String packageName) { 

     if (Build.VERSION.SDK_INT >= 26) { 
      return AppIconHelperV26.getAppIcon(mPackageManager, packageName); 
     } 

     try { 
      Drawable drawable = mPackageManager.getApplicationIcon(packageName); 

      return ((BitmapDrawable) drawable).getBitmap(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

AppIconHelper.java onun çizilebilir AdaptiveIconDrawable, biz 1. Ön plan ve arka plan çizilebilir alın ve drawable Katman olarak oluşturmak biz Katman çekilebilir dönüştürebilirsiniz Tuval kullanma 2. Bitmap aşağıdaki adımları yapıyoruz

AppIconHelperV26.java

Şimdi
public class AppIconHelperV26 { 

    @RequiresApi(api = Build.VERSION_CODES.O) 
    public static Bitmap getAppIcon(PackageManager mPackageManager, String packageName) { 

     try { 
      Drawable drawable = mPackageManager.getApplicationIcon(packageName); 

      if (drawable instanceof BitmapDrawable) { 
       return ((BitmapDrawable) drawable).getBitmap(); 
      } else if (drawable instanceof AdaptiveIconDrawable) { 
       Drawable backgroundDr = ((AdaptiveIconDrawable) drawable).getBackground(); 
       Drawable foregroundDr = ((AdaptiveIconDrawable) drawable).getForeground(); 

       Drawable[] drr = new Drawable[2]; 
       drr[0] = backgroundDr; 
       drr[1] = foregroundDr; 

       LayerDrawable layerDrawable = new LayerDrawable(drr); 

       int width = layerDrawable.getIntrinsicWidth(); 
       int height = layerDrawable.getIntrinsicHeight(); 

       Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 

       Canvas canvas = new Canvas(bitmap); 

       layerDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); 
       layerDrawable.draw(canvas); 

       return bitmap; 
      } 
     } catch (PackageManager.NameNotFoundException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

Bitmap'i almak için AppIconHelper.getAppIcon çağırabilir,

AppListAdapter.java

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    //... your code here 
    Bitmap appIcon = AppIconHelper.getAppIcon(packageManager, packageName); 
    imageView.setImageBitmap(appIcon); 

} 
+0

Oldukça iyi bir çözüm sadece kendisi yapar AdaptiveIconDrawable olarak arka planın köşeyi etmez. – ATom