更改路径颜色而不更改以前的路径

时间:2014-08-06 13:29:14

标签: android list colors path ondraw

我使用canvas.drawPath命令直线。但现在我希望颜色可以选择。所以你点击一个按钮然后,路径就是这种颜色,但是之前的路径保留在它们的颜色中。带按钮的细线稍后出现,此时颜色是随机的......

我做到了,我从这里改变了代码! Change path color without changing previous paths

主要活动

package com.example.drawproject;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DrawArea da = new DrawArea(this);
    setContentView(da);
}
}

绘制活动

 import android.content.Context;
 import android.graphics.*;
 import android.util.SparseArray;
 import android.view.MotionEvent;
 import android.view.View;

 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;

public class DrawArea extends View {

private List<Stroke> _allStrokes; //all strokes that need to be drawn
private SparseArray<Stroke> _activeStrokes; //use to retrieve the currently drawn     strokes
private Random _rdmColor = new Random();


int count = 1;
public DrawArea(Context context) {
    super(context);
    _allStrokes = new ArrayList<Stroke>();
    _activeStrokes = new SparseArray<Stroke>();
    setFocusable(true);
    setFocusableInTouchMode(true);

}

public void onDraw(Canvas canvas) {
    if (_allStrokes != null) {
        for (Stroke stroke: _allStrokes) {
            if (stroke != null) {
                Path path = stroke.getPath();
                Paint painter = stroke.getPaint();
                if ((path != null) && (painter != null)) {
                    if(count%2 != 0){
                    canvas.drawPath(path, painter);
                    }
                }
            }
        }
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    final int action = event.getActionMasked();
    final int pointerCount = event.getPointerCount();

    switch (action) {
        case MotionEvent.ACTION_DOWN: {
            count++;
            if(count%2 != 1)
            {pointDown((int)event.getX(), (int)event.getY(), event.getPointerId(0));
            break;
            }
            if (count%2 != 0){
                for (int pc = 0; pc < pointerCount; pc++) {
                    pointDown((int)event.getX(pc), (int)event.getY(pc), event.getPointerId(pc));
        }
            }
        }
        case MotionEvent.ACTION_MOVE: {

            break;
        }

        case MotionEvent.ACTION_UP: {
            break;
        }

    }
    invalidate();
    return true;
}

private void pointDown(int x, int y, int id) {

    if(count%2 !=1){
    //create a paint with random color
    Paint paint = new Paint();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(10);
    paint.setColor(_rdmColor.nextInt());

    //create the Stroke
    Point pt = new Point(x, y);
    Stroke stroke = new Stroke(paint);
    stroke.addPoint(pt);
    _activeStrokes.put(id, stroke);
    _allStrokes.add(stroke);
    }

    if (count%2 != 0){
    //retrieve the stroke and add new point to its path
    Stroke stroke = _activeStrokes.get(id);
    if (stroke != null) {
        Point pt = new Point(x, y);
        stroke.addPoint(pt);
    }
    }
}
}

package com.example.drawproject;

import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;

public class Stroke {
private Path _path;
private Paint _paint;

public Stroke (Paint paint) {
    _paint = paint;
}

public Path getPath() {
    return _path;
}

public Paint getPaint() {
    return _paint;
}

public void addPoint(Point pt) {
    if (_path == null) {
        _path = new Path();
        _path.moveTo(pt.x, pt.y);
    } else {
        _path.lineTo(pt.x, pt.y);
    }
 }
}

1 个答案:

答案 0 :(得分:0)

对于每个路径,声明单独的绘制对象并更改要更改的路径的绘制对象。

    canvas.drawPath(path1, paint1);
    canvas.drawPath(path2, paint2);
    canvas.drawPath(path3, paint3);
    canvas.drawPath(path4, paint4);

主要观点:

public class temp extends View {

  private Map<Path,Paint> MyMap = new HashMap<Path,Paint>();


public ViewFeld(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub

    init();

  }

private void init() {

    for (int i = 0; i < number of pathes ; i++) {
        Path path = new Path();
        paint = new Paint();
        paint.setColor(Color.MAGENTA);
        paint.setStrokeWidth(2);
        paint.setStyle(Paint.Style.FILL);

        MyMap.put(path, paint);

    }
}

protected void onDraw(Canvas canvas) {


    for (Path p  : MyMap.keySet()) {
        canvas.drawPath(p, MyMap.get(p));
    }

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

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


        Paint p = MyMap.get(path you want to change the color);
        // change the color of p

    case MotionEvent.ACTION_MOVE:

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

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