Java 画布不是';t使用更改更新,即使重复调用
这是我对java类的代码,我在其中画了三个塔,在上面放置了一定数量的环。在onTouchEvent函数中,我注意到活动,并相应地增加移动的次数,这反过来会显示在屏幕上。但它不会更新,直到我转到上一个活动并返回 Number.javaJava 画布不是';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
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的最后一行