我想使用在xml中创建的布局 在触摸屏幕的位置移动imageView。 四处走动,完全卡住。 怎么了? 是否可以将所有这些代码放入onCreate,或者我应该使用其他方法?
public class Game2 extends Activity implements OnTouchListener {
ImageView myBall;
static TextView textElement;
static float x, y = 0;
static float newX, newY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.field);
textElement = (TextView) findViewById(R.id.score);
textElement.setText("Starting");
myBall = (ImageView) findViewById(R.id.my_ball);
}
@Override
public boolean onTouch(View v, MotionEvent me) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch (me.getAction()) {
case MotionEvent.ACTION_UP:
newX = me.getX();
newY = me.getY();
myBall.setX(newX);
myBall.setY(newY);
break;
}
myBall.invalidate();
return true;
}
}
答案 0 :(得分:0)
问题在于,在给定的代码中,您只在活动开始时抽出一次球。 onCreate()
仅在操作系统中Activity
为brought to life时被调用一次。您正在使用invalidate()
强制重绘ImageView
,因此我相信如果您在invalidate()
更新球的位置后再次致电onTouch()
方法,你应该得到你之后的行为。
此外,您似乎只是将值分配给newX
和newY
,而不是球的实际位置。您需要再次致电setX()
和setY()
才能传递这些更新后的值。
答案 1 :(得分:0)
试试这个:
@Override
public boolean onTouch(View v, MotionEvent me) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
switch (me.getAction()) {
case MotionEvent.ACTION_UP:
newX = me.getX();
newY = me.getY();
myBall.setX(newX);
myBall.setY(newY);
break;
}
return true;
}
答案 2 :(得分:0)
其实我的朋友是对的 但是代码没有用,因为我还没有设置onTouchListenner。
所以我设置了布局ID
android:id="@+id/field_layout"
并添加onCreate:
LinearLayout myLayout = (LinearLayout) findViewById(R.id.field_layout);
myLayout.setOnTouchListener(this);
现在一切正常。 非常感谢!