это мой пользовательский класс ImageView, я переопределяю onDraw (холст холста) и хочу обрезать imageView с помощью PorterDuff.Mode.DST_IN:
public class RoundCornerImageView extends ImageView {
private Paint mPaint;
private RectF mRectF;
private Path mPath;
private Xfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
public RoundCornerImageView(Context context) {
super(context);
init();
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
public RoundCornerImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
setLayerType(LAYER_TYPE_SOFTWARE, null);
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.WHITE);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setAntiAlias(true);
mRectF = new RectF();
mPath = new Path();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mRectF.set(0, 0, w, h);
}
@Override
protected void onDraw(Canvas canvas) {
int count = canvas.saveLayer(mRectF, null, Canvas.ALL_SAVE_FLAG);
super.onDraw(canvas);
mPaint.setXfermode(mXfermode);
canvas.drawPath(genPath(), mPaint);
mPaint.setXfermode(null);
canvas.restoreToCount(count);
}
private Path genPath() {
mPath.reset();
mPath.addRoundRect(mRectF, 40, 40, Path.Direction.CCW);
return mPath;
}
}
, и это мой xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#ffffff">
<RoundCornerImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/test"
android:scaleType="centerCrop"
android:layout_gravity="center"/>
</FrameLayout>
это результат прогона: результат прогона, без круглого угла
, и это эффект, который я хочу, чтобы он отображался: эффект, который яхочу
Мой способ реализации - обратиться к этой библиотеке третьей части: rcImageview , в моем тесте он может работать нормально, но мой не может.
ps: версия моего телефона Android 7.1。
------------------ разделитель ----------------- Я нашел этот код строки "setLayerType (LAYER_TYPE_SOFTWARE, null);"вызвать проблему , когда я удаляю этот строковый код , он может работать нормально. И я не знаю почему.