gpt4 book ai didi

Android:如何让自定义 View 部分重绘?

转载 作者:可可西里 更新时间:2023-11-01 18:59:23 31 4
gpt4 key购买 nike

我有一个填满整个屏幕的自定义 View 。 (钢琴键盘)当用户触摸按键时,它会调用 invalidate() 并重新绘制整个键盘以显示触摸按键的新状态。

目前 View 非常简单,但我计划添加一些更漂亮的图形。由于整个键盘是动态呈现的,因此重绘整个键盘的成本会更高。

所以我想,让我们研究一下部分重绘。现在我用正确的脏区域调用 invalidate(Rect dirty)。我将我的 onDraw(Canvas canvas) 方法设置为仅在我确实想要部分重绘时在脏区域绘制键。这导致绘制了这些键,但键盘的其余部分完全是黑色的/根本没有绘制。

我是否认为调用 invalidate(Rect dirty) 会“缓存”当前的 canvas,并且只“允许”在脏区域绘图?

有什么方法可以实现我想要的吗? (一种“缓存” Canvas 并只重绘脏区的方法?”

最佳答案

当前不错的解决方法是手动将整个 Canvas 缓存到位图中:

 private void onDraw(Canvas canvas)
{
if (!initialDrawingIsPerformed)
{
this.cachedBitmap = Bitmap.createBitmap(getWidth(), getHeight(),
Config.ARGB_8888); //Change to lower bitmap config if possible.
Canvas cacheCanvas = new Canvas(this.cachedBitmap);
doInitialDrawing(cacheCanvas);
canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
initialDrawingIsPerformed = true;
}
else
{
canvas.drawBitmap(this.cachedBitmap, 0, 0, new Paint());
doPartialRedraws(canvas);
}
}

当然,您需要存储有关自己重绘内容的信息,最好不要每次都使用新的Paint,但这是细节。

另请注意:位图对您的应用程序的内存使用量非常大。当我缓存一个与滚动条一起使用的 View 并且它是设备高度的 5 倍时,我发生了崩溃,因为它使用了 > 10MB 的内存!

关于Android:如何让自定义 View 部分重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2949036/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com