Android 如何获取当前画布?

Android 如何获取当前画布?,android,view,android-canvas,Android,View,Android Canvas,我有DrawView。如果我触摸这个视图,它会画出小圆圈。我习惯于画圆圈,但不接触视图-使用帮助功能“设定点”。我所做的: package com.samples; import ... public class DrawView extends View { ArrayList<Point> points = new ArrayList<Point>(); Paint paint = new Paint(); private int pSi

我有DrawView。如果我触摸这个视图,它会画出小圆圈。我习惯于画圆圈,但不接触视图-使用帮助功能“设定点”。我所做的:

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;
    }
}
package.com.samples;
导入。。。
公共类DrawView扩展视图{
ArrayList points=新的ArrayList();
油漆=新油漆();
私人智力pSize=5;
private int pColor=Color.BLACK;
公共绘图视图(上下文、属性集属性){
超级(上下文,attrs);
设置聚焦(真);
setFocusableInTouchMode(真);
this.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
v、 setOnTouchListener(这个);
点=新点();
point.x=event.getX();
point.y=event.getY();
点。添加(点);
使无效();
}
返回true;
}
});
requestFocus();
}
@凌驾
公共空白onDraw(画布){
用于(点:点){
画布.画圈(x点,y点,心灵感应,绘画);
}
}
公共无效设定点(浮点xP、浮点yP)
{
点=新点();
点x=xP;
点y=yP;
点。添加(点);
后验证();
}
}
类点{
浮动x,y;
@凌驾
公共字符串toString(){
返回x+“,”+y;
}
}
请告诉我,如何获取画布设置点功能

更新:
哇,这真是个有趣的问题。我的DrawView包含在水平滚动视图中。因为如果我在这个DrawView中设置正确的坐标,没有人知道可绘制的圆在哪里

尝试在DrawView类中将canvas2声明为公共变量。

您不能。画布由系统管理,并传递给您的
onDraw()
。我不明白你为什么需要它在外面。只需像这样重新声明设置点

public void setPoints(Canvas canvas, Float xP, Float Yp)

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

您可以在
onDraw()中绘制圆。这就是
View
的工作方式(从技术上讲,它实际上在
draw()
方法中,但我们将忽略这一点)。在
setPoints()
中,在类范围内的变量中设置圆的点,调用
invalidate()
,然后像在
onDraw()
中那样绘制圆。如果遵循此方法,则遵循的是视图设计的类流。

hmm。。公共无效设置点(Float xP,Float Yp){canvas2.drawCircle(xP,Yp,5,paint);invalidate();}so?编号
canvas2.drawCircle(xP,Yp,5,paint)进入
onDraw()
。您保存
xP
yP
的值,然后在
setPoints()中调用
invalidate()
,点不是问题,我保留它。关于“Canvas Canvas”:如果从不调用onDraw,我该怎么办?您似乎不知道Android如何绘制视图。当系统检测到小部件需要(重新)绘制时,它会敲响小部件的门,并通过
onDraw(Canvas)
做出响应。因此,可以保证每次需要时都会调用此方法。触发重新绘制的一种方法是调用
invalidate()
(或
postInvalidate
)。所以你永远不必亲自调用onDraw,但要确保Android会在需要时调用它。您需要提供回调。另外,请详细说明“我想画圆圈,但不要触摸视图”的含义。你能给我一个链接或关键字吗?文档很少,问题只存在于画布调用中。这个问题很难理解。请回顾一下这并不容易,要破译你想要完成的事情:)首先,删除
canvas2
:它没有像你想的那样工作。我怀疑你们想保留以前画的圆圈,是吗?如果这是您的目标,您必须维护draw调用的历史记录,并且可以通过两种方式完成:1)存储数组
点[]
,并在
onDraw中绘制每个圆;或者2)每次添加一个圆时,您都会更新缓存
位图
我不想画这个圆,但不要触摸屏幕!我意识到了。我在抽屉里写字。玩家_1拥有DrawView并可以触摸它。玩家2拥有DrawView,但无法触摸它。玩家1设置每个服务器的触摸坐标,玩家2获得。这是工作。玩家_1可以画圆圈,我看到了。Player_2正确地获取它(套接字连接类将坐标发送到DrawView类,我在Log(Log.v(“pnts.substring”,pnts2);)中看到它),但我不能在设置点函数中调用onDraw,因为我从未调用/创建/获取它,这是我的问题-Player_2看不到Player_1的圆。当你收到一个新点时,将其添加到列表并调用View.postInvalidate()。这将调用onDraw(),您将对其进行修改以循环遍历列表,并为传递给onDraw的画布上的每个点绘制一个圆(这是画布,不是画布2!)