所以我从这里尝试了代码:用掩码创建一个ImageView.我使用以下图像作为原始和掩码:


但是,我得到的结果是这样的:

请注意,窗口背景不是黑色,而是全息光(在星系连接上看起来像一个非常浅的灰色,而不是完全白色).第二个图像是在列表视图中选择项目时得到的结果.
相反,如果我使用相同的算法创建一个新的位图,然后将其传递给图像视图而不是覆盖onDraw(),它会正确绘制:
Canvas canvas = new Canvas();
Bitmap mainImage = //get original image
Bitmap maskImage = //get mask image
Bitmap result = Bitmap.createBitmap(mainImage.getWidth(), mainImage.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(result);
Paint paint = new Paint();
paint.setFilterBitmap(false);
canvas.drawBitmap(mainImage, 0, 0, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(maskImage, 0, 0, paint);
paint.setXfermode(null);
imageView.setImageBitmap(result);
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果:

请注意,正确应用了淡入淡出.选择时,这一点更为明显.
那么ImageView的onDraw方法是如何创建这个黑色背景而不是让窗口背景显示的呢?有趣的是,如果原始图像本身具有一定的透明度,则该透明度得到尊重,例如:

我自己无法弄明白.我宁愿能够在onDraw上进行,而不是预先创建位图,因为它只适用于位图作为源和掩码.我希望能够使用其他可绘制的内容,如渐变和纯色,但在这些情况下,宽度和高度未设置.
从android 3.0 开始,硬件加速开启的设备不再支持clipPath()方法.(阅读本文了解更多详情).
我正在使用画布,我需要绘制圆形图像.关于我该怎么做的任何想法?
*我无法关闭硬件加速,我正在寻找其他解决方案.
回答:Tnx @Malcolm的答案.我发现了一个展示这种技术的好例子,它基本上是一个面具.
我有一个特定的drawable,我在我的应用程序中用作背景.它不是纯色.
现在我想为这个drawable添加圆角.
我只发现圆角可用渐变色或纯色作为背景但不是另一种可绘制的形状.
是否有另一种简单的方法可以将圆角添加到drawable中?
我正在尝试使用圆角(以及选择的背景颜色)创建一个可以重复使用不同背景颜色的视图; 很难解释,所以这是我的代码:
/app/src/com/packagename/whatever/CustomDrawableView.java
package com.packagename.whatever;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.PaintDrawable;
import android.util.AttributeSet;
import android.view.View;
public class CustomDrawableView extends View {
private PaintDrawable mDrawable;
int radius;
private void init(AttributeSet attrs) {
TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.RoundedRect);
radius = a.getInteger(R.styleable.RoundedRect_radius, 0);
}
public CustomDrawableView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
mDrawable = new PaintDrawable();
}
protected void onDraw(Canvas canvas) {
mDrawable.setCornerRadius(radius);
mDrawable.draw(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
这是显示自定义组件的XML: /app/res/layout/test.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ny="http://schemas.android.com/apk/res/com.packagename.whatever"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ffffff"
android:padding="10dp">
<com.packagename.whatever.CustomDrawableView
android:id="@+id/custom"
android:layout_width="200dp" …Run Code Online (Sandbox Code Playgroud) 我做一个类扩展LinearLayout我想显示一个像这样的Rect:
--------------------- => it is round corner
| border frame | .
| ----------------- | .
| | hearder | | .
| | - - - - - - - | | .
| | center | | .
| | | | .
| | - - - - - - - | | .
| | buttom | | .
| ---------------- | .
| | .
---------------------- .
. . . . . . . . …Run Code Online (Sandbox Code Playgroud) 我找到了很多圆角的样本代码.我需要的是圆形图像.我发现这个没问题,但输出不是完美的圆形.
ImageView im = (ImageView) findViewById(R.id.imag);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.white);
Bitmap circleBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);
BitmapShader shader = new BitmapShader(bmp, TileMode.CLAMP, TileMode.CLAMP);
Paint paint = new Paint();
paint.setShader(shader);
Canvas c = new Canvas(circleBitmap);
c.drawCircle(bmp.getWidth() / 2, bmp.getHeight() / 2, bmp.getWidth() / 2, paint);
im.setImageBitmap(circleBitmap);
Run Code Online (Sandbox Code Playgroud)