以上就是给各位分享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 – 会错误地覆盖包
- 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 – 会错误地覆盖包
我正在使用导航抽屉活动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
这一篇学习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 滤镜效果
通过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 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 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的相关信息,请在本站查询。
本文标签: