Android 更改直线绘制线的颜色

Android 更改直线绘制线的颜色,android,android-custom-view,lines,Android,Android Custom View,Lines,我正在用这个应用程序在android中画免费线 DroperView.java public class DrawerView extends View { public static Paint paint; Paint paint2 = new Paint(); public Path path = new Path(); public Path circlePath = new Path(); public static int lineCol = Color.BLUE; publ

我正在用这个应用程序在android中画免费线

DroperView.java

public class DrawerView extends View {

public static  Paint paint;
Paint paint2 = new Paint();
public Path path = new Path();
public Path circlePath = new Path();

public static int lineCol = Color.BLUE;

public static boolean isTouchable = false;

public LayoutParams params;


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

    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(lineCol);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(4f);

}


public void onButtonPress(){
    // resets the screen
    path.reset();

    // Calls the onDraw() method
    postInvalidate();
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawPath(path, paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (!isTouchable){ 
        return false;
    } else {

    // Gives you x and y coordinates on the Event.
    float pointX = event.getX();
    float pointY = event.getY();

    // Checks for the event that occurs
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        path.moveTo(pointX, pointY);

        return true;
    case MotionEvent.ACTION_MOVE:
        path.lineTo(pointX, pointY);
        circlePath.reset();

        circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
        break;

    case MotionEvent.ACTION_UP:
        circlePath.reset();

        break;
    default:
        return false;
    }

    postInvalidate();
    return true;
    }
  }
}
    public class DrawerView extends View {

public Path circlePath = new Path();

public static int LINE_COLOR = 0;

public static boolean isTouchable = false;


public List<ColoredPath> paths = new ArrayList<ColoredPath>();

public ColoredPath currentPath;

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

    currentPath = new ColoredPath();
    paths.add(currentPath);


}   

public void newLine(int color){
    System.out.println("in newLine method");
    currentPath = new ColoredPath(color);
    paths.add(currentPath);
    //postInvalidate();
}

public void onButtonPress(){
    // resets the screen
    currentPath.getPath().reset();

    // Calls the onDraw() method
    postInvalidate();
}

@Override
protected void onDraw(Canvas canvas) {

    System.out.println("size of paths: "+paths.size());

    canvas.drawPath(currentPath.getPath(), currentPath.getPaint());
    for(int i = 0; i < paths.size(); ++i) {
          //ColoredPath coloredPath = paths.get(i);
          canvas.drawPath(currentPath.getPath(), currentPath.getPaint());
        }
}


  public Path getLastPath() {
    Path path = new Path();
    for(int i = 0; i < paths.size(); ++i) {
      path.addPath(paths.get(i).getPath());
    }
    return path;
  }

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (!isTouchable){ 
        return false;
    } else {

    // Gives you x and y coordinates on the Event.
    float pointX = event.getX();
    float pointY = event.getY();

    // Checks for the event that occurs
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        currentPath.getPath().moveTo(pointX, pointY);
        //getLastPath().moveTo(pointX, pointY);

        return true;
    case MotionEvent.ACTION_MOVE:
        currentPath.getPath().lineTo(pointX, pointY);
        //getLastPath().lineTo(pointX, pointY);
        circlePath.reset();

        circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
        break;

    case MotionEvent.ACTION_UP:
        circlePath.reset();

        break;
    default:
        return false;
    }

    postInvalidate();
    return true;
    }
}
   }
DrawLines.java

public class DrawLines extends Activity {

DrawerView myView;
public Button btnReset;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.draw_line);

    myView = (DrawerView)findViewById(R.id.custView);

    btnReset = (Button) findViewById(R.id.button1);

    btnReset.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub

            // resets the screen
            myView.path.reset();

            // Calls the onDraw() method
            myView.postInvalidate();

        }
    });
}

}
draw_line.xml

<Button
    android:id="@+id/button1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Clear" />

<com.example.drawline.DrawerView
    android:id="@+id/custView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/button1"
    android:layout_margin="5dp"
    custom:lineColor="#ff0099" />

DroperView.java

public class DrawerView extends View {

public static  Paint paint;
Paint paint2 = new Paint();
public Path path = new Path();
public Path circlePath = new Path();

public static int lineCol = Color.BLUE;

public static boolean isTouchable = false;

public LayoutParams params;


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

    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setColor(lineCol);
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeWidth(4f);

}


