如何获得当前的画布?

Leo*_*Leo 14 android view android-canvas

我有DrawView.如果我触摸此视图,则会绘制小圆圈.我不会画圆圈但不会触摸视图 - 使用帮助功能"setPoints".我所做的:

package com.samples;
import ...

public class DrawView extends View {
    ArrayList<Point> points = new ArrayList<Point>();

    Paint paint = new Paint();

    private int pSize = 5;
    private int pColor = Color.BLACK;

    public DrawView(Context context, AttributeSet attrs) {

        super(context, attrs);

        setFocusable(true);
        setFocusableInTouchMode(true);

        this.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                v.setOnTouchListener(this);
                    Point point = new Point();
                    point.x = event.getX();
                    point.y = event.getY();
                    points.add(point); 
                    invalidate();
                }
                return true;
            }
        });
        requestFocus();
    }

    @Override
    public void onDraw(Canvas canvas) { 
        for (Point point : points) {
            canvas.drawCircle(point.x, point.y, pSize, paint);
        }
    }

    public void setPoints(Float xP, Float yP)
    {
        Point point = new Point();
        point.x = xP;
        point.y = yP;
        points.add(point);
        postInvalidate();
    }
}

class Point {
    float x, y;

    @Override
    public String toString() {
        return x + ", " + y;
    }
}
Run Code Online (Sandbox Code Playgroud)

请告诉我,如何将画布输出setPoints功能?

更新: 哇,这真的很有趣.我的DrawView包含在Horizo​​ntalScrollView中.因为如果我在这个DrawView中设置了正确的坐标,没有人知道哪里有可绘制的圆圈.

Raf*_*ele 6

你不能.画布由系统管理并传递给您onDraw().我不明白为什么你需要它在那里之外.只需重新声明setPoints这样

public void setPoints(Canvas canvas, Float xP, Float Yp)
Run Code Online (Sandbox Code Playgroud)

您可以保留以前图纸的缓存(或存储以前的点)

  • 你似乎不知道 Android 是如何绘制 Views 的。当系统检测到小部件需要(重新)绘制时,它会敲开小部件的门并通过“onDraw(Canvas)”做出响应。因此,您可以保证每次需要时都会调用此方法。_trigger_ _the_ _repaint_ 的一种方法是调用`invalidate()`(或`postInvalidate`)。所以你永远不必自己调用 onDraw,但要确保 Android 会在需要时调用它。您需要提供回调。另外,请用“我想画圆圈但不想触摸视图”来说明您的意思 (2认同)