Я пытаюсь использовать PorterDuffXfermode для реализации RoundCornerImageView, но безрезультатно, что не так с моим кодом? - PullRequest
0 голосов
/ 01 марта 2019

это мой пользовательский класс 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);"вызвать проблему , когда я удаляю этот строковый код , он может работать нормально. И я не знаю почему.

...