[英]How to use onTouchEvent?
这段代码有什么问题。当我从上向下滑动屏幕时,我希望写入文本“ Down”,反之亦然。但是在Emulator上什么都没有改变。这是什么问题?
public class Draw extends View{
int ratioX = 50;
int ratioY = 350;
float dx = 0;
float dy = 0;
int newX;
int newY;
String dir="Hello";
public Draw(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public boolean onTouchEvent(MotionEvent event){
float touchX = 0;
float touchY = 0;
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
touchX = event.getX();
touchY = event.getY();
return true;
case MotionEvent.ACTION_UP:
dx = touchX - event.getX();
dy = touchY - event.getY();
if(Math.abs(dy) > Math.abs(dx)){
if(dy > 0){
dir = "DOWN";
}
else{
dir = "UP";
}
}
else{
if(dx > 0){
dir = "RIGHT";
}
else{
dir = "LEFT";
}
}
}
return true;
}
public void onDraw(Canvas c){
//Rect myRect = new Rect();
//myRect.set(ratioX,c.getHeight()/8,ratioY,c.getWidth()/8);
Paint p = new Paint();
p.setStyle(Paint.Style.FILL);
p.setColor(Color.BLACK);
c.drawPaint(p);
//p.setColor(Color.WHITE);
//c.drawRect(myRect, p);
p.setColor(Color.WHITE);
p.setTextSize(18);
c.drawText(dir, 200, 360, p);
}
}
刷屏幕时什么也没发生! 还是应该使用其他方法?
要更改其内容时,需要invalidate()
视图invalidate()
。 下面的代码片段应该有所帮助;
public boolean onTouchEvent(MotionEvent event) {
// Other parts of method omitted for brevity
case MotionEvent.ACTION_UP:
dx = touchX - event.getX();
dy = touchY - event.getY();
String newDir = dir;
if(Math.abs(dy) > Math.abs(dx)){
if(dy > 0){
newDir = "DOWN";
}
else{
newDir = "UP";
}
}
else{
if(dx > 0){
newDir = "RIGHT";
}
else{
newDir = "LEFT";
}
}
if (newDir != dir) {
dir = newDir;
// We only want to invalidate the view when your 'dir' value has changed.
// onDraw() will then be triggered.
invalidate();
}
}
return true;
}
每次调用onTouchEvent
,局部浮点数touchX
和touchY
将被初始化为零。 这会影响您处理ACTION_UP
的逻辑:
dx = touchX - event.getX();
dy = touchY - event.getY();
if(Math.abs(dy) > Math.abs(dx)){
if(dy > 0){
dir = "DOWN";
} else {
dir = "UP";
}
}
dx
和dy
最终分别为-x和-y。 在Math.abs()
调用之后,您实际上是在测试他们的手指是否比屏幕更远。
将初始向下坐标存储为成员变量,并在ACTION_DOWN
期间进行设置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.