Imageview не обновляет растровое изображение, Android? - PullRequest
0 голосов
/ 14 мая 2018

У меня есть просмотрщик из 4 страниц, каждая страница просмотра содержит повторный просмотр. Recyclerview содержит список из 20-30 элементов, в каждом элементе у меня есть imageView, чья функциональность заключается в загрузке файла и замене его холстом растровым изображением, показывающим процент загрузки в циклическом процессе .

Я загружаю файл и показываю прогресс с помощью canvas и обновляю изображение. Ниже приведен код

radiusDifference - 7 для планшета и 5 для мобильных экранов.

private void circularImageBar(ImageView iv2, int progess, int radiusDifference) {
        System.out.println("sowload percent-" + progess);

            Bitmap b = null;
            Canvas canvas = null;
            Paint paint = null;
            if (b == null) {
                b = Bitmap.createBitmap(iv2.getWidth(), iv2.getHeight(), Bitmap.Config.ARGB_8888);
                canvas = new Canvas(b);
                paint = new Paint();
            }

            paint.setColor(Color.DKGRAY);
            paint.setStrokeWidth(iv2.getWidth() / 10);
            paint.setStyle(Paint.Style.STROKE);
            paint.setAntiAlias(true);
            canvas.drawCircle(iv2.getWidth() / 2, iv2.getHeight() / 2, 
                    (iv2.getWidth() / 2) - radiusDifference, paint);


            int tintColor = Color.parseColor("#F81004");
            paint.setColor(tintColor);
            paint.setStrokeWidth(iv2.getWidth() / 10);
            paint.setAntiAlias(true);
            final RectF oval = new RectF();
            paint.setStyle(Paint.Style.STROKE);
            oval.set(radiusDifference, radiusDifference, iv2.getWidth() - radiusDifference, 
                    iv2.getHeight() - radiusDifference); 

            canvas.drawArc(oval, 270, ((progess * 360) / 100), false, paint);

            iv2.setImageBitmap(b);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                iv2.setForegroundGravity(View.TEXT_ALIGNMENT_CENTER);
            }
            iv2.requestLayout();
    }
}

Загрузка выполняется и даже создается растровое изображение, но оно не отображается в пользовательском интерфейсе.

1 Ответ

0 голосов
/ 14 мая 2018

Попробуйте это. Я добавил некоторые улучшения, поэтому теперь он должен работать, независимо от того, есть ли ImageView с высотой и высотой.

private void circularImageBar(ImageView iv2, int progess, int radiusDifference) {
    System.out.println("sowload percent-" + progess);

    final int width = iv2.getWidth();
    final int height = iv2.getHeight();

    final Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(b);

    final int strokeWidth = width / 10;
    final Paint paint = new Paint();
    paint.setColor(Color.DKGRAY);
    paint.setStrokeWidth(strokeWidth);
    paint.setStyle(Paint.Style.STROKE);
    paint.setAntiAlias(true);

    final int min = Math.min(width, height);
    final float radius = (min / 2f) - radiusDifference - (strokeWidth / 2f);
    final float cx = width / 2f;
    final float cy = height / 2f;

    canvas.drawCircle(cx, cy, radius, paint);

    final int tintColor = Color.parseColor("#F81004");
    paint.setColor(tintColor);
    final RectF oval = new RectF(cx - radius, cy - radius, cx + radius, cy + radius);

    canvas.drawArc(oval, 270, ((progess * 360) / 100f), false, paint);

    iv2.setImageBitmap(b);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        iv2.setForegroundGravity(View.TEXT_ALIGNMENT_CENTER);
    }
    iv2.requestLayout();
}
...