Android SurfaceView中的onTouch和OnDraw
我正试图根据屏幕上的轨迹进行绘制。在这个过程中,我的onTouch和OnDraw没有被执行。你能帮我更正这个代码吗 Xml 路径绘制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自动生成
公共类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);
}