ImageView:onDraw方法绘制的是“在”图像背景之后,而不是在顶部。

5
这是一个简单的ImageView扩展代码,允许用户用手指进行绘图。
public class MyImageView extends ImageView {

    List<Point> points = new ArrayList<Point>();
    Paint paint = new Paint();

    public MyImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onDraw(Canvas canvas) {
        for (Point point : points) {
            canvas.drawCircle(point.x, point.y, 5, paint);
            // Log.d(TAG, "Painting: "+point);
        }
        super.onDraw(canvas);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);
        Point point = new Point();
        point.x = event.getX();
        point.y = event.getY();
        points.add(point);
        invalidate();
        Log.d("", "point: " + point);
        return true;
    }

    class Point {
        float x, y;
        @Override
        public String toString() {
            return x + ", " + y;
        }
    }
}

这个方法运作得很好。

现在,我想使用这段代码在一个位图的顶部绘制。

我使用了:

MyImageView ivPic = (MyImageView) dialog.findViewById(R.id.ivPic);
ivPic.setImageBitmap(picture);

但是图形是在 Bitmap 的 “后面” 绘制的:

enter image description here

请问您有任何想法可以在 Bitmap 的“顶部”进行绘制吗?


你是否成功获得了你的绘图位图和背景位图?我也在做同样的事情,但无法保存修改后的位图。 - Jav T
4个回答

6

我已经在onDraw方法中改变了顺序,将super.onDraw(canvas);放在开头,现在我认为它可以工作了。


3

重写并使用dispatchDraw方法,我用它来在视图上进行绘制。


Mosh,你还记得这个吗?你在重写dispatchDraw方法中放了什么? - quinestor
你,我的朋友,现在救了我的一周。非常感谢你。我在RecyclerView上使用了它,它完美地工作了。从API > 23开始,有一个方法onDrawForeground(Canvas canvas)可以做到这一点。但是我需要支持API >= 16。 - Abdelhakim AKODADI

0

我回答了自己的问题,刚刚找到了答案:

ivPic.setBackgroundDrawable(new BitmapDrawable(getResources(),picture));

不知道这是否是最佳实践,但对我来说有效...


0

更改顺序:先调用super.OnDraw(canvas),然后再进行绘制操作

@Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (Point point : points) {
            canvas.drawCircle(point.x, point.y, 5, paint);
            // Log.d(TAG, "Painting: "+point);
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接