Android SurfaceView中的onTouch和OnDraw

Android SurfaceView中的onTouch和OnDraw,android,android-layout,android-canvas,Android,Android Layout,Android Canvas,我正试图根据屏幕上的轨迹进行绘制。在这个过程中,我的onTouch和OnDraw没有被执行。你能帮我更正这个代码吗 Xml 路径绘制 公共类PathDraw扩展SurfaceView实现SurfaceHolder.Callback { 私人语境; //列出要点; ArrayList points=新的ArrayList(); 公共路径绘制(上下文){ 超级(上下文); //TODO自动生成的构造函数存根 } 公共路径绘制(上下文、属性集属性){ 超级(上下文,attrs); //TODO自动生成

我正试图根据屏幕上的轨迹进行绘制。在这个过程中,我的onTouch和OnDraw没有被执行。你能帮我更正这个代码吗

Xml 路径绘制
公共类PathDraw扩展SurfaceView实现SurfaceHolder.Callback
{
私人语境;
//列出要点;
ArrayList points=新的ArrayList();
公共路径绘制(上下文){
超级(上下文);
//TODO自动生成的构造函数存根
}
公共路径绘制(上下文、属性集属性){
超级(上下文,attrs);
//TODO自动生成的构造函数存根
this.context=上下文;
getHolder().addCallback(此);
}
公共路径绘制(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
//TODO自动生成的构造函数存根
}
受保护的void OnDraw(画布,int值){
油漆=新油漆();
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.笔划);
油漆。设置行程宽度(2);
油漆。设置颜色(颜色。白色);
路径路径=新路径();
布尔值优先=真;
用于(点:点){
如果(第一){
第一个=假;
路径移动到(点x,点y);
}
否则{
lineTo路径(点x、点y);
}
} 
画布.绘制路径(路径,绘制);
}
公共布尔onTouch(视图、运动事件){
//if(event.getAction()!=MotionEvent.ACTION\u向下)
//返回super.onTouchEvent(事件);
点=新点();
point.x=event.getX();
point.y=event.getY();
点。添加(点);
使无效();
Log.d(“路径绘制”,“点:+点”);
返回true;
}
@凌驾
公共无效表面更改(表面更改arg0、int arg1、int arg2、int arg3){
//TODO自动生成的方法存根
}
@凌驾
已创建公共空白表面(表面文件夹arg0){
//TODO自动生成的方法存根
}
@凌驾
公共空间表面已覆盖(表面层arg0){
//TODO自动生成的方法存根
}
}
未调用OnTouch 今天早些时候我也有同样的问题

类PathDraw应实现OnTouchListener,然后将侦听器设置为自身,执行以下操作:

public class PathDraw extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback{
    ...    
    public PathDraw(Context context){
        super(context);
        setOnTouchListener(PathDraw.this);  
    }
未调用OnDraw 这篇文章可能会有帮助:

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    PathDraw sineWaveSurfaceView = (PathDraw) findViewById(R.id.surfaceView);
}

}
public class PathDraw extends SurfaceView implements SurfaceHolder.Callback 
{
private Context context; 
//  List<Point> points;
  ArrayList<Point> points = new ArrayList<Point>();

public PathDraw(Context context)    {
    super(context);
    // TODO Auto-generated constructor stub  
}

public PathDraw(Context context, AttributeSet attrs)    {
    super(context, attrs);
    // TODO Auto-generated constructor stub 
    this.context = context;
    getHolder().addCallback(this); 
}

public PathDraw(Context context, AttributeSet attrs, int defStyle)  {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub 
}

protected void OnDraw(Canvas canvas, int value) {  
    Paint paint = new Paint();
    paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(2);
    paint.setColor(Color.WHITE);

    Path path = new Path();
    boolean first = true;
    for(Point point : points){
        if(first){
            first = false;
            path.moveTo(point.x, point.y);
        }
        else{
            path.lineTo(point.x, point.y);
        }
    } 
    canvas.drawPath(path, paint);  
}

public boolean onTouch(View view, MotionEvent event) {
    // if(event.getAction() != MotionEvent.ACTION_DOWN)
    // return super.onTouchEvent(event);
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    points.add(point);
    invalidate();
    Log.d("PathDraw", "point: " + point);
    return true;
}


@Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3)    {
    // TODO Auto-generated method stub 
}

@Override
public void surfaceCreated(SurfaceHolder arg0)  {
    // TODO Auto-generated method stub  
}

@Override
public void surfaceDestroyed(SurfaceHolder arg0)    {
    // TODO Auto-generated method stub

}

}
public class PathDraw extends SurfaceView implements OnTouchListener, SurfaceHolder.Callback{
    ...    
    public PathDraw(Context context){
        super(context);
        setOnTouchListener(PathDraw.this);  
    }