Рисование прямоугольника не работает в некоторых устройствах - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь нарисовать прямоугольник на холсте, он хорошо работает на Android-устройстве MotoC Plus 7.0, но не работает на некоторых устройствах, таких как Xiaome Redmi 8.0. После отладки кода я обнаружил, что инвалид не работает обновите представление, вызвав метод onDraw в Xiaome Redmi 8.0, но для Motoc Plus 7.0 вызывается метод onDraw. Ниже приведено мое пользовательское представление, может кто-нибудь заметить, какую ошибку я здесь делаю:

public class CustomImageView extends View {
private Paint mRectPaint;
private int mStartX = 0;
private int mStartY = 0;
private int mEndX = 0;
private int mEndY = 0;
private boolean mDrawRect = false;


private Bitmap mBitmap;
private double scale;

public void invalidate(boolean mDrawRect) {
    this.mDrawRect = mDrawRect;
}

public CustomImageView(final Context context) {
    super(context);
    init();
}

public CustomImageView(final Context context, final AttributeSet attrs) {
    super(context, attrs);
    init();
}

public CustomImageView(final Context context, final AttributeSet attrs,
                        final int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public void setContent(Bitmap bitmap, List<Point> pointList, boolean mDrawRect) {
    this.mBitmap = bitmap;
    this.mDrawRect = mDrawRect;

    if (pointList != null && pointList.get(0) != null && pointList.get(1) != null)
        setValue(pointList);

    //setWillNotDraw(false);
    invalidate();
}

private void setValue(List<Point> pointList) {
    mStartX = (int) ((int) Math.min(pointList.get(0).x, pointList.get(1).x) * scale);
    mStartY = (int) ((int) Math.min(pointList.get(0).y, pointList.get(1).y) * scale);
    mEndX = (int) ((int) Math.max(pointList.get(1).x, pointList.get(0).x) * scale);
    mEndY = (int) ((int) Math.max(pointList.get(1).y, pointList.get(0).y) * scale);
    Log.e("mStartX,mStartY :: ", mStartX +","+mStartY);
    Log.e("mEndX,mEndY :: ", mEndX +","+mEndY);
}

private void init() {
    mRectPaint = new Paint();
    mRectPaint.setColor(Color.parseColor("#55000000"));
    mRectPaint.setStyle(Paint.Style.FILL);
    mRectPaint.setStrokeWidth(5);
    mRectPaint.setStrokeJoin(Paint.Join.ROUND);
    mRectPaint.setAntiAlias(true);
    mRectPaint.setDither(true);

    //setWillNotDraw(false);

}

@Override
protected void onDraw(final Canvas canvas) {
    super.onDraw(canvas);
    this.scale = drawBitmap(canvas);
    if (mDrawRect) {
        canvas.drawRect(Math.min(mStartX, mEndX), Math.min(mStartY, mEndY),
                Math.max(mEndX, mStartX), Math.max(mEndY, mStartY),
                mRectPaint);
    }
}

private double drawBitmap(Canvas canvas) {
    double viewWidth = canvas.getWidth();
    double viewHeight = canvas.getHeight();
    double imageWidth = mBitmap.getWidth();
    double imageHeight = mBitmap.getHeight();
    double scale = Math.min(viewWidth / imageWidth, viewHeight / imageHeight);

    Rect destBounds = new Rect(0, 0, (int) (imageWidth * scale), (int) (imageHeight * scale));
    canvas.drawBitmap(mBitmap, null, destBounds, null);
    return scale;
}

public double getScale() {
    return scale;
}
}

1 Ответ

0 голосов
/ 07 января 2019

Решена проблема с изменением имени метода

 public void invalidate(boolean mDrawRect) {
    this.mDrawRect = mDrawRect;
}

до

public void invalidateCustomview(boolean mDrawRect) {
    this.mDrawRect = mDrawRect;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...