【问题标题】:Imageview not updating bitmap, android?Imageview不更新位图,android?
【发布时间】:2018-05-14 12:57:13
【问题描述】:

我有一个 4 页的 viewpager,每个 viewpager 页面都包含一个 recylerview。 Recyclerview 包含 20-30 个元素的列表,在每个元素中我都有一个 imageView,其功能是下载文件并将其替换为画布位图,显示循环进度中的下载百分比 .

我正在下载一个文件并在画布的帮助下显示进度并更新图像视图。 下面是代码

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();
    }
}

下载正在运行,甚至创建了位图,但它没有反映在 UI 中。

【问题讨论】:

  • 你是从后台线程还是从 UIThread 调用这个方法?
  • 来自 UIThread 的@MarcEstrada
  • 这个方法什么时候调用?调用此方法时,您确定您的 ImageView 具有定义的大小吗?因为如果 iv2.getWitdhiv2.getHeight 返回 0 它会解释为什么你什么都看不到。
  • @Eselfar 我已经对此进行了调试,它返回了正确的宽度和高度
  • 能否在调用方法的地方添加代码?我已经尝试过您的代码并且它可以工作(至少它显示了一些东西)。所以如果iv2.getWidthiv2.getHeight > 0 可能你的问题是radiusDifference 值太大了?

标签: android canvas bitmap imageview


【解决方案1】:

试试这个。我已经添加了一些改进,所以现在无论 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();
}

【讨论】:

    猜你喜欢
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2014-11-28
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    相关资源
    最近更新 更多