GVKun编程网logo

java – 在Android 4.1之前,方法android.graphics.PorterDuffColorFilter – 会错误地覆盖包

20

以上就是给各位分享java–在Android4.1之前,方法android.graphics.PorterDuffColorFilter–会错误地覆盖包,同时本文还将给你拓展AndroidPaint应

以上就是给各位分享java – 在Android 4.1之前,方法android.graphics.PorterDuffColorFilter – 会错误地覆盖包,同时本文还将给你拓展Android Paint应用二PorterDuffXfermode、Android setColorFilter 滤镜效果、Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法、Android Studio java.lang.NoClassDefFoundError:android.support.v4.app.NavUtilsJB等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java – 在Android 4.1之前,方法android.graphics.PorterDuffColorFilter – 会错误地覆盖包

java – 在Android 4.1之前,方法android.graphics.PorterDuffColorFilter – 会错误地覆盖包

我正在使用导航抽屉活动android studio和Firebase身份验证.当我要运行这个应用程序比我得到这个错误.

  W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable

我也在使用最少版本的SDK和构建工具……

android {
    compileSdkVersion 25
    buildToolsversion "25.0.2"
}

解决方法:

Android曾经在Dalvik VM上运行.

Dalvik有一个错误,允许类覆盖父类的包私有方法.

因此,当他们切换到ART时,他们修复了这个,所以它不再覆盖父方法,
现在,当检测到这种情况时,它会记录警告,确保您了解行为更改.

似乎有些support-lib类(PorterDuffColorFilter,VectorDrawableCompat)有这样的场景,所以ART会通知你.

我认为忽略这一点是安全的,除非这是你自己的代码,在这种情况下我要么改变方法的名字,要么在Android上运行Dalvik(4.1之前的版本)并运行ART(4.1)

Android Paint应用二PorterDuffXfermode

Android Paint应用二PorterDuffXfermode

这一篇学习Paint的图层混合模式,即mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
PorterDuff.Mode 中提供了18中混合模式

        CLEAR       (0),
        SRC         (1),
        DST         (2),
             /**注释1
         * <p>
         *     <img src="{@docRoot}reference/android/images/graphics/composite_SRC_OVER.png" />
         *     <figcaption>The source pixels are drawn over the destination pixels.</figcaption>
         * </p>
         * <p>\(\alpha_{out} = \alpha_{src} + (1 - \alpha_{src}) * \alpha_{dst}\)</p>
         * <p>\(C_{out} = C_{src} + (1 - \alpha_{src}) * C_{dst}\)</p>
         */
        SRC_OVER    (3),
        DST_OVER    (4),
        SRC_IN      (5),
        DST_IN      (6),
        SRC_OUT     (7),
        DST_OUT     (8),
        SRC_ATOP    (9),      
        DST_ATOP    (10),
        XOR         (11),
        DARKEN      (16),
        LIGHTEN     (17),
        MULTIPLY    (13),
        SCREEN      (14),
        ADD         (12),
        OVERLAY     (15);

以SRC_OVER为例,它的计算规则是这样的(见注释1):
alpha通道值=原图像的alpha值+(1-原图像的alpha值)*目标图像的alpha值
C 颜色通道值 = 原图像的颜色C值+(1-原图像的颜色C值)*目标图像的颜色C值

