我遇到了很多问题,所有问题都是相关的。有些我已经解决了,但我找到的解决方案可能会阻止我完成最终产品。 我将在此处提及所有问题和解决方案,因为我确信这将是一个相当普遍的问题,很多人都会遇到。
最终结果 我有一个基础图像,上面有 3 层(透明 png)。显示的图层取决于用户。每一层都会向基础图像添加更多信息。 在我的情况下,基本图像是星星的图像。当用户添加额外的图层时,他们可以看到星座边界、恒星名称和网格。 用户还需要能够放大某个区域以获得更清晰的部分天空图片。
第一期 图像大小是两个大 (1324‖×‖1872) 导致 OutOfMemory 错误。
通过使用缩放图像解决
/**
* This method scales an image in the assets directory and returns a
* BitmapDrawable object that can be passed to an images setImageBitmap or a
* views setBackgroundDrawable by passing this method into the constructor
* of BitmapDrawable.
* eg ViewGroup.setBackgroundDrawable(
* new BitmapDrawable(getScaledBitMap(this, imagePath, 2)));
*
* @param context
* @param imgFullPath
* @param imageSize
* @return
* @throws IOException
*/
public static Bitmap getScaledBitMap(Context context, String imgFullPath,
int imageSize) throws IOException
{
InputStream instream;
instream = context.getAssets().open(imgFullPath);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = imageSize;
Bitmap bitmap=BitmapFactory.decodeStream(instream, null, options);
return bitmap;
}
虽然这段代码有所帮助,但在加载 3 层时我仍然遇到内存不足错误。我还认为缩放图像时会出现问题,因为质量已降低。
第二期。 据我所知,您不能在其中一张图像不透明的地方对 png 进行分层。没有透明图像将只显示不透明的图像(基本图像)。
通过将 FrameLayout 的背景设置为基本图像并仅将 3 层作为该布局的子层来解决此问题。
第三期 放大图像。 我在这里找到了可能的解决方案 How can I get zoom functionality for images? ,但尚未对其进行测试,因为模拟器没有多点触控功能,而且我的设备在游泳时不喜欢它。我目前没有其他设备可以测试。
在不出现 outOfMemoryError 的情况下加载所有 4 张图像(基础 + 3 层)并具有缩放图像的功能的最佳方法是什么。
我用所需的代码创建了一个项目 here
最佳答案
我找到了一些解决方案。 问题一: 完成代码并使用 TouchImageView 后发现 here .我不再遇到内存不足错误。我可以毫无问题地加载所有图层。
第二个和第三个问题也通过使用TouchImageView解决了。虽然我对此很满意,但我希望类里面有更多评论,因为我花了很多时间试图弄清楚它是如何工作的以及为什么,但最终失败了。
我遇到的最后一个大问题是捏合缩放时它只会缩放顶层(如预期的那样)。对此的修复是稍微更改 TouchImageview 类并添加矩阵更改监听器的功能。现在,每当矩阵发生变化时,矩阵都会返回给监听器,然后监听器会更新所有层中的矩阵,包括基础图像。现在,这使所有图像同时缩放,无论缩放如何,标签都指向基本图像上的相同位置。
这是用于通知监听器矩阵变化的非常简单的接口(interface)
public interface IOnMatixChangedListener
{
public void onMatrixChanged(Matrix matrix);
}
关于android - 缩放已在 android 上缩放的分层图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8814483/