在 API 级别 28 中找不到 Canvas 变量

Posted

技术标签:

【中文标题】在 API 级别 28 中找不到 Canvas 变量【英文标题】:Can not find Canvas variables in API Level 28 【发布时间】:2019-06-06 11:44:27 【问题描述】:

android 28 中找不到以下 Canvas 变量。

canvas.saveLayer(0, 0, getWidth(), getHeight(), null,
                Canvas.MATRIX_SAVE_FLAG |
                        Canvas.CLIP_SAVE_FLAG |
                        Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
                        Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
                        Canvas.CLIP_TO_LAYER_SAVE_FLAG);

【问题讨论】:

【参考方案1】:

这些标志已在 API 28 中删除。请参阅 here:

类 android.graphics.Canvas

删除的方法 整数保存(整数)

删除的字段 int CLIP_SAVE_FLAG int CLIP_TO_LAYER_SAVE_FLAG int FULL_COLOR_LAYER_SAVE_FLAG int HAS_ALPHA_LAYER_SAVE_FLAG int MATRIX_SAVE_FLAG

API 26 中已弃用该方法。请参阅 here:

此方法在 API 级别 26 中已弃用。 请改用 saveLayer(float, float, float, float, Paint)。

改用什么

根据 API 28 的Canvas 源代码,您使用的所有标志组合起来等于ALL_SAVE_FLAG 的值:

public  static  final  int ALL_SAVE_FLAG =  0x1F;
public  static  final  int MATRIX_SAVE_FLAG =  0x01;
public  static  final  int CLIP_SAVE_FLAG =  0x02;
public  static  final  int HAS_ALPHA_LAYER_SAVE_FLAG =  0x04;
public  static  final  int FULL_COLOR_LAYER_SAVE_FLAG =  0x08;
public  static  final  int CLIP_TO_LAYER_SAVE_FLAG =  0x10;

从同一个source code 调用Canvas#saveLayer(left, top, right, bottom, paint) 默认使用ALL_SAVE_FLAG

/**  
 * Convenience for @link #saveLayer(RectF, Paint) that takes the four float coordinates of the  
 * bounds rectangle. */
public int saveLayer(float left, float top, float right, float bottom, @Nullable Paint paint)   
    return saveLayer(left, top, right, bottom, paint, ALL_SAVE_FLAG);  

因此,您的代码看起来与以下代码等效,您可以将其用作替换:

canvas.saveLayer(0, 0, getWidth(), getHeight(), null);

此版本的 saveLayer() 仅适用于 API 21+。要支持较低的 API 级别,请使用

canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);

其中Canvas.ALL_SAVE_FLAG 与上面的 or'ed 值相同。

【讨论】:

我不明白。应该使用什么来代替 canvas.save(Canvas.MATRIX_SAVE_FLAG) ?是canvas.saveLayer(0,0,canvas.getWidth(),canvas.getHeight(),null); 吗? @androiddeveloper 是的。我在答案中添加了指向引用源代码的链接。 @Cheticamp 哦,好的。谢谢。 @Cheticamp 我在上面使用,但我也得到:“调用需要 API 级别 21(当前最低为 19):android.graphics.Canvas#saveLayer”。如果我想支持 API 19 及以上版本应该怎么做?【参考方案2】:

您可以使用canvas.save(); 代替canvas.save(Canvas.MATRIX_SAVE_FLAG|CLIP_SAVE_FLAG) 参考

【讨论】:

以上是关于在 API 级别 28 中找不到 Canvas 变量的主要内容,如果未能解决你的问题,请参考以下文章

在 Next.js 应用程序中找不到 API 路由(找不到该页面)

打字稿错误使用googlemaps javascript API时在ionic2中找不到名称'google'

在 postgresql 中找不到按级别连接的替代方法

在 i18n-iso-countries 中找不到“变音符号”错误?

不同长度的pandas groupby元组-ValueError:在通过级别中找不到值:MultiIndex

在 Android Studio 后端设置 API 级别