那么这18种模式是如何进行混合的呢,这里有两点点需要注意,就是src源图像的区域以及dst目标图像的区域,图层混合模式是作用在两者相交的区域,图层混合模式的效果是作用于src源图像的区域,
PorterDuff.Mode.CLEAR 所绘制的图形不会提交到画布上
PorterDuff.Mode.SRC 显示上层图形
PorterDuff.Mode.DST 显示下层图形
PorterDuff.Mode.SRC_OVER 正常绘制,上下层绘制叠盖
PorterDuff.Mode.DST_OVER 正常绘制,下层居上
PorterDuff.Mode.SRC_IN 取两层交集区域,显示上层
PorterDuff.Mode.DST_IN 取两层交集区域,显示下层
PorterDuff.Mode.SRC_OUT 绘制上层非交集部分,交集部分透明
PorterDuff.Mode.DST_OUT 绘制下层非交集部分,交集部分透明
PorterDuff.Mode.SRC_ATOP 绘制上层交集部分与下层非交集部分
PorterDuff.Mode.DST_ATOP 绘制下层交集部分与上层非交集部分
PorterDuff.Mode.XOR 去除上下层交集区域,绘制非交集区域
PorterDuff.Mode.DARKEN 绘制上下层全部区域,交集部分颜色加深
PorterDuff.Mode.LIGHTEN 绘制上下层全部区域,交集部分颜色点亮
PorterDuff.Mode.MULTIPLY 绘制交集区域,交集部分颜色叠加
PorterDuff.Mode.SCREEN 绘制上下层全部区域,交集部分滤色
PorterDuff.Mode.ADD 绘制上下层全部区域,交集部分饱和度相加
PorterDuff.Mode.OVERLAY 绘制上下层全部区域,交集部分叠加
看一下效果图

在这里插入图片描述


这里的效果图和Google官方的效果图不大一样,这里我们贴一下部分代码

  @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.WHITE);

        Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
        labelP.setTextAlign(Paint.Align.CENTER);
        Paint paint = new Paint();
        paint.setFilterBitmap(false);
        canvas.translate(15, 35);

        int x = 0;
        int y = 0;
        //sModes 图层混合集合
        for (int i = 0; i < sModes.length; i++) {
            // draw the border
            paint.setStyle(Paint.Style.stroke);
            paint.setShader(null);
            canvas.drawRect(x - 0.5f, y - 0.5f, x + W + 0.5f, y + H + 0.5f, paint);

            // draw the checker-board pattern
            paint.setStyle(Paint.Style.FILL);
            paint.setShader(mBG);
            canvas.drawRect(x, y, x + W, y + H, paint);

            // 使用离屏绘制
//            int sc = canvas.saveLayer(x, y, x + W, y + H, null);
            int sc = canvas.saveLayer(x, y, x + W, y + H, null, Canvas.ALL_SAVE_FLAG);
            canvas.translate(x, y);
            canvas.drawBitmap(makeDst(2 * W / 3, 2 * H / 3), 0, 0, paint);
            paint.setXfermode(sModes[i]);
            canvas.drawBitmap(makeSrc(2 * W / 3, 2 * H / 3), W / 3, H / 3, paint);
            paint.setXfermode(null);
            canvas.restoretoCount(sc);

            // draw the label
            labelP.setTextSize(20);
            canvas.drawText(sLabels[i], x + W / 2, y - labelP.getTextSize() / 2, labelP);

            x += W + 10;

            // wrap around when we've drawn enough for one row
            if ((i % ROW_MAX) == ROW_MAX - 1) {
                x = 0;
                y += H + 30;
            }
        }
    }
        // 画圆一个完成的圆
    static Bitmap makeDst(int w, int h) {
        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bm);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(0xFFFFCC44);
        c.drawoval(new RectF(0, 0, w, h), p);
        return bm;
    }

    // create a bitmap with a rect, used for the "src" image
    // 矩形右下角留有透明间隙
    static Bitmap makeSrc(int w, int h) {
        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bm);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(0xFF66AAFF);
        c.drawRect(0, 0, w * 19 / 20, h * 19 / 20, p);
        return bm;
    }

以一张图来说明上述代码的绘制区域

在这里插入图片描述

红色区域表示绘制的src图像,灰色是dst图像的绘制区域,在该区域内绘制了绿色的圆,也就是dst图像,两者的交集区域就是黄色部分

下面看一下Google提供的图层混合示例

在这里插入图片描述


