Java 谁能解释一下为什么我不能从这个类中得到一个变量?
一段时间以来,我一直在尝试从MySurfaceView获取一个变量,以便在我的Player类中使用。我似乎不能让它工作。。。我试着从我的MainActivity课程中获取触摸信息,但它并不是我真正想要的,而且似乎也无法让它工作。感谢您的帮助 MySurfaceView.javaJava 谁能解释一下为什么我不能从这个类中得到一个变量?,java,android,class,setter,getter,Java,Android,Class,Setter,Getter,一段时间以来,我一直在尝试从MySurfaceView获取一个变量,以便在我的Player类中使用。我似乎不能让它工作。。。我试着从我的MainActivity课程中获取触摸信息,但它并不是我真正想要的,而且似乎也无法让它工作。感谢您的帮助 MySurfaceView.java package com.Frenchie.SurfaceView; import ... public class MySurfaceView extends SurfaceView implements Runna
package com.Frenchie.SurfaceView;
import ...
public class MySurfaceView extends SurfaceView implements Runnable {
Bitmap bitmap;
SurfaceHolder surfaceHolder;
int LastTouchx;
Player player;
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
player = new Player(context);
surfaceHolder = getHolder();
//Starts the run()
Thread TestThread = new Thread(this);
TestThread.start();
}
@Override
public void run() {
//TODO movement here when display is working
while (true){
Update();
DrawPlayer();
}
}
public void Update(){
player.Update();
}
public void DrawPlayer(){
Canvas canvas = surfaceHolder.lockCanvas();
if (surfaceHolder.getSurface().isValid()) {
canvas.drawColor(Color.BLUE);
canvas.drawBitmap(player.getBitmap(), player.getX(), player.getY(), null);
surfaceHolder.unlockCanvasAndPost(canvas);
}
else{
Log.d("DrawPlayer", "Surface Not Valid");
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
LastTouchx = (int)event.getX();
//LastTouchy= (int)event.getY();
Log.d("Touch Value ",LastTouchx+"");
return false;
}
public int getLastTouchx() {
return LastTouchx;
}
}
package com.Frenchie.SurfaceView;
import ...
public class Player {
//Bitmap to get character from image
private Bitmap bitmap;
//coordinates
private int x;
private int y;
//motion speed of the character
private int speed = 0;
MySurfaceView mySurfaceView;
//constructor
public Player(Context context) {
x = 75;
y = 500;
//Getting bitmap from drawable resource
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);
}
//Method to update coordinate of character
public void Update(){
//updating x coordinate
if (x > mySurfaceView.getLastTouchx()){
x++;
}
else if (x < mySurfaceView.getLastTouchx()){
x--;
}
else{
Log.d("Update","Else triggered");
}
}
public Bitmap getBitmap() {
return bitmap;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
Player.java
package com.Frenchie.SurfaceView;
import ...
public class MySurfaceView extends SurfaceView implements Runnable {
Bitmap bitmap;
SurfaceHolder surfaceHolder;
int LastTouchx;
Player player;
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
player = new Player(context);
surfaceHolder = getHolder();
//Starts the run()
Thread TestThread = new Thread(this);
TestThread.start();
}
@Override
public void run() {
//TODO movement here when display is working
while (true){
Update();
DrawPlayer();
}
}
public void Update(){
player.Update();
}
public void DrawPlayer(){
Canvas canvas = surfaceHolder.lockCanvas();
if (surfaceHolder.getSurface().isValid()) {
canvas.drawColor(Color.BLUE);
canvas.drawBitmap(player.getBitmap(), player.getX(), player.getY(), null);
surfaceHolder.unlockCanvasAndPost(canvas);
}
else{
Log.d("DrawPlayer", "Surface Not Valid");
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
LastTouchx = (int)event.getX();
//LastTouchy= (int)event.getY();
Log.d("Touch Value ",LastTouchx+"");
return false;
}
public int getLastTouchx() {
return LastTouchx;
}
}
package com.Frenchie.SurfaceView;
import ...
public class Player {
//Bitmap to get character from image
private Bitmap bitmap;
//coordinates
private int x;
private int y;
//motion speed of the character
private int speed = 0;
MySurfaceView mySurfaceView;
//constructor
public Player(Context context) {
x = 75;
y = 500;
//Getting bitmap from drawable resource
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);
}
//Method to update coordinate of character
public void Update(){
//updating x coordinate
if (x > mySurfaceView.getLastTouchx()){
x++;
}
else if (x < mySurfaceView.getLastTouchx()){
x--;
}
else{
Log.d("Update","Else triggered");
}
}
public Bitmap getBitmap() {
return bitmap;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
这不是建议的帖子的副本。试试:
MySurfaceView mySurfaceView = new MySurfaceView();
覆盖MySurfaceView中的另一个构造函数:
public class MySurfaceView extends SurfaceView
...
public MySurfaceView(Context context) {
this(context, (AttributeSet)null)
}
public MySurfaceView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
player = new Player(context, this);
bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.player);
surfaceHolder = getHolder();
//Starts the run()
Thread TestThread = new Thread(this);
TestThread.start();
}
...
在您的player In构造函数中,您可以传递一个surfaceView:因此无需初始化:
MySurfaceView mySurfaceView;
//constructor
public Player(Context context, MySurfaceView surfaceView) {
this.mySurfaceView = surfaceView;
x = 75;
...
当我用这个替换player类中的原始调用时,我得到以下错误:错误:(19,35)错误:类MySurfaceView中的构造函数MySurfaceView不能应用于给定类型;必需:上下文,找到属性集:无参数原因:实际参数列表和形式参数列表的长度不同尝试在
MySurfaceView.java
中定义空构造函数无论何时重写视图,都应该重写构造函数。在你的播放器中,你没有初始化mysurfaceview。你介意详细描述一下维克多吗?我不太明白。当我向MySurfaceView添加一个空构造函数时,我还收到了以下消息:“在‘android.view.SurfaceView’中没有可用的默认构造函数”非常感谢!你能解释一下这是怎么回事吗?标记为正确答案。@Frenchie视图本身是重写父级构造函数所必需的。如果您用xml声明了自定义视图,那么OS将调用其中一个具有两个或更多参数的构造函数。通过编程,您可以使用简单构造函数视图(上下文)创建一个视图,并使用setter设置属性。@Frenchie您的播放器类取决于您的表面视图,因此应该在播放器类中创建表面视图,或者使用构造函数注入表面视图,就像我上面所做的那样。也许最好的方法就是改变顺序,把你的逻辑告诉玩家,让SurfaceView变得简单