我想知道PorterDuff.Mode在android图形中的含义.
我知道这是一种转移模式.
我也知道,它有DST_IN,Multiply等属性.
有一个丰富的UI应用程序,我想在其中显示具有这种复杂形状的图像
现在我想要的是根据蒙版图像裁剪我的图像,实际上图像是动态的,可以从相机或图库(方形或矩形)导入,我希望该图像适合我的布局框架,如上所述
所以只是想知道我如何实现这一目标?任何想法/暗示欢迎
背景框架
面具
像这样
我有一个视图,它做了一些基本的绘图.在此之后,我想绘制一个打孔的矩形,这样只能看到上一个图形的一个区域.我想为我的视图启用硬件加速以获得最佳性能.
目前我有两种方法可以工作,但只有在禁用硬件加速时才有效,而另一种方法太慢.
方法1:SW加速(慢)
final int saveCount = canvas.save();
// Clip out a circle.
circle.reset();
circle.addCircle(cx, cy, radius, Path.Direction.CW);
circle.close();
canvas.clipPath(circle, Region.Op.DIFFERENCE);
// Draw the rectangle color.
canvas.drawColor(backColor);
canvas.restoreToCount(saveCount);
Run Code Online (Sandbox Code Playgroud)
这不适用于为视图启用的硬件加速,因为在此模式下不支持'canvas.clipPath'(我知道我可以强制SW渲染,但我想避免这种情况).
方法2:硬件加速(V.慢速)
// Create a new canvas.
final Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(b);
// Draw the rectangle colour.
c.drawColor(backColor);
// Erase a circle.
c.drawCircle(cx, cy, radius, eraser);
// Draw the bitmap on our views canvas.
canvas.drawBitmap(b, 0, 0, null);
Run Code Online (Sandbox Code Playgroud)
橡皮擦创建的地方
eraser = new Paint()
eraser.setColor(0xFFFFFFFF); …
Run Code Online (Sandbox Code Playgroud) 我想一个补充ColorFilter
到ImageView
.
目前我正在使用:
ImageView iv = (ImageView)findViewById(resIdOfImageToFilter);
iv.setColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
Run Code Online (Sandbox Code Playgroud)
我检查了多种模式PotterDuff
,如SRC_IN
,SRC
等,但我没有得到任何的模式有什么区别...所有模式将整个ImageView
完美的红色.
我需要在现有图像中混合使用RED颜色,这样图像看起来就会带有REDDISH色调....
我正在尝试创建一个简单的自定义视图:有一个由弧路径显示的位图 - 从0deg到360deg.学位正在随着一些FPS而变化.
所以我使用重写onDraw()
方法创建了一个自定义视图:
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
canvas.drawArc(arcRectF, -90, currentAngleSweep, true, arcPaint);
arcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, circleSourceRect, circleDestRect, arcPaint);
}
Run Code Online (Sandbox Code Playgroud)
arcPaint
初始化如下:
arcPaint = new Paint();
arcPaint.setAntiAlias(true);
arcPaint.setColor(Color.RED); // Color doesn't matter
Run Code Online (Sandbox Code Playgroud)
现在,一切都很棒,但是...整个视图中的背景是黑色的.
如果我设置canvas.drawColor(..., PorterDuff.Mode.DST)
并省略canvas.drawBitmap()
- 在透明背景上正确绘制圆弧.
我的问题是 - 如何设置PorterDuff
模式以使其与透明度一起工作?
当然bitmap
是具有alpha通道的32位PNG.
我正在尝试解决android的问题ColorFilters
.文档很差,所以主要方法是尝试不同的变体.
问题:
有一个位图.一些像素具有alpha = 255,其他像素具有alpha = 0.我正在尝试绘制一个具有特定颜色的圆圈.我想在位图中不改变alpha通道,但在绘图时我想将颜色乘以位图-α.
因此,在绘制圆形时,我希望不绘制alpha = 0的像素,但是alpha = 255的像素要涂上我想要的颜色.Alpha通道不应该改变.
我正在尝试使用porter-duff ColorFilter(android sdk中的PorterDuffColorFilter类).
官方网站上有太多的模式和不可理解的描述:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html
我想我应该使用DST_ATOP
或SRC_ATOP
,但它们不像我描述的那样工作.
此外,srcColor
在porter-duff colorfilter的构造函数中有一个奇怪的参数.
我无法理解"Sa"和"Sc"在公式中的含义[Da, Sc * Da + (1 - Sa) * Dc]
.它可以来自传递给colorfilter构造函数的颜色,也可以通过"paint.setColor"进行颜色设置.
谁知道,它是如何工作的?
是否有可能在Android中设置一个视图,它将一些颜色过滤器应用于其边界内可见的所有内容?就像在这个例子中:
只是一个简单的矩形视图,可以反转其下方所有内容的颜色.当然,当用户滚动列表时,它也会反映在倒置框中.有没有一些简单的方法来使用彩色滤镜,PorterDuff模式等?
我有以下布局:
<LinearLayout
android:id="@+id/myButton"
android:layout_width="@dimen/logo_radius"
android:layout_height="match_parent"
android:background="@drawable/myShape">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/driver_half"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
和以下myShape
drawable:
<selector>
<item><shape android:shape="oval">
<stroke android:color="@android:color/black" android:width="4dp"/>
<solid android:color="@android:color/white" />
</shape></item>
</selector>
Run Code Online (Sandbox Code Playgroud)
我应用了以下过滤器:
myButton.getBackground().setColorFilter( orange, PorterDuff.Mode.ADD );
Run Code Online (Sandbox Code Playgroud)
结果看起来那样:
然后我将myShape改为圆角矩形:
<selector>
<item>
<shape
android:shape="rectangle">
<corners android:bottomLeftRadius="@dimen/logo_radius" android:bottomRightRadius="2dp" android:topLeftRadius="@dimen/logo_radius" android:topRightRadius="2dp"/>
<stroke
android:width="4dp"
android:color="@android:color/black"/>
<solid android:color="@android:color/white"/>
</shape>
</item>
</selector>
Run Code Online (Sandbox Code Playgroud)
结果看起来像:
左边部分没有应用过滤器,右边部分没有过滤器.
我想得到什么:
如何使用Porter-Duff过滤器正确绘制边框橙色?还有其他选择吗?
这两个实现之间有什么区别?
DrawableCompat.setTintMode(wrappedDrawable, Mode.SRC_ATOP);
DrawableCompat.setTint(wrappedDrawable, color);
Run Code Online (Sandbox Code Playgroud)
和
drawable.setColorFilter(color, Mode.SRC_ATOP);
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的应用中创建以下设计.
它是主UI上面的叠加层.尝试使用主UI顶部的布局创建它,其背景为以XML创建的半透明形状.然而,即使阅读了多篇文章,我也无法弄明白.
我尝试了以下方法,但它没有用.创建一个200dp笔划的环形,并将其设置为imageview的源,然后将scaletype设置为centerCrop,但形状不像位图那样缩放.
形状XML:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:innerRadius="0dp"
android:shape="ring"
android:thicknessRatio="2"
android:useLevel="false" >
<solid android:color="@android:color/transparent" />
<stroke
android:width="200dp"
android:color="#80000000" />
</shape>
Run Code Online (Sandbox Code Playgroud)
叠加布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/onboarding_background"
android:scaleType="centerCrop"/>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
有关如何执行此操作或代码的任何指示都非常有用.