And*_*der 5 graphics android module dynamic-feature
为了将我的游戏应用程序分解为 Instant 和 Installable 版本,我对动态模块拆分 API 交付感到满意。我一直在关注此处的 Codelabs 教程https://codelabs.developers.google.com/codelabs/on-demand-dynamic-delivery/index.html#0。不幸的是,它使用 Kotlin 作为 MainActivity 代码,该代码不如 Java 特定,但如果您已经完成了 Kotlin 教程,仍然可以很好地遵循。该示例包括使用以下内容访问“资产”功能模块中“资产”文件夹中的文本图块:
private const val packageName = "com.google.android.samples.dynamicfeatures.ondemand"
val assetManager = createPackageContext(packageName, 0).assets
// Now treat it like any other asset file.
val assets = assetManager.open("assets.txt")
val assetContent = assets.bufferedReader()
.use {
it.readText()
}
Run Code Online (Sandbox Code Playgroud)
现在我只想访问动态功能模块的可绘制文件夹中的图形文件。我将只使用我的动态功能模块来存储大型图形,这些图形将使我超过 10 MG 的即时应用程序下载限制。什么是最干净的方法来做到这一点?
主要的“应用程序”模块:
“应用程序”中的 Java 代码:
loadTexture(R.drawable.aaa_image);
Bitmap bitmap;
public void loadTexture(final int resourceId){
bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
***
Run Code Online (Sandbox Code Playgroud)
动态交付的“安装资产”模块:
'app'中的仍然是java代码,不会到达:
loadTexture(R.drawable.testgraphic);
cannot resolve symbol 'testgraphic'
Run Code Online (Sandbox Code Playgroud)
我找到了一个从功能模块资源加载 drawable 的可行解决方案。诀窍是为模块使用正确的包名。
例子:
构建.gradle
dynamicFeatures = [":FeatureModule"]
爪哇
int drawableResId = context.getResources().getIdentifier("your_drawable_name", "drawable", "com.project.FeatureModule");
context.getDrawable(drawableResId);
Run Code Online (Sandbox Code Playgroud)
传统上,您无法从另一个模块访问资源,只能访问资产(原始存储)。现在显然你可以了,但是很混乱。然而,拆分 API 安排的重点在于,您确实可以像访问它们所在的位置一样访问所有部分(模块)的代码和资源。我发现这对于资产文件夹来说是正确的,因为您不需要为动态模块引用动态创建新的上下文。我发现如果您的主和动态即时模块资产文件夹中碰巧有相同标题的资产,则它是从动态模块中提取的。
但是,我仍然无法从动态模块资源(R)中获取,但我将提供一个解决方法来回答我自己的问题,直到找到示例或得到更好的答案。您可以将图像文件放在动态模块的 asset 文件夹中,然后按如下方式拉取和转换它们:
loadTextureResource("testimage.png");//include file type (.png)
Bitmap bitmap;
public void loadTextureResource(String imagename){
ImageView mImage=new ImageView(context);
InputStream ims;
try {
// get input stream
ims = context.getAssets().open(imagename);
// load image as Drawable
Drawable d = Drawable.createFromStream(ims, null);
// set image to ImageView
mImage.setImageDrawable(d);
bitmap = ((BitmapDrawable)mImage.getDrawable()).getBitmap();
***
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1187 次 |
最近记录: |