onDraw方法里的实现都是一样的,这里我们看一下绘制图形的创建部分

 // create a bitmap with a circle, used for the "dst" image
    static Bitmap makeDst(int w, int h) {
        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bm);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(0xFFFFCC44);
        c.drawoval(new RectF(0, 0, w*3/4, h*3/4), p);
        return bm;
    }

    // create a bitmap with a rect, used for the "src" image
    static Bitmap makeSrc(int w, int h) {
        Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(bm);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

        p.setColor(0xFF66AAFF);
        c.drawRect(w/3, h/3, w*19/20, h*19/20, p);
        return bm;
    }

在这里插入图片描述


Google的示例中,src、dst图像的绘制区域是充满宽高

无论是src图像,还是dst图像,两者的绘制区域都是填充整个区域,因为两者绘制的区域不同,导致调用图层混合模式后,出现不同的效果。

这里我们以PorterDuff.Mode.DST_ATOP 为例,下层表示效果图中的圆,上层表示方框,它表示绘制下层交集部分与上层非交集部分,在第一种效果图中,绘制下层交集部分,也就是黄色圆与蓝色方框的交集部分,然后绘制上层非交集部分,由于两者绘制的交集区域只有图中的粉色部分,而图层的混合模式只作用于src即蓝色方框,所以出现第一种效果

在这里插入图片描述

而在Google的演示代码中,上下层的绘制区域不同,DST_ATOP绘制下层交集部分与上层非交集部分,也就是绘制了交集部分的圆,再绘制非交集部分的方框,故而出现第二种效果

在这里插入图片描述

在图层混合绘制中,有几点需要注意:
1)先绘制的称其为dst,也就是下层图像,后绘制的称其为src,也就是上层图像
2)在绘制开始即使用图层混合模式前,先调用 canvas.saveLayer 进行离屛绘制,绘制完成后调用 canvas.restoretoCount
3)注意src和dst的绘制矩形区域,区域不同会出现不同的效果
4)有需要是需关闭硬件加速setLayerType(View.LAYER_TYPE_SOFTWARE, null)

Android setColorFilter 滤镜效果

Android setColorFilter 滤镜效果

通过setColorFilter可以实现滤镜效果。
如:
         final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
               //获取壁纸
         final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
         //指定滤镜颜色以及混合模式
       wallpaperDrawable.setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);

注意:PorterDuff.Mode枚举值:
1.PorterDuff.Mode.CLEAR
   
     
     所绘制不会提交到画布上。

2.PorterDuff.Mode.SRC

   显示上层绘制图片
3.PorterDuff.Mode.DST

  显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER

  正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER

  上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN

   取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN

  取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT

 取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT

 取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP

 取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP

  取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR

 //变暗
13.PorterDuff.Mode.DARKEN

//调亮
14.PorterDuff.Mode.LIGHTEN

//用于颜色滤镜
15.PorterDuff.Mode.MULTIPLY


16.PorterDuff.Mode.SCREEN

Android <wbr>setColorFilter <wbr>滤镜效果

Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法

Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法

Android Studio 出现Error(26.13):Fail to resole:com.android.support.appcompat-v7.28_ Install Repository sync project show in file Show in project structure dialog问题的永久解决方案

方法一:

1.临时更改:(在重新创建一个Android项目是会失效)

更改Gradle Scripts中的第一个build.gradle文件(project:MyApplication)

在allprojects{}添加maven,修改如下:

allprojects {
    repositories {
        jcenter()
        maven{
            url "https://maven.google.com"
        }
    }
}

  

2.永久更改方法:

在安装Android studio 的目录文件中更改

Android_Studio\plugins\android\lib\templates\gradle-projects\NewAndroidProject\root\build.gradle.ftl 文件

同样是添加maven

修改如下:

