Java 使用onDraw android在视图中绘制多个对象

Java 使用onDraw android在视图中绘制多个对象,java,android,canvas,Java,Android,Canvas,我不是在任何项目上工作,只是想学习如何使用view onDraw方法创建简单的动画。所以我开始在自定义视图上绘制多个对象,但我的程序只绘制了两个颜色错误的已定义对象 这是我的简单对象类,名为Square,它扩展了抽象类AbstractObject,后者定义了Square对象的属性和方法 package com.kgkg.animationlearn.myDrawings; import android.graphics.Canvas; import android.g

我不是在任何项目上工作,只是想学习如何使用view onDraw方法创建简单的动画。所以我开始在自定义视图上绘制多个对象,但我的程序只绘制了两个颜色错误的已定义对象

这是我的简单对象类,名为Square,它扩展了抽象类AbstractObject,后者定义了Square对象的属性和方法



    package com.kgkg.animationlearn.myDrawings;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.util.Log;
    import com.kgkg.animationlearn.MainActivity;
    /**
     * Created by Krzysiek on 2016-03-11.
     */
    public class Square extends AbstractShape {
        //****************************************************FIELDS*******************
        private int side;

        //**************************************************CONSTRUCTORS*******************************
        private Square() {}

        public Square(int side) {
            super();
            this.side = side;
        }

        public Square(Paint fillColor, int side) {
            super(fillColor);
            this.side = side;
        }

        public Square(Paint fillColor, int x, int y, int side) {
            super(fillColor, x, y);
            this.side = side;
        }

        public Square(int x, int y, int side) {
            super(x, y);
            this.side = side;
        }

        //************************************************GETTERS AND SETTERS**************************
        public int getSide() {
            return side;
        }

        public void setSide(int side) {
            this.side = side;
        }

        //****************************************************METHODS**********************************

        /**
         * side, canvas and paint fields cannot be null otherwise they will use defaults
         * @param canvas
         */
        @Override
        public void drawOnCanvas(Canvas canvas) {
            if (side > 0 && canvas != null){
                canvas.drawRect(getX(), getY(), side, side, getFillColor());
            } else {
                Log.i(MainActivity.TAG, "Somthing is wrong with your object");
            }
        }

        @Override
        public String toString() {
            return "Square object \n Properties: \n side: " + side + "\n fillColor: " + getFillColor() +
                    "\nPosition ( " + getX() + ", " + getY() + ")";
        }
    }

抽象对象类



    public abstract class AbstractShape implements IDrawOnCanvas{

        //****************************************************FIELDS***********************************
        private Paint fillColor = new Paint(Color.DKGRAY);
        private int x, y;

        //**************************************************CONSTRUCTORS*******************************
        public AbstractShape() {}

        public AbstractShape(Paint fillColor) {
            this.fillColor = fillColor;
        }

        public AbstractShape(Paint fillColor, int x, int y) {
            this.fillColor = fillColor;
            this.x = x;
            this.y = y;
        }
        public AbstractShape(int x, int y) {
            this.x = x;
            this.y = y;
        }

        //************************************************GETTERS AND SETTERS**************************
        public Paint getFillColor() {
            return fillColor;
        }

        public void setFillColor(Paint fillColor) {
            this.fillColor = fillColor;
        }

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public void setPosition(int x, int y){
            this.x = x;
            this.y = y;
        }

        //****************************************************METHODS**********************************

    }

在button的onclick方法之后,它应该在myView上创建四个红色、青色和黑色的正方形,但是它只创建两个黑色的正方形,我的问题是:问题是什么?为什么只绘制两个对象,为什么它们没有正确的颜色


提前感谢您

不要在OnDraw函数的for循环内无效。此外,我认为save和restore调用没有任何用处。 改变这个

@覆盖
受保护的void onDraw(画布){
如果(toDraw){
for(int i=0;i
对此

@覆盖
受保护的void onDraw(画布){
如果(toDraw){
for(int i=0;i
不要在OnDraw函数的for循环内无效。此外,我认为save和restore调用没有任何用处。 改变这个

@覆盖
受保护的void onDraw(画布){
如果(toDraw){
for(int i=0;i
对此

@覆盖
受保护的void onDraw(画布){
如果(toDraw){
for(int i=0;i
我从onDraw方法中删除了保存和还原调用,但仍然具有相同的效果。您是否也删除了invalidate?是的,在从onclick方法中删除invalidate后,什么都没有绘制。不从onclick中删除invalidate,从onDraw中删除invalidate当然在onDraw中无效,但仍然没有效果,我的onDraw方法现在看起来与上面所示完全一样,但我仍在继续:)我从onDraw方法中删除了保存和还原调用,但仍然具有相同的效果。您是否也删除了invalidate?是的,在从onclick方法中删除invalidate后,没有绘制任何内容不从onclick中删除invalidate,从onDraw中删除invalidate我的坏方法当然是在onDraw中ivalidate,但仍然没有效果,我的onDraw方法现在看起来与上面的完全一样,但我仍然继续:)
Interface IDrawOnCanvas
<pre><code>
package com.kgkg.animationlearn.myDrawings;
import android.graphics.Canvas;
public interface IDrawOnCanvas {
    void drawOnCanvas(Canvas canvas);
}
View class
<pre><code>
public class myView extends View {

    private boolean toDraw;
    private Square[] objects;

    public myView(Context context) {
        super(context);
        init();
    }

    public myView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init(){
        toDraw = false;
    }

    public boolean isToDraw() {
        return toDraw;
    }

    public void setToDraw(boolean toDraw) {
        this.toDraw = toDraw;
    }

    public Square[] getObjects() {
        return objects;
    }

    public void setObjects(Square[] objects) {
        this.objects = objects;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        if (toDraw){
            for (int i = 0; i < objects.length; i++){
                canvas.save();
                Log.i(MainActivity.TAG, "rysownaie + " + objects[i].toString());
                objects[i].drawOnCanvas(canvas);
                canvas.restore();
                invalidate();
            }
        }
        super.onDraw(canvas);
    }


}
MainActivity
<pre><code>
public class MainActivity extends AppCompatActivity {

    public final static String TAG = "kgkg";

    RelativeLayout relLayout;
    Button btnTest;
    View myV;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        relLayout = (RelativeLayout) findViewById(R.id.relLayout);
        btnTest = (Button) findViewById(R.id.button);
        myV = findViewById(R.id.view);
        btnTest.setOnClickListener(c);
    }

    private View.OnClickListener c = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Square[] squares = {new Square(new Paint(Color.RED), 0, 0, 50), new Square(50, 50, 100), new Square(50, 0, 50), new Square(new Paint(Color.CYAN), 150, 150, 130)};
            ((myView)myV).setToDraw(true);
            ((myView) myV).setObjects(squares);
            myV.invalidate();
        }
    };
}
  @Override
protected void onDraw(Canvas canvas) {
    if (toDraw){
        for (int i = 0; i < objects.length; i++){
            canvas.save();
            Log.i(MainActivity.TAG, "rysownaie + " + objects[i].toString());
            objects[i].drawOnCanvas(canvas);
            canvas.restore();
            invalidate();
        }
    }
    super.onDraw(canvas);
}
 @Override
protected void onDraw(Canvas canvas) {
    if (toDraw){
        for (int i = 0; i < objects.length; i++){
            Log.i(MainActivity.TAG, "rysownaie + " + objects[i].toString());
            objects[i].drawOnCanvas(canvas);
        }
    }
    super.onDraw(canvas);
}