Java 画布不是';t使用更改更新,即使重复调用

Java 画布不是';t使用更改更新,即使重复调用,java,android,canvas,touch-event,ondraw,Java,Android,Canvas,Touch Event,Ondraw,这是我对java类的代码,我在其中画了三个塔,在上面放置了一定数量的环。在onTouchEvent函数中,我注意到活动,并相应地增加移动的次数,这反过来会显示在屏幕上。但它不会更新,直到我转到上一个活动并返回 Number.java package com.syncnlink.myapplication; public class Number { public static int tower1[] = new int[10]; public static int tower2[] = ne

这是我对java类的代码,我在其中画了三个塔,在上面放置了一定数量的环。在onTouchEvent函数中,我注意到活动,并相应地增加移动的次数,这反过来会显示在屏幕上。但它不会更新,直到我转到上一个活动并返回

Number.java

package com.syncnlink.myapplication;

public class Number {
public static int tower1[] = new int[10];
public static int tower2[] = new int[10];
public static int tower3[] = new int[10];


public static void initialize() {
    for (int i = 0; i < 10; i++)
    {
        tower1[i] = i+1;
        tower2[i] = -1;
        tower3[i] = -1;
    }
}
public static int numelements(int arr[]) {
    int count = 0;
    for (int i = 0; i < 10; i++)
    {
        if (arr[i] > 0)
            count++;
        else
            continue;
    }
    return count;
}

public static void setit(int arr[], int a)
{
    arr[a]=-1;
}

public static void setit1(int a)
{
    tower1[a]=-1;
}

public static boolean isEmpty(int arr[])
{
    for(int i=0;i<5;i++)
        if(arr[i]>-1)
        {
            return false;
        }
    return true;
}

}
package com.syncnlink.myapplication;
公共课号{
公共静态整数塔1[]=新整数[10];
公共静态整数塔2[]=新整数[10];
公共静态整数塔3[]=新整数[10];
公共静态void initialize(){
对于(int i=0;i<10;i++)
{
塔楼1[i]=i+1;
塔楼2[i]=-1;
塔3[i]=-1;
}
}
公共静态整数(整数arr[]{
整数计数=0;
对于(int i=0;i<10;i++)
{
如果(arr[i]>0)
计数++;
其他的
继续;
}
返回计数;
}
公共静态无效设置(int arr[],int a)
{
arr[a]=-1;
}
公共静态无效集合1(int a)
{
塔1[a]=-1;
}
公共静态布尔值为空(int arr[]
{
对于(int i=0;i-1)
{
返回false;
}
返回true;
}
}
新游戏活动

package com.syncnlink.myapplication;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class NewGame extends Activity {

public CustomRectangle cr;
static float x,y,width, height;
public static int moves =0;
private static Bitmap background;
static Canvas canvas;
public int ff=0,initialized=0;
public static int t1,t2,t3;


@Override
protected void onCreate(Bundle savedInstanceState) {
    background =    BitmapFactory.decodeResource(getResources(),R.drawable.background);
    super.onCreate(savedInstanceState);
    CustomRectangle cr = new CustomRectangle(this);
    setContentView(cr);
    Number.initialize();


    t1 = Number.numelements(Number.tower1);
    t2 = Number.numelements(Number.tower2);
    t3 = Number.numelements(Number.tower3);
}

public static class CustomRectangle extends View {

    CustomRectangle(Context c) {
        super(c);
        invalidate();
    }

    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        NewGame n = new NewGame();
        if(n.initialized == 0)
        {
            Number.initialize();
        }
        Paint p[]= new Paint[11];
        for(int i=0;i<11;i++)
            p[i] = new Paint();
        p[0].setColor(Color.YELLOW);
        p[1].setColor(Color.BLUE);
        p[2].setColor(Color.CYAN);
        p[3].setColor(Color.RED);
        p[4].setColor(Color.GRAY);
        p[5].setColor(Color.MAGENTA);
        p[6].setColor(Color.BLUE);
        p[7].setColor(Color.CYAN);
        p[8].setColor(Color.RED);
        p[9].setColor(Color.GRAY);
        p[10].setColor(Color.MAGENTA);
        canvas.drawBitmap(background,0,0,null);

        p[0].setStrokeWidth(24);

        height = getHeight();
        width = getWidth();
        float w = width/1794;
        float h = height/1008;

        canvas.drawLine(100*(width/1794),1000*(height/1008),500*(width/1794),1000*(height/1008),p[0]);
        canvas.drawLine(300*(width/1794),1000*(height/1008),300*(width/1794),400,p[0]);
        canvas.drawLine((100+600)*(width/1794),1000*(height/1008),(500+600)*(width/1794),1000*(height/1008),p[0]);
        canvas.drawLine((300+600)*(width/1794),1000*(height/1008),(300+600)*(width/1794),400*(height/1008),p[0]);
        canvas.drawLine((100+1200)*(width/1794),1000*(height/1008),(500+1200)*(width/1794),1000*(height/1008),p[0]);
        canvas.drawLine((300+1200)*(width/1794),1000*(height/1008),(300+1200)*(width/1794),400*(height/1008),p[0]);

        int j=0;
        for (int i = 0; i < 10; i++) {
            if(Number.tower1[i]<0)
            continue;
            else {
                canvas.drawRect((150 + (i * 14))*w, (942 - (j * 44))*h, (450 - (i * 14))*w, (987 - (j * 44))*h, p[i + 1]);
                j++;
            }
        }

        j=0;
        for (int i = 0; i < 10; i++) {
            if(Number.tower2[i]<0)
                continue;
            else {
                canvas.drawRect((150 + (i * 14) + 600)*w, (942 - (i * 44))*h, (450 + 600 - (i * 14))*w, (987 - (i * 44))*h, p[i + 1]);
                j++;
            }
        }

        j=0;
        for (int i = 0; i < 10; i++) {
            if(Number.tower3[i]<0)
                continue;
            else {
                canvas.drawRect((150 + 1200 + (i * 14))*w, (942 - (i * 44))*h, (450 + 1200 - (i * 14))*w, (987 - (i * 44))*h, p[i + 1]);
                j++;
            }
        }

        p[0].setTextSize(48);
        canvas.drawText(" No. of Moves  " + moves ,100,40,p[0]);
    }
}

@Override
public boolean onTouchEvent( MotionEvent event1) {
    try {

        switch (event1.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                x=event1.getX();
                y=event1.getY();

                if(x<width/3)
                {

                    if(!Number.isEmpty(Number.tower1)) {
                        Toast.makeText(this, "Pop Tower1   " + t1--, Toast.LENGTH_SHORT).show();
                        ff=0;
                        moves++;
                        Number.setit1(t1);
                        cr.invalidate();
                    }
                    else {
                        Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show();
                        ff = 1;
                    }
                }
                else
                if(x<width*2/3) {
                    if (!Number.isEmpty(Number.tower2)) {
                        Toast.makeText(this, "Pop Tower2   " + t2--, Toast.LENGTH_SHORT).show();
                        Number.setit(Number.tower2, t2);
                        ff=0;
                        moves++;
                        cr.invalidate();

                    } else {
                        ff = 1;
                        Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show();
                    }
                }
                else
                {
                    if(!Number.isEmpty(Number.tower3)) {
                        Number.setit(Number.tower3, t3);
                        Toast.makeText(this, "Pop Tower3   " + t3--, Toast.LENGTH_SHORT).show();
                        moves++;
                        cr.invalidate();
                        ff=0;
                    }
                    else {
                        Toast.makeText(this, "Empty! Nothing to Pop", Toast.LENGTH_SHORT).show();
                        ff = 1;
                    }
                }
                break;
            }
            case MotionEvent.ACTION_UP: {
                x=event1.getX();
                y=event1.getY();
                if(x<width/3)
                {
                    if(ff==0)
                    {
                    Number.setit2(Number.tower1,++t1);
                    Toast.makeText(this, "Push Tower1    " + t1, Toast.LENGTH_SHORT).show();
                }
                }
                else
                if(x<width*2/3)
                {
                    if(ff==0)
                    {
                    Number.setit2(Number.tower2,++t2);
                    Toast.makeText(this, "Push Tower2    " + t2, Toast.LENGTH_SHORT).show();
                }
                }

                else
                {
                    if(ff==0) {
                        Number.setit2(Number.tower3, ++t3);
                        Toast.makeText(this, "Push Tower3    " + t3, Toast.LENGTH_SHORT).show();
                    }
                }

                break;
            }

        }
    }
    catch(Exception e)
    {

    }
    return true;
}
}
package com.syncnlink.myapplication;
导入android.app.Activity;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.Canvas;
导入android.graphics.Color;
导入android.graphics.Paint;
导入android.os.Bundle;
导入android.view.MotionEvent;
导入android.view.view;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.Toast;
公共类新游戏扩展活动{
公共海关;
静态浮动x、y、宽度、高度;
公共静态整数移动=0;
私有静态位图背景;
静态画布;
公共int ff=0,初始化=0;
公共静态int t1、t2、t3;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
background=BitmapFactory.decodeResource(getResources(),R.drawable.background);
super.onCreate(savedInstanceState);
CustomRectangle cr=新的CustomRectangle(此);
setContentView(cr);
Number.initialize();
t1=数量单位(数量单位1);
t2=塔数(塔数2);
t3=数量(塔架数量3);
}
公共静态类CustomRectangle扩展视图{
自定义矩形(上下文c){
超级(c);
使无效();
}
公共空白onDraw(画布){
super.onDraw(帆布);
新游戏n=新游戏();
如果(n.initialized==0)
{
Number.initialize();
}
油漆p[]=新油漆[11];

对于(inti=0;i我认为您需要在CustomRectangle.class上创建一些setter

public void setSomething(Arguments)
{
    // do your changes here 
    invalidate();
}
并调用setters来更改OnTunch中绘图的状态

case:MotionEvent.ACTION_DOWN:
    cr.setSomething(Arguments);
....
....
当您调用setter时,它们将在调用失效后更新画布的状态


我希望这对您有所帮助!

您可以通过在构造函数中线程化invalidate来修复它,将其更改为:

   CustomRectangle(Context c) {
            super(c);
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true) {
                        try {
                            Thread.sleep(1000);
                            postInvalidate();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }
            });

        thread.start();
        }

我已经在“onTouchEvent”函数中使用了setter。所以我想如果在调用invalidate之后我的画布应该更新状态。?是否有必要在CustomRectangle类中执行此操作?@AdrianoAlvesDis您在setter中调用invalidate()了吗?它必须是setter的最后一行