通过昨天的新预览版,我开始将我的应用更新到此版本.我的应用程序的一部分是列出已安装的应用程序及相关图标.
Drawable drawable = mPackageManager.getApplicationIcon(packageName);
Run Code Online (Sandbox Code Playgroud)
应用程序的这一部分仍然有效.时钟,计算器或消息等应用程序已经支持新版本的图标,因此它们会返回一个AdaptiveIconDrawable.
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Run Code Online (Sandbox Code Playgroud)
这部分不再起作用了.有没有其他方法可以转换AdaptiveIconDrawable为Bitmap?提前致谢.
ATo*_*Tom 25
这是更普遍的解决方案:
@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;
}
Run Code Online (Sandbox Code Playgroud)
如果您不想使用自己的,它还将在系统定义的形状中渲染背景.
您可以在任何Drawable上使用它,也可以在VectorDrawable中使用它.它也适用于BitmapDrawable,只需getBitmap()就可以提高内存效率.
我们可以通过以下方式实现,
AppIconHelper.java
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;
}
}
Run Code Online (Sandbox Code Playgroud)
对于支持 Android O(>=26) 的设备,我们可以调用 AppIconHelperV26 类来获取 AppIcon,在此,如果它的 drawable 是 AdaptiveIconDrawable,我们将执行以下步骤 1. 获取 Foreground 和 Background drawable 并创建为 Layer Drawable 2。使用 Canvas 我们可以将 Layer drawable 转换为 Bitmap
AppIconHelperV26.java
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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以调用 AppIconHelper.getAppIcon 来获取 Bitmap,
应用列表适配器.java
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
//... your code here
Bitmap appIcon = AppIconHelper.getAppIcon(packageManager, packageName);
imageView.setImageBitmap(appIcon);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4425 次 |
| 最近记录: |