Java Android onTouch事件未发生?
我一直在研究并努力使用我的代码来获得一个文本视图,以便在触摸“幽灵”时更新分数 这是我的第一个Android应用程序,据我所知(我在ontouch中添加了Log.w(),但从未发布日志,分数也没有增加,甚至没有出现),ontouch(View v,MotionEvent事件)从未被调用。下面是我的代码Java Android onTouch事件未发生?,java,android,textview,ontouchlistener,Java,Android,Textview,Ontouchlistener,我一直在研究并努力使用我的代码来获得一个文本视图,以便在触摸“幽灵”时更新分数 这是我的第一个Android应用程序,据我所知(我在ontouch中添加了Log.w(),但从未发布日志,分数也没有增加,甚至没有出现),ontouch(View v,MotionEvent事件)从未被调用。下面是我的代码 package com.cs461.Ian; //TODO:Add accelerometer support //TODO:Add Clickable ghosts //TODO:Add ca
package com.cs461.Ian;
//TODO:Add accelerometer support
//TODO:Add Clickable ghosts
//TODO:Add camera background
/*Completed:(As of 2:30am 4/16)
* Activity launches
* Ghost appears on screen
* Ghost will randomly move around the screen
*/
import java.util.Random;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.View;
import android.widget.TextView;
public class CameraActivity extends Activity{
Bitmap g;
Ghost a;
Ghost still;
SurfaceHolder mSurfaceHolder;
boolean firsttime=true;
int draw_x,draw_y,xSpeed,ySpeed,score=0;
TextView t;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
a = new Ghost(getApplicationContext());
still = new Ghost(getApplicationContext());
//requestWindowFeature(Window.FEATURE_NO_TITLE);
a.Initalize(BitmapFactory.decodeResource(getResources(), R.drawable.ghost), 20, 20);
still.Initalize(BitmapFactory.decodeResource(getResources(), R.drawable.ghost), 120, 120);
t = (TextView) findViewById(R.id.t);
t.setText("TEST SCORE TO SEE IF TEXTVIEW SHOWS UP");
a.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
score++;
t.setText("Score: "+score);
}
return true;
}
});
still.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
score++;
t.setText("Score: "+score);
Log.w("CLICKED","Clicked on ghost "+score+" times");
}
return true;
}
});
setContentView(new Panel(this));
}
class Panel extends View {
public Panel(Context context) {
super(context);
}
@Override
public void onDraw(Canvas canvas) {
//g.Initalise(BitmapFactory.decodeFile("/res/drawable-hdpi/ghost.png"), 200, 150, 5, 5);;
update(canvas);
invalidate();
}
/*Places ghost on screen and bounces it around in the screen. My phone is apparently only API level 4(the most up to date is 15) so i didn't code it
*for the accelerometer yet.
*/
public void update(Canvas canvas) {
Random rand = new Random();
if(firsttime){
draw_x = Math.round(System.currentTimeMillis() % (this.getWidth()*2)) ;
draw_y = Math.round(System.currentTimeMillis() % (this.getHeight()*2)) ;
xSpeed = rand.nextInt(10);
ySpeed = rand.nextInt(10);
firsttime=false;
}
draw_x+=xSpeed;
draw_y+=ySpeed;
draw_x = Math.round(System.currentTimeMillis() % (this.getWidth()*2)) ;
draw_y = Math.round(System.currentTimeMillis() % (this.getHeight()*2)) ;
if (draw_x>this.getWidth()){
draw_x = (this.getWidth()*2)-draw_x;
xSpeed = rand.nextInt(10);
if(xSpeed >=5)
xSpeed=-xSpeed;
}
if (draw_y>this.getHeight()){
draw_y = (this.getHeight()*2)-draw_y;
ySpeed = rand.nextInt(10);
if(ySpeed >=5)
ySpeed=-ySpeed;
}
g = BitmapFactory.decodeResource(getResources(), R.drawable.ghost);
canvas.drawBitmap(g, draw_x, draw_y, null);
still.draw(canvas);
a.update(canvas);
}
}
}
忘记添加类重影:
package com.cs461.Ian;
import java.util.Random;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class Ghost extends View implements View.OnTouchListener{
public Ghost(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
private Bitmap mAnimation;
private int mXPos;
private int mYPos;
private Rect mSRectangle;
private int mSpriteHeight;
private int mSpriteWidth;
View v;
Rect dest;
int score = 0;
/*public Ghost() {
mSRectangle = new Rect(0,0,0,0);
mXPos = 80;
mYPos = 200;
}*/
public void Initalize(Bitmap theBitmap, int Height, int Width) {
mSRectangle = new Rect(0,0,0,0);
mXPos = 80;
mYPos = 200;
mAnimation = theBitmap;
mSpriteHeight = Height;
mSpriteWidth = Width;
mSRectangle.top = 0;
mSRectangle.bottom = mSpriteHeight;
mSRectangle.left = 0;
mSRectangle.right = mSpriteWidth;
dest = new Rect(mXPos, mYPos, mXPos + mSpriteWidth,
mYPos + mSpriteHeight);
}
public void draw(Canvas canvas) {
canvas.drawBitmap(mAnimation, mXPos, mYPos, null);
}
public void update(Canvas canvas) {
new Random();
mXPos = Math.round(System.currentTimeMillis() % (canvas.getWidth()*2)) ;
mYPos = Math.round(System.currentTimeMillis() % (canvas.getHeight()*2)) ;
if (mXPos>canvas.getWidth())
mXPos = (canvas.getWidth()*2)-mXPos;
if (mYPos>canvas.getHeight())
mYPos = (canvas.getHeight()*2)-mYPos;
draw(canvas);
}
public Rect getRect() {
return mSRectangle;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
score++;
//CameraActivity.t.setText("Score: "+CameraActivity.score);
Log.w("CLICKED","Clicked on ghost "+score+" times");
return true; //doesn't work if returns false either
}
}
覆盖
活动中的dispatchTouchEvent(MotionEvent事件)
,以处理可能发生的所有触摸事件。返回false
将MotionEvent
传递到层次结构中的下一个视图\布局(如果它们处理事件)。如果单击功能始终相同,为什么不在构造函数中将其放入ghost的类定义中?如果将Log.w移到action if块之外会发生什么?在ghost构造函数中添加此.setClickable(true)@JustinDanielson,这是不必要的,因为setOnTouchListener()调用将确保将其设置为可单击+1移动到类定义,当然,除非它现在正在测试,稍后会变得更复杂。@R.daneel.olivaw如果我将Log.w移到外部/添加一个新的,它会按其应该的方式将其记录到logcat中。我每次都会重写它以简单地返回false,但它仍然不起任何作用。我以为它会认为每一次触摸都是在鬼魂身上,但我猜我错了。我现在得去上一节课,但几小时后我会回来。你能解释一下游戏背后的想法吗?我还看到了Ghost
扩展按钮
。您可以扩展视图
,并且仍然具有重影
可点击/可触摸。我对重写dispatchTouchEvent
的想法是,所有的交互都将通过它来完成,您不需要传递任何事件,但这完全取决于您想要实现的目标。目前,我只希望在触摸ghost时,我的textView会增加。好吧,我会创建类似的东西Ghost
通过扩展View
并实现View.OnTouchListener
。当它检测到它被触摸时,通过执行类似于((MyActivity)context).TextView.getText()…
的操作来增加活动中的TextView
文本。(您可能需要在Ghost
中转换为Int
并返回到String
)。抱歉,它仍然不起作用:/我按照您所说的做了,并在Touch等上实现了,但我刚刚将它记录到LogCat以查看它是否起作用,但它仍然没有起作用。对所有的问题感到抱歉,但经过近几个星期的努力,我真的不知道我做错了什么。我更新了主帖子中的代码,以显示我所做的更改