繁体   English   中英

如何使用onTouchEvent?

[英]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 ,局部浮点数touchXtouchY将被初始化为零。 这会影响您处理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";                 
    }
}

dxdy最终分别为-x和-y。 Math.abs()调用之后,您实际上是在测试他们的手指是否比屏幕更远。

将初始向下坐标存储为成员变量,并在ACTION_DOWN期间进行设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM