Android canvas / Paint - 更改Android画布刷的画笔大小

时间:2014-02-08 18:03:01

标签: android canvas paint

在我的“绘制活动”类中,当选择了微调器中的项目时,我的画笔大小会发生变化。但是它也会改变先前绘制的路径的大小。我试图为微调器中的每个选择创建一个新的绘制对象,但仍然不起作用。这里tv是eventTouchView类的一个实例,它有draw方法。不确定是什么问题: 在我的Draw Activity类中:

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

}

1 个答案:

答案 0 :(得分:0)

您需要进行一些更改 -

(1。)在项目中创建一个模型类,让它说“绘图”包含Paint和Path实例

    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()     您可以使用特定的绘画和路径对象绘制所有绘图。

注意:您还必须维护一个当前图形,以便可视化当前绘制的路径。

相关问题