1

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

最终结果我有一个基础图像,顶部有 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 层时,我仍然收到 OutOfMemory 错误。我还认为缩放图像在缩放时会成为一个问题,因为质量已经降低。

第二题。据我发现,您不能在其中一张图像不透明的情况下对 png 进行分层。不会显示透明图像,仅显示不透明的图像(基本图像)。

通过将 FrameLayout 的背景设置为基础图像并仅将 3 层作为该布局的子层来解决此问题。

第三期放大图像。我在这里找到了解决方案如何获得图像的缩放功能?,但尚未对其进行测试,因为模拟器没有多点触控,而且当我游泳时我的设备不喜欢它。我目前没有其他设备可以测试。

什么是加载所有 4 张图像(基础 + 3 层)而不出现 outOfMemoryError 并具有缩放图像的功能的最佳方法。

我在这里创建了一个带有所需代码的项目

4

1 回答 1

1

我找到了一些解决方案。问题一:完成代码并使用此处找到的 TouchImageView。我不再得到内存不足的错误。我可以毫无问题地加载所有图层。

第二个和第三个问题也通过使用 TouchImageView 解决了。虽然我对此感到满意,但我希望课堂能有更多评论,因为我花了很多时间试图弄清楚它是如何工作的以及为什么,但最终失败了。

我遇到的最后一个大问题是在捏缩放时它只会缩放顶层(如预期的那样)。对此的解决方法是稍微更改 TouchImageview 类并添加矩阵更改侦听器的功能。现在,当矩阵发生变化时,矩阵会返回给侦听器,然后侦听器会更新包括基础图像在内的所有层中的矩阵。现在,这使所有图像同时缩放,无论缩放如何,标签都指向基本图像上的相同位置。

这是用于通知侦听器矩阵变化的非常简单的接口

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
于 2012-01-25T02:51:21.403 回答