allprojects {
    repositories {
        jcenter()
        maven{
            url "https://maven.google.com"
        }
<#if mavenUrl != "mavenCentral">
        maven {
            url ''${mavenUrl}''
        }
</#if>

 

方法二:

1.临时更改:(在重新创建一个Android项目是会失效)

更改Gradle Scripts中的第二个build.gradle文件(Module:app)

分别修改一下三个选项

compileSdkVersion 26
targetSdkVersion 26
compile ''com.android.support:appcompat-v7:26.+''

数字26是api版本,看自己sdk就可以进项相应的更改,或者提示缺少plantform直接点击安装就行

2.永久更改方案:

以下修改路径都是在Android Studio的安装路径下
C:\Application\Android\Android_Studio\plugins\android\lib\templates\gradle-projects\NewAndroidModule\root\build.gradle.ftl文件
第43行
compileSdkVersion <#if buildApiString?matches("^\\d+$")>${buildApiString}<#else>''${buildApiString}''</#if>
更改成 compileSdkVersion 26

第50行
targetSdkVersion <#if targetApiString?matches("^\\d+$")>${targetApiString}<#else>''${targetApiString}''</#if>
更改成 targetSdkVersion 26

C:\Application\Android\Android_Studio\plugins\android\lib\templates\gradle-projects\NewAndroidProject\root\recipe.xml.ftl
第6行
<dependency mavenUrl="com.android.support:appcompat-v7:${buildApi}.+" />
更改成<dependency mavenUrl="com.android.support:appcompat-v7:26.+" />

  

 

Android Studio java.lang.NoClassDefFoundError:android.support.v4.app.NavUtilsJB

Android Studio java.lang.NoClassDefFoundError:android.support.v4.app.NavUtilsJB

这是我的错误日志与Android Studio 1.0.2实现

02-03 13:05:23.831    8385-8385/com.******.*******E/AndroidRuntime﹕     FATAL EXCEPTION: main
    java.lang.NoClassDefFoundError: android.support.v4.app.NavUtilsJB
        at   android.support.v4.app.NavUtils$NavUtilsImplJB.getParentActivityName(NavUtils    .java:125)
        at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:302)
        at android.support.v4.app.NavUtils.getParentActivityName(NavUtils.java:281)
        at android.support.v7.app.ActionBarActivityDelegateBase.onCreate(ActionBarActivityDelegateBase.java:142)
        at android.support.v7.app.ActionBarActivity.onCreate(ActionBarActivity.java:123)
        at com..******.*******.****.ActivityWelcome.onCreate(ActivityWelcome.java:33)
        at android.app.Activity.performCreate(Activity.java:5104)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
        at android.app.ActivityThread.access$600(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)

组态

buildToolsVersion "21.1.2"
android SDK TOOLS"24.0.2"
multidex enabled
predexLibraries =false
incremental = true
jumboMode = false
  dependencies {
    compile fileTree(dir: 'libs',include: ['*.jar'])
    compile 'com.google.android.gms:play-services:6.5.87'
    compile 'com.google.code.gson:gson:2.3'
    compile 'com.android.support:support-v4:21.0.3@aar'
    compile 'com.android.support:appcompat-v7:21.0.3@aar'
    compile project(':ViewPagerIndicator')
    compile('de.keyboardsurfer.android.widget:crouton:1.8.4@aar') {
        exclude group: 'com.google.android',module: 'support-v4'
    }
    compile 'org.java-websocket:Java-WebSocket:1.3.0'
}

如何解决这个错误?gradlew清洁无济于事。构建文件夹删除也不起作用。Android Studio编译时未显示任何错误。

我们今天的关于java – 在Android 4.1之前,方法android.graphics.PorterDuffColorFilter – 会错误地覆盖包的分享已经告一段落,感谢您的关注,如果您想了解更多关于Android Paint应用二PorterDuffXfermode、Android setColorFilter 滤镜效果、Android Studio 2.3.3 出现Error:(26.13) Fail to resole: com.android.support.appcompat永久解决方法、Android Studio java.lang.NoClassDefFoundError:android.support.v4.app.NavUtilsJB的相关信息,请在本站查询。

本文标签: