在Android中使用大尺寸可绘制视图和自定义视图

在Android中使用大尺寸可绘制视图和自定义视图,android,view,bitmap,drawable,android-custom-view,Android,View,Bitmap,Drawable,Android Custom View,我知道这已经被讨论了一遍又一遍,但我找不到适合我需要的解决方案 场景:为了简化解释,我有一个自定义视图,其中显示两个图像,一个大的作为背景,一个小的作为轮子。用户可以使用onTouch事件旋转/缩放背景图像。他还可以旋转轮子图像进行一些操作。一切都是在自定义视图而不是SurfaceView上完成的,因为我需要它是透明的 问题:对于onDraw(),我总是需要检查背景图像的旋转/缩放,缩放/旋转它,然后绘制它。如果背景图像较小,假设512x512,则轮子图像旋转良好。如果背景图像较大(1280x1

我知道这已经被讨论了一遍又一遍,但我找不到适合我需要的解决方案

场景:为了简化解释,我有一个自定义视图,其中显示两个图像,一个大的作为背景,一个小的作为轮子。用户可以使用onTouch事件旋转/缩放背景图像。他还可以旋转轮子图像进行一些操作。一切都是在自定义视图而不是SurfaceView上完成的,因为我需要它是透明的

问题:对于onDraw(),我总是需要检查背景图像的旋转/缩放,缩放/旋转它,然后绘制它。如果背景图像较小,假设512x512,则轮子图像旋转良好。如果背景图像较大(1280x1707),则车轮图像旋转滞后。因此,我的猜测是,在背景中操纵和旋转一个大图像,因为每个onDraw()都会给我带来性能问题,当基本上只有用户操纵背景图像时,背景图像才应该重画

旋转是通过以下方式完成的:

    canvas.save();
    float dx = (maxX + minX) / 2;
    float dy = (maxY + minY) / 2;
    drawable.setBounds((int) minX, (int) minY, (int) maxX, (int) maxY);
    canvas.translate(dx, dy);
    canvas.rotate(angle * 180.0f / (float) Math.PI);
    canvas.translate(-dx, -dy);
    drawable.draw(canvas);
    canvas.restore();

可能的解决方案:我可以创建一个新的自定义视图,该视图只能绘制背景图像,并在其上放置我的当前视图,并将触摸事件发送到我的背景图像视图。这将允许我只在需要时重新绘制背景图像。还有其他想法吗

我遇到了类似的性能问题,我找到的解决方案就是我所描述的。与您已经建议的类似,基本上只绘制一次背景,自定义ImageView处理其触摸事件的所有转换。

当您首先获取背景图像时,是否使用解码
ByteArray
,或者它就在/res文件夹中,您将其设置为背景可绘制?我看到很多人在想要旋转位图时会重新创建新位图,而不是设置用于在画布上绘制位图的矩阵。如果你不这么做,那就试试2号图像的威力吧。这可能是因为该设备无法处理如此大的图像,但会显示一些代码,让我们看一看。不,我的意思是,如果该设备的图像太大,您可以使用解码和
位图工厂对其进行优化。选项
。这是一个很好的算法,它可以让你优化你的应用程序性能:@teoREtik我正在使用:Drawable.createFromPath(…path…)对它进行解码,我无法缩放图像,我需要它保持原始大小。请提供一个简单的示例代码,因为我无法完全理解工作流。谢谢。@Alin很抱歉,我无法提供代码,因为它是专有软件,但它基于我发布的模式示例,并在我自己的回复中进行了修改,以及我在此处发布的链接中描述的内容。如果仍然不清楚,请毫不犹豫地告诉我。我不确定我是否理解您的解决方案。我应该做一个自定义的框架布局。onSizeChange创建画布,旋转并缩放画布,将其内容保存为可绘制的位图,然后将此位图设置为背景?@Alin是的,完全正确。将BitmapDrawable设置为自定义FrameLayout的背景可绘制(setBackgroundDrawable)。我今天将对其进行测试,看看是否能够正常工作。再次感谢。