繁体   English   中英

在Android中从ArrayList获取数据

[英]Get data from ArrayList in Android

我正在绘图应用程序中,我在ArrayList保存了每个路径和绘制,但是我不知道我在做什么,无法按预期访问结果。

这是我的代码:

// Class extend from SurfaceView

private ArrayList<Drawing> drawingList;

// inner class 
public class Drawing {
    private Path path;
    private Paint paint;

    public Drawing(Path path, Paint paint){
        this.path = path;
        this.paint = paint;
    }

    public Path getPath() {
        return path;
    }
    public Paint getPaint() {
        return paint;
    }
}

 // inside setup function initialize ArrayList
   drawingList = new ArrayList<Drawing>(); 

// Actual working function
@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawCanvas = surfaceHolder.lockCanvas();
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:

            drawingList.add(new Drawing(drawPath, drawPaint));

            for(Drawing drawing : drawingList) {
                if(drawing.getPath() != null) {
                    drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
                }
            }
            drawPath.reset();
            surfaceHolder.unlockCanvasAndPost(drawCanvas);
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

问题:如果我绘制路径,则在绘制新路径时,一次只能绘制一个路径,而上一个则自动删除。 如果删除drawPath.reset(); 从代码绘制路径开始工作正常,您可以绘制任意数量的路径。 但是,当您更改drawPaint的颜色(例如drawPaint.setColor(paintColor);时,就会出现另一个问题drawPaint.setColor(paintColor); 颜色设置为所有路径而不是最后一个

花了一些时间后,我认为问题的原因是删除了drawPath.reset(); 码。 因为当我们删除Java时,只考虑一条路径而不是多路径,这就是为什么更改颜色时将其设置为整个路径的原因。 但是我不知道我是对还是错。

尝试克服情况为了克服这种情况,我创建了ArrayList来存储每个路径并在其中绘制,并且每次用户绘制新路径时都会重新绘制所有路径。 但这不是可行的问题是相同的,您一次只能绘制一条路径,而前一条则被删除。

你能让我知道我在想什么。

更新资料

每次创建新的PathPaint对象并将其保存在drawingList

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    Path path = new Path();
    Paint paint = new Paint();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawCanvas = surfaceHolder.lockCanvas();
            paint.setColor(paintColor);
            paint.setAntiAlias(true);
            paint.setStrokeWidth(20);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeWidth(brushSize);
            path.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawingList.add(new Drawing(path, paint));
            for(Drawing drawing : drawingList) {
                if(drawing.getPath() != null) {
                    drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
                }
            }
            surfaceHolder.unlockCanvasAndPost(drawCanvas);
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

没问题

原因我想这个原因是drawingList保存的参考pathpaint每个用户的触摸pathpaint初始化新。 这就是为什么drawingList丢失引用而无法绘制任何内容的原因。

克服情况的想法如果我们将原始值保存在drawingList而不是参考中,我认为我们可以克服这种情况。 但是,我们该怎么做呢?

之所以不起作用,是因为您要在drawingList中保存空pathpaint

如果您仔细查看代码,就在onTouchEvent内初始化path并进行paint ,则可以在ACTION_DOWN分配这些变量。您知道ACTION_DOWN仅在用户按住触摸时发生,这意味着只调用一次才能绘制一条路径,onTouchEvent却在用户移动。 这是第二次在onTouchEvent调用pathpaint初始化但未赋值时onTouchEvent 的问题 ,这就是为什么在ACTION_UP调用时只有空变量,而您将空变量放入drawingList

为了克服这种情况,只需在onTouchEvent外部初始化变量

像这样。

  Path path;
  Paint paint;

@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            drawCanvas = surfaceHolder.lockCanvas();
            path = new Path();
            paint = new Paint();
            paint.setColor(paintColor);
            paint.setAntiAlias(true);
            paint.setStrokeWidth(20);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeCap(Paint.Cap.ROUND);
            paint.setStrokeWidth(brushSize);
            path.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            path.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawingList.add(new Drawing(path, paint));
            for(Drawing drawing : drawingList) {
                if(drawing.getPath() != null) {
                    drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
                }
            }
            surfaceHolder.unlockCanvasAndPost(drawCanvas);
            break;
        default:
            return false;
    }
    invalidate();
    return true;
}

drawCanvas.drawPath(drawing.getPath(),drawing.getPaint())

而不是使用drawing.getPath()使用drawing.get(position).getPath(),并且对于drawing.get(position).getPaint()相同

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM