有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓在API级别28中找不到画布变量

在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);

共 (2) 个答案

  1. # 1 楼答案

    你可以用canvas.save();代替canvas.save(Canvas.MATRIX_SAVE_FLAG|CLIP_SAVE_FLAG) 参考文献

  2. # 2 楼答案

    这些标志已在API 28中删除。见here

    Class android.graphics.Canvas

    Removed Methods int save(int)

    Removed Fields 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

    This method was deprecated in API level 26. Use saveLayer(float, float, float, float, Paint) instead.

    改用什么

    根据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与上面的或'ed值相同