android - 缩放已在 android 上缩放的分层图像

标签 android image out-of-memory zooming layered

我遇到了很多问题,所有问题都是相关的。有些我已经解决了,但我找到的解决方案可能会阻止我完成最终产品。 我将在此处提及所有问题和解决方案,因为我确信这将是一个相当普遍的问题,很多人都会遇到。

最终结果 我有一个基础图像,上面有 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/

相关文章:

android - onRegistered() 被调用但 onMessage() 没有

android - java.lang.NoClassDefFoundError : com. 谷歌.android.maps.GeoPoint

java - 当可见性设置为“消失”时如何删除空白空间

ios - 未呈现分段控件中的图像

image - 处理 statusCode : 403 for Image. 网络

javascript - 使用变量设置 <Image/> 的源

php - 使用 GCM 向所有用户发送推送消息

java - OutOfMemoryError 崩溃报告,无法找出导致崩溃的原因

android - 内存不足位图解码文件 - Android

android dalvik vm-heap 在 XZ 压缩时内存分配不足