Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在不每次删除旧线条的情况下绘制线条?_Android_Arraylist_Line_Ondraw_Ontouch - Fatal编程技术网

Android 如何在不每次删除旧线条的情况下绘制线条?

Android 如何在不每次删除旧线条的情况下绘制线条?,android,arraylist,line,ondraw,ontouch,Android,Arraylist,Line,Ondraw,Ontouch,我正在编写一个代码,应该可以生成行。您可以在两个不同的位置触摸屏幕,程序获取x/y值并绘制一条线。那很好! 我要程序现在保存行。因此,您可以多次触摸屏幕,程序从第一次触摸到第二次触摸,从第三次触摸到第四次触摸,依此类推,并显示所有触摸。 我试着用arraylist做这件事,但还是不起作用。 下面是代码,它画出了线,但没有对它们进行sve 所以代码现在可以工作了!我用小径做的,效果很好! 谢谢你的帮助 有两种方法可以做到这一点 1存储每条线路的位置,并在每次onDraw调用中重新绘制每条线路 2使

我正在编写一个代码,应该可以生成行。您可以在两个不同的位置触摸屏幕,程序获取x/y值并绘制一条线。那很好! 我要程序现在保存行。因此,您可以多次触摸屏幕,程序从第一次触摸到第二次触摸,从第三次触摸到第四次触摸,依此类推,并显示所有触摸。 我试着用arraylist做这件事,但还是不起作用。 下面是代码,它画出了线,但没有对它们进行sve

所以代码现在可以工作了!我用小径做的,效果很好! 谢谢你的帮助


有两种方法可以做到这一点

1存储每条线路的位置,并在每次onDraw调用中重新绘制每条线路

2使用位图。每次创建新线时,直接将线绘制到位图。然后你的onDraw函数只是将这个位图绘制到屏幕上


方法2使用更多内存,但性能更好。方法1不能扩展到数百行,但占用的内存要少得多。

Thx!到1如何存储线?存储两个端点。因此,您将有一个包含4个值的内部类行xstart、ystart、xend、yend,并有一个这些结构的ArrayList。在onDraw中,您将遍历列表并绘制每一行。所以我再次来到这里,我存储了这些点,但是我在迭代中遇到了问题,您能给我这个程序需要的具体代码吗?在我的程序中,线是从每个点到另一个点…你也可以使用路径。我猜这在内存中比较便宜,而且比遍历一系列行要快得多。@Niek Haarman,我不知道如何使用Path,你有没有一个例子,或者你能给我解释一下吗?
package com.example.linienmachen;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class Touchclass extends View {
private Paint paint = new Paint();
private Path path = new Path();
int count = 1;

public Touchclass(Context context, AttributeSet attrs) {
super(context, attrs);

paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);

}



@Override
protected void onDraw(Canvas canvas) {

if ((count%2 != 0)){
canvas.drawPath(path, paint);}
}

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

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:

    count++;

    if(count%2 != 1){
    path.moveTo(eventX, eventY);
  return true;
    }
    if(count%2 != 0){
    path.lineTo(eventX, eventY);
    break;
    }
case MotionEvent.ACTION_MOVE:

  break;
case MotionEvent.ACTION_UP:
  // nothing to do
  break;
default:
  return false;
}

// Schedules a repaint.
invalidate();
return true;
}
}