Android 自定义视图显示正确,无法在onClick事件后重新绘制(无效)

Android 自定义视图显示正确,无法在onClick事件后重新绘制(无效),android,repaint,Android,Repaint,我在安卓系统中遇到了重绘和失效问题。我有一个简单的活动,创建一个按钮并显示我的自定义视图(drawGridclass)。我正在尝试在onClick事件之后重新绘制网格加上一条线。我的主要问题是,如何从drawGrid类中重新绘制?在这里,任何朝着正确方向的轻推都将受到赞赏 public class MainActivity extends Activity implements View.OnClickListener { DrawGrid drawGrid; @Overrid

我在安卓系统中遇到了重绘和失效问题。我有一个简单的活动,创建一个按钮并显示我的自定义视图(
drawGrid
class)。我正在尝试在onClick事件之后重新绘制网格加上一条线。我的主要问题是,如何从
drawGrid
类中重新绘制?在这里,任何朝着正确方向的轻推都将受到赞赏

public class MainActivity extends Activity implements View.OnClickListener {
    DrawGrid drawGrid;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        drawGrid = new DrawGrid(this);
        drawGrid.setBackgroundColor(Color.BLACK);
        setContentView(R.layout.activity_main);
        View ballButton2 = findViewById(R.id.right_btn);
        ballButton2.setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.right_btn:
                drawGrid.move();
        }
    }
}

public class DrawGrid extends View {
    int x = 25;
    int y = 25;
    int index = 0;

    public ArrayList<ArrayList<Integer>> playerOneRed = new ArrayList<>(100);
    Paint paint = new Paint();

    public DrawGrid(Context context) {
        super(context);
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(2);
        this.setBackgroundColor(Color.BLACK);
    }

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

    public DrawGrid(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context context) {
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(2);
        this.setBackgroundColor(Color.BLACK);
    }

    @Override
    public void onDraw(Canvas canvas) {
        Log.d("MyApp", "x is " + x);
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(3);

        for (int i = 0; i < 3000; i = i + 40) {
            canvas.drawLine(i, 0, i, 3000, paint);
        }
        for (int i = 0; i < 3000; i = i + 40) {
            canvas.drawLine(0, i, 3000, i, paint);
        }
        paint.setColor(Color.RED);
        paint.setStrokeWidth(8);

        // canvas.drawLine(0, 1000, 3000, 1000, paint);

        for (ArrayList<Integer> iter : playerOneRed) {
            canvas.drawLine(iter.get(0), iter.get(1), iter.get(2), iter.get(3), paint);
        }
    }

    public void move() {
        playerOneRed.add(new ArrayList<Integer>(4));
        playerOneRed.get(index).add(0);
        playerOneRed.get(index).add(1000);
        playerOneRed.get(index).add(x + 250);
        x = x + 250;
        playerOneRed.get(index).add(1000);

        index++;
        Invalidate();
    }
}
public类MainActivity扩展活动实现View.OnClickListener{
DrawGrid DrawGrid;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
drawGrid=新的drawGrid(本);
drawGrid.setBackgroundColor(颜色:黑色);
setContentView(R.layout.activity_main);
视图ballButton2=findViewById(R.id.right\u btn);
ballButton2.setOnClickListener(此);
}
公共void onClick(视图v){
开关(v.getId()){
案例R.id.right\u btn:
drawGrid.move();
}
}
}
公共类DrawGrid扩展视图{
int x=25;
int y=25;
int指数=0;
public ArrayList playernered=新的ArrayList(100);
油漆=新油漆();
公共绘图网格(上下文){
超级(上下文);
油漆。设置颜色(颜色。蓝色);
油漆。设置行程宽度(2);
这个.setBackgroundColor(颜色.黑色);
}
公共DrawGrid(上下文、属性集属性){
超级(上下文,attrs);
init(上下文);
}
公共DrawGrid(上下文上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init(上下文);
}
私有void init(上下文){
油漆。设置颜色(颜色。蓝色);
油漆。设置行程宽度(2);
这个.setBackgroundColor(颜色.黑色);
}
@凌驾
公共空白onDraw(画布){
Log.d(“MyApp”,“x是”+x);
油漆。设置颜色(颜色。蓝色);
油漆。设置行程宽度(3);
对于(int i=0;i<3000;i=i+40){
帆布.抽绳(i,0,i,3000,油漆);
}
对于(int i=0;i<3000;i=i+40){
帆布.抽绳(0,i,3000,i,油漆);
}
油漆。设置颜色(颜色。红色);
油漆。设置行程宽度(8);
//帆布。抽绳(0,1000,3000,1000,油漆);
用于(ArrayList iter:PlayerEnred){
帆布拉丝(iter.get(0)、iter.get(1)、iter.get(2)、iter.get(3)、绘画);
}
}
公开作废动议(){
添加(新ArrayList(4));
playonered.get(index.add)(0);
playernered.get(index.add)(1000);
playernered.get(index.add)(x+250);
x=x+250;
playernered.get(index.add)(1000);
索引++;
使无效();
}
}