有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇改变油漆的颜色会改变所有的颜色

因此,我试图制作一个adroid应用程序,在touchevent发生时绘制一系列圆圈。如果我在屏幕的左边画,它应该画一个绿色的圆圈,如果它在右边,它应该画一个蓝色的圆圈。应用程序正在这样做,但它会更改所有已绘制圆的颜色。因此,我制作了一个Draw circle类和一个对象数组列表,将每个cricle视为一个单独的对象,即使在一次润色活动之后仍然无法工作。下面给出了它的代码

 private class Drawcirlce  {

        public Drawcirlce(Canvas c) {
        // TODO Auto-generated constructor stub


        for (Point point : points) {

             if(flag==true)
                    c.drawCircle(point.x, point.y, 5, paint);
                    else
                    c.drawCircle(point.x, point.y, 5, p2);
        }
    invalidate();
    }
    /*for (Point point : points) {
     if(flag==true)
        mcan.drawCircle(point.x, point.y, 5, paint);
        else
        mcan.drawCircle(point.x, point.y, 5, p2);
}*/

}


public void onDraw(Canvas canvas) {


    i++;
     //Drawcirlce d=new Drawcirlce();
dc.add(new Drawcirlce(canvas));

Log.d(TAG, "i: " + i);invalidate();
}
public boolean onTouch(View view, MotionEvent event) {
    // if(event.getAction() != MotionEvent.ACTION_DOWN)
    // return super.onTouchEvent(event);
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    if(point.x>200){
        paint.setColor(Color.BLUE);
    flag=true;
    }
    else{
        p2.setColor(Color.GREEN);
    flag=false;
    }

    points.add(point);
    //dc.add(new Drawcirlce(mcan));

    invalidate();
    Log.d(TAG, "point: " + point);
    return true;
}

public boolean onTouch(View view, MotionEvent event) {
    // if(event.getAction() != MotionEvent.ACTION_DOWN)
    // return super.onTouchEvent(event);
    Point point = new Point();
    point.x = event.getX();
    point.y = event.getY();
    if(point.x>200){
        paint.setColor(Color.BLUE);
    flag=true;
    }
    else{
        p2.setColor(Color.GREEN);
    flag=false;
    }

    points.add(point);
    //dc.add(new Drawcirlce(mcan));

    invalidate();
    Log.d(TAG, "point: " + point);
    return true;
}

有人知道我做错了吗,或者有没有办法解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    你的Drawcirlce类需要有一个Paint对象。(您可以将其公开给类,或者将其getPaint()setPaint(),以两者为准。)然后,当调用c.drawCircle(point.x, point.y, 5, paint);时,用类中的Paint对象调用它

    比如:

    private class Drawcirlce {
        public Paint myPaint;
    
        public void draw(Canvas c) { // Don't use a constructor here...
            if (myPaint == null)
                return;
    
            for (Point point : points) {
                c.drawCircle(point.x, point.y, 5, myPaint);
                invalidate();
            }
        }
    }
    

    然后,在onTouch事件中,您可以这样做:

    Drawcirlce myCircle = new Drawcirlce();
    if (flag == true)
        myCircle.myPaint = new Paint(paint); // Copies the current paint object.
    else
        myCircle.myPaint = new Paint(p2); // Copies the current p2 object.
    dc.add(); // Adds our circle with its own Paint object.
    

    最后,您必须更改onDraw事件

    for (Drawcirlce d : dc) { // Loop through everything in the dc array.
        d.draw(canvas); // Draw it to this canvas!
    }
    

    这段代码实际上赋予了一个圆拥有自己的Paint对象的能力。然后,当触摸时,你创建一个Paint来给予它。最后,在绘图时,使用该Paint而不是当前的