2014-02-08 128 views
0

在我的Draw Activity类中,当选择了微调器中的项目时,画笔大小会发生变化。但是它也改变了先前绘制的路径的大小。我试图为微调器的每个选择创建一个新的绘画对象,但仍然无法工作。这里tv是具有draw方法的eventTouchView类的一个实例。不知道什么是错的: 在我的抽奖活动类:Android画布/ Paint - 更改Android画布笔刷的刷子尺寸

 @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, 
      long arg3) { 
     // TODO Auto-generated method stub 
     tv.paint= new Paint(); 
     tv.paint.setStyle(Paint.Style.STROKE); 
     tv.paint.setStrokeJoin(Paint.Join.ROUND); 

     if (arg0.getSelectedItem().equals("10f")){ 

      tv.paint.setStrokeWidth(10f); 

     } 
     else if (arg0.getSelectedItem().equals("20f")){ 

      tv.paint.setStrokeWidth(20f); 
     } 
     else if (arg0.getSelectedItem().equals("40f")){ 

      tv.paint.setStrokeWidth(40f); 
     } 
     else if (arg0.getSelectedItem().equals("50f")){ 

      tv.paint.setStrokeWidth(50f); 
     } 
     else { 

      tv.paint.setStrokeWidth(30f); 
     } 
    } 

在我ViewTouchEvent类:

public class ViewTouchEvent extends View{ 

    Paint paint; 
    Path path = new Path(); 

    protected void onDraw(Canvas canvas){ 
     pathToGrayscale(); 
     canvas.drawColor(Color.WHITE); 
     canvas.drawBitmap(grayscaleBmp, 0, 100, null); 
     canvas.drawPath(path, paint); 
     canvas.drawPath(cursor, cursorPaint); 

    } 

------------------ --------------

新版本:我想下面的步骤,但不知道什么是错用下面的代码 -

@SuppressLint("DrawAllocation") 
protected void onDraw(Canvas canvas){ 

    pathToGrayscale(); 
    canvas.drawColor(Color.WHITE); 
    canvas.drawBitmap(grayscaleBmp, 0, 100, null); 
    for (int i =0; i < drawings.size(); i++){ 
     canvas.drawPath(drawings.get(i).getPath(), drawings.get(0).getPaint()); 

    } 
    //canvas.drawPath(path, paint); 
    canvas.drawPath(cursor, cursorPaint); 

} 

public boolean onTouchEvent(MotionEvent event){ 

    float Xpos = event.getX(); 
    float Ypos = event.getY(); 
    //drawings = new Vector<Drawing>(); 
    if (selection == 10){ 
     Drawing draw1 = new Drawing(); 
     draw1.getPaint().setStrokeWidth(10f); 
     draw1.getPaint().setStyle(Paint.Style.STROKE); 
     draw1.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw1); 
    } 
    else if (selection == 20){ 
     Drawing draw2 = new Drawing(); 
     draw2.getPaint().setStrokeWidth(20f); 
     draw2.getPaint().setStyle(Paint.Style.STROKE); 
     draw2.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw2); 

    } 
    else if (selection == 30){ 
     Drawing draw3 = new Drawing(); 
     draw3.getPaint().setStrokeWidth(30f); 
     draw3.getPaint().setStyle(Paint.Style.STROKE); 
     draw3.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw3); 

    } 
    else if (selection == 40){ 
     Drawing draw4 = new Drawing(); 
     draw4.getPaint().setStrokeWidth(40f); 
     draw4.getPaint().setStyle(Paint.Style.STROKE); 
     draw4.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw4); 

    } 
    else if (selection == 50){ 
     Drawing draw5 = new Drawing(); 
     draw5.getPaint().setStrokeWidth(50f); 
     draw5.getPaint().setStyle(Paint.Style.STROKE); 
     draw5.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw5); 

    } 
    else{ 
     Drawing draw6 = new Drawing(); 
     draw6.getPaint().setStrokeWidth(70f); 
     draw6.getPaint().setStyle(Paint.Style.STROKE); 
     draw6.getPaint().setStrokeJoin(Paint.Join.ROUND); 
     drawings.add(draw6); 

    } 


    //ArrayList <Pair<Float, Float>> pathPixels = new ArrayList <Pair<Float, Float>>(); 
    switch(event.getAction()){ 
    case MotionEvent.ACTION_DOWN: 
     drawings.get(drawings.size()-1).getPath().moveTo(Xpos, Ypos); 
     xPathPixels.add(Xpos); 
     yPathPixels.add(Ypos); 
     //int grayPixel = grayBmp.getPixel(Math.round(Xpos), Math.round(Ypos)); 
     //resizedBmp.setPixel(Math.round(event.getX()), Math.round(event.getY()), grayPixel); 
     return true; 


    case MotionEvent.ACTION_MOVE: 
     drawings.get(drawings.size()-1).getPath().lineTo(Xpos, Ypos); 
     xPathPixels.add(Xpos); 
     yPathPixels.add(Ypos); 
     //pathToGrayscale(); 

     //int grayPixel2 = grayBmp.getPixel(Math.round(Xpos), Math.round(Ypos)); 
     //resizedBmp.setPixel(Math.round(event.getX()), Math.round(event.getY()), grayPixel2); 
     cursor.reset(); 

     cursor.addCircle(Xpos, Ypos, 30, Path.Direction.CW); 

     break; 

    case MotionEvent.ACTION_UP: 
     //pathToGrayscale(); 
     System.out.println("xPath : " + xPathPixels + " " + "yPath : " + yPathPixels); 
     cursor.reset(); 

     break; 

    default: 
     return false; 

    } 

    invalidate(); 

    return true; 

} 
+0

按照sdk中的fingerpaint示例 – Raghunandan

+0

谢谢! youtube中的fingerpaint示例? – user37375

+0

下的android-sdk/samples – Raghunandan

回答

0

呦ü将需要做出一些改变 -

(1)在项目中创建一个模型类,可以说,它“绘图”具有涂漆和道路情况下包裹

class Drawing { 
     Paint paint; 
     Path path; 
     //Getter & Setter 
    } 

(2)创建的列表在ViewTouchEvent类中输入Drawing。

Vector<Drawing> drawings = new Vector<Drawing>(); 

(3.)捕获onTouchEvent()并使用其相应的Path和Paint实例创建Drawing对象。 (4.)这里每张图都有自己的油漆属性,并不常见。

(5.)现在,将此绘图实例添加到drawingList。

(6.)调用invalidate(),这将立即调用onDraw。 (7.)在这里,您应该遍历列表并为每个绘图实例调用getPath()和getPaint(),您可以绘制所有绘图及其特定的绘画和路径对象。

注意:您将不得不维护一个当前绘图,以便绘制当前路径的可视化。

+0

感谢您的详细回复!我试图做到上述,但由于某种原因仍然无法正常工作。我不确定我是否明白为什么要遍历onDraw方法()中的图纸列表?因为每次我们创建一个绘图,它都会直接进入onDraw方法。因此,如果我们在绘图矢量上调用onDraw方法,那么它会重复一些以前绘制的路径? – user37375

+0

此外,我已经根据上述步骤在新版本的行中添加了我的新修订代码.. – user37375

+0

非常感谢您的详细回复!我有我的代码工作! :D – user37375