public void onButtonPress(){
    // resets the screen
    path.reset();

    // Calls the onDraw() method
    postInvalidate();
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawPath(path, paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (!isTouchable){ 
        return false;
    } else {

    // Gives you x and y coordinates on the Event.
    float pointX = event.getX();
    float pointY = event.getY();

    // Checks for the event that occurs
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        path.moveTo(pointX, pointY);

        return true;
    case MotionEvent.ACTION_MOVE:
        path.lineTo(pointX, pointY);
        circlePath.reset();

        circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
        break;

    case MotionEvent.ACTION_UP:
        circlePath.reset();

        break;
    default:
        return false;
    }

    postInvalidate();
    return true;
    }
  }
}
    public class DrawerView extends View {

public Path circlePath = new Path();

public static int LINE_COLOR = 0;

public static boolean isTouchable = false;


public List<ColoredPath> paths = new ArrayList<ColoredPath>();

public ColoredPath currentPath;

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

    currentPath = new ColoredPath();
    paths.add(currentPath);


}   

public void newLine(int color){
    System.out.println("in newLine method");
    currentPath = new ColoredPath(color);
    paths.add(currentPath);
    //postInvalidate();
}

public void onButtonPress(){
    // resets the screen
    currentPath.getPath().reset();

    // Calls the onDraw() method
    postInvalidate();
}

@Override
protected void onDraw(Canvas canvas) {

    System.out.println("size of paths: "+paths.size());

    canvas.drawPath(currentPath.getPath(), currentPath.getPaint());
    for(int i = 0; i < paths.size(); ++i) {
          //ColoredPath coloredPath = paths.get(i);
          canvas.drawPath(currentPath.getPath(), currentPath.getPaint());
        }
}


  public Path getLastPath() {
    Path path = new Path();
    for(int i = 0; i < paths.size(); ++i) {
      path.addPath(paths.get(i).getPath());
    }
    return path;
  }

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (!isTouchable){ 
        return false;
    } else {

    // Gives you x and y coordinates on the Event.
    float pointX = event.getX();
    float pointY = event.getY();

    // Checks for the event that occurs
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        currentPath.getPath().moveTo(pointX, pointY);
        //getLastPath().moveTo(pointX, pointY);

        return true;
    case MotionEvent.ACTION_MOVE:
        currentPath.getPath().lineTo(pointX, pointY);
        //getLastPath().lineTo(pointX, pointY);
        circlePath.reset();

        circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW);
        break;

    case MotionEvent.ACTION_UP:
        circlePath.reset();

        break;
    default:
        return false;
    }

    postInvalidate();
    return true;
    }
}
   }

这可以很好地为线条着色,但当我选择任何颜色时,它会导致删除最后一行,我希望所有线条都有这些颜色

由于路径本身不包含任何有关其颜色的信息(颜色由画布管理),我建议您使用不同的绘制为每个新路径创建一对(路径,绘制),并在onTouch事件中仅使用当前对。下面是一些代码来说明这个想法

public class ColoredPath {

    private Paint paint;
    private Path path;

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

    public Paint getPaint() {
        return paint;
    }

    public Path getPath() {
        return path;
    }
}

private List<ColoredPath> paths = new ArrayList<ColoredPath>();

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

    //custom paint can be used here
    paths.add(new ColoredPath(new Paint(), new Path()));
}

/////
@Override
protected void onDraw(Canvas canvas) {
    for(ColoredPath coloredPath : paths) {
        canvas.drawPath(coloredPath.getPath(), coloredPath.getPaint());
    }
}
公共类ColoredPath{
私人油漆;
专用路径;
公共彩色路径(绘制、路径){
这个。油漆=油漆;
this.path=path;
}
公共油漆{
返漆;
}
公共路径getPath(){
返回路径;
}
}
私有列表路径=新的ArrayList();
公共抽屉视图(上下文、属性集属性){
超级(上下文,attrs);
//这里可以使用定制油漆
add(新着色路径(new Paint(),new Path());
}
/////
@凌驾
受保护的void onDraw(画布){
for(彩色路径彩色路径:路径){
drawPath(coloredPath.getPath(),coloredPath.getPaint());
}
}

其中路径为
列表
。您还需要像
ColoredPath currentPath

这样的字段谢谢您的回答,我在我的DrawerView.java中添加了您的代码,在onDraw中,它要求我在添加列表路径时初始化路径;在for循环之前。如何初始化它?请编写完整的建议代码,因为我是android新手;但它对我不起作用。希望你尽快回答我。到底什么不起作用?您是否在开始时和每种新颜色上添加
ColoredPath
?我想让您演示如何准确初始化路径和ColoredPath。但是路径。添加(new Paint(),new Path());由于add函数的参数是int和ColoredPath对象,因此我无法修复。
public class ColoredPath {

    private Paint paint;
    private Path path;

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

    public Paint getPaint() {
        return paint;
    }

    public Path getPath() {
        return path;
    }
}

private List<ColoredPath> paths = new ArrayList<ColoredPath>();

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

    //custom paint can be used here
    paths.add(new ColoredPath(new Paint(), new Path()));
}

/////
@Override
protected void onDraw(Canvas canvas) {
    for(ColoredPath coloredPath : paths) {
        canvas.drawPath(coloredPath.getPath(), coloredPath.getPaint());
    }
}