2013-07-20 5 views
0

Я использую это приложение, чтобы привлечь свободные линии в андроидаИзменение цвета линии Рисование линии андроида

DrawerView.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; 
    } 
    } 
} 

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" /> 

Он хорошо работает со мной, но я хочу, чтобы иметь возможность выбрать цвет линии, так что я добавил кнопку в draw_line.xml, что при нажатии она показывает диалоговое окно, которое предлагает пользователю выбрать цвет. это код диалога

public void openSelectColorDialog() 
{ 
    final Dialog d = new Dialog(this); 
    d.setTitle("Select Color"); 
    d.setContentView(R.layout.military_list); 

    int image[] = { R.drawable.black, R.drawable.blue, R.drawable.yellow}; 

    ArrayList<HashMap<String, String>> objArayList = new ArrayList<HashMap<String, String>>(); 

    for (int i = 0; i < image.length; i++) { 
     HashMap<String, String> listData = new HashMap<String, String>(); 
     listData.put("image", Integer.toString(image[i])); 

     objArayList.add(listData); 

    } 

    String[] from = { "image"}; 
    int[] to = { R.id.list_image }; 

    SimpleAdapter listAdapter = new SimpleAdapter(this, objArayList, 
      R.layout.military_list_item, from, to); 
    ListView lst1 = (ListView) d.findViewById(android.R.id.list); 

    lst1.setAdapter(listAdapter); 

    lst1.setOnItemClickListener(new OnItemClickListener() { 

     public void onItemClick(AdapterView<?> parentView, View childView, int position, long id) { 

      if (position == 0) { 
       // the code of color line 

       d.dismiss(); 

      } else if (position == 1) { 
       // the code of blue line 

       d.dismiss(); 

      } else { 
       // the code of yellow line 
       d.dismiss(); 

      } 

      myView.postInvalidate(); 

     } 
    }); 

    d.show(); 

} 

Каков код, который я должен добавить, чтобы сделать цвет таким, как я выбрал?

рассмотрите, напишу ли я этот код DrawerView.paint.setColor (Color.BLACK); вся строка меняет свой цвет на выбранный цвет, и это не то, что я хочу. Я хочу, чтобы цвет новой строки был похож на то, что я выбрал, и сохранил старые строки с его цветами.

Надеюсь, что кто-то получил мое значение.

Заранее спасибо.

Редактировать

новый код: ColoredPath.java

public class ColoredPath { 

private Paint paint; 
private Path path = new Path(); 
private int color; 

public ColoredPath() { 
    paint = new Paint(); 
    color = Color.BLACK; 

    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setStrokeWidth(4f); 
    paint.setAntiAlias(true); 
    paint.setColor(color); 
} 

public ColoredPath(int color) { 
    paint = new Paint(); 

    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeJoin(Paint.Join.ROUND); 
    paint.setStrokeWidth(4f); 
    paint.setAntiAlias(true); 
    paint.setColor(color); 
} 

public void setColor(int color){ 
    this.color = color; 
} 

public int getColor(){ 
    return color; 
} 


public void setPaint(Paint paint){ 
    this.paint = paint; 
} 

public Paint getPaint() { 
    return paint; 
} 

public void setPath(Path path){ 
    this.path = path; 
} 

public Path getPath() { 
    return path; 
} 
} 

DrawerView.java

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; 
    } 
} 
    } 

и MainActivity.java

if (position == 1) { 
    // blue 
myView.newLine(Color.BLUE); 
d.dismiss(); 
} 

это хорошо работает и окрашивает линии, но когда я выбираю любой цвет, он приводит к удалению последней строки, и я хочу, чтобы все линии были там.

ответ

1

Поскольку сам Путь не содержит информации о его цвете (цвет управляется Canvas), я предлагаю вам создать новую пару (Path, Paint) для каждого нового пути с различной краской и использовать только текущую пару в 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()); 
    } 
} 

Где пути является List<ColoredPath>. А также вам нужна поле, как ColoredPath currentPath.

+0

Спасибо за ваш ответ, я добавил ваш код в свой DrawerView.java и в onDraw он просит меня инициализировать пути, поскольку я добавил список путей; перед циклом for. Как его инициализировать? напишите полный предлагаемый код, потому что я новичок в android. – Eman87

+0

Я написал Список paths = new ArrayList (); но это не работает со мной. Надеюсь, ты ответишь мне как можно скорее. – Eman87

+0

Что именно не работает? Вы добавляете «ColoredPath» при запуске и каждом новом цвете? – Desert

Смежные вопросы