Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android draw阴影下方视图:dispatchDraw经常调用-任何缓存丢失_Android_Caching_Shadow - Fatal编程技术网

Android draw阴影下方视图:dispatchDraw经常调用-任何缓存丢失

Android draw阴影下方视图:dispatchDraw经常调用-任何缓存丢失,android,caching,shadow,Android,Caching,Shadow,我试图在视图元素下放置平滑阴影。以下是我到目前为止所做的: 子类FrameLayout(我的阴影视口),它覆盖dispatchDraw(…),并执行以下操作: 调用超类的dispatchDraw并将输出保存为位图 从该位图中提取alpa 模糊 绘制具有一定偏移的模糊提取alpha 绘制原始视图位图 @Override protected void dispatchDraw(Canvas canvas) { Log.d("ShadowViewport", "dispatchDraw");

我试图在视图元素下放置平滑阴影。以下是我到目前为止所做的:

子类FrameLayout(我的阴影视口),它覆盖dispatchDraw(…),并执行以下操作:

  • 调用超类的dispatchDraw并将输出保存为位图
  • 从该位图中提取alpa
  • 模糊
  • 绘制具有一定偏移的模糊提取alpha
  • 绘制原始视图位图

    @Override
    protected void dispatchDraw(Canvas canvas) {
        Log.d("ShadowViewport", "dispatchDraw");
    
        final Bitmap output = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
        final Canvas sCanvas = new Canvas(output);
    
        // Draw internal view in canvas
        super.dispatchDraw(sCanvas);
        final Bitmap original = output.copy(Config.ARGB_8888, true);
    
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColor(0x55000000);
        paint.setMaskFilter(new BlurMaskFilter(SHADOW_SIZE, Blur.NORMAL));
    
        canvas.drawBitmap(output.extractAlpha(), 0, SHADOW_SIZE, paint);
        canvas.drawBitmap(original, 0, 0, null);
    }
    
结果

。 如您所见,左框生成了一个漂亮的阴影,即使是圆角;)

问题


on dispatchDraw函数经常被调用,例如在滚动时。有没有缓存的方法?

在AndroidManifest中启用android:hardwareAccelerated=“true”属性将启用图像的自动缓存。例如,在滚动期间不调用dispatchDraw方法


我也认为可以在你的布局课上使用。要实现这一点,应该首先调用getDrawingCache,如果返回的位图不为null,则调用返回的位图。这似乎有点像“穷人”的优化,但可能是提高旧手机性能的好主意。

启用AndroidManifest中的android:hardwareAccelerated=“true”属性将启用图像的自动缓存。例如,在滚动期间不调用dispatchDraw方法


我也认为可以在你的布局课上使用。要实现这一点,应该首先调用getDrawingCache,如果返回的位图不为null,则调用返回的位图。这似乎有点像“穷人”的优化,但可能是提高旧手机性能的一个好主意。

你在这方面运气好吗?还没有。现在,我使用的是一个简单的9片可拉伸,适合非常简单的形状。“真实”的阴影甚至可以覆盖复杂的视图…请将您的源代码粘贴到这里。@Algo:9-patch可绘制的代码?它只是一个可绘制的集合,作为(在示例中)一个相对物的背景:
android:background=“@drawable/item\u single\u background”
。找到图像。你运气好吗?还没有。现在,我使用的是一个简单的9片可拉伸,适合非常简单的形状。“真实”的阴影甚至可以覆盖复杂的视图…请将您的源代码粘贴到这里。@Algo:9-patch可绘制的代码?它只是一个可绘制的集合,作为(在示例中)一个相对物的背景:
android:background=“@drawable/item\u single\u background”
。找到图像。