0

我想长时间悬停图像,我尝试了这个:

image.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View arg0, MotionEvent event) {
                Long start = null, end = null;
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP:
                        start = System.currentTimeMillis();
                       //do somethins....
                        break;
                    case MotionEvent.ACTION_DOWN:
                         end = System.currentTimeMillis();
                        //do something...
                        break;
                }
                if(end-start<1003){
                     //do something ....
                  }
                return true;
            }
        });

但它给了我一个空异常,我该怎么做才能让它工作?

提前致谢,

4

3 回答 3

1

它为您提供空指针异常,因为您在它们仍然为空时使用“end”和“start”。此外,ACTION_DOWN 发生在 ACTION UP 之前。ACTION_DOWN 在您第一次触摸视图时触发,而 ACTION_UP 在您抬起手指时触发。

此外,您必须在 onTouch 方法之外定义变量,否则它们将永远不会被初始化,因为 ACTION_DOWN 和 ACTION_UP 永远不会同时被调用。

Long start = 0L, end = 0L;

@Override
public boolean onTouch(View arg0, MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_UP:
            end = System.currentTimeMillis();
            //do something....
            if(end-start<1003){
                     //do something ....
            }
            return true;
        case MotionEvent.ACTION_DOWN:
            start = System.currentTimeMillis();
            //do something...         
            return true;
    }
}
于 2013-09-15T19:04:05.807 回答
0

每次执行此方法时,您的startend对象都将为空。如果操作为 UP,则end在您尝试使用它进行计算之前永远不会初始化。如果操作是 DOWN,则start在您尝试使用它进行计算之前永远不会初始化。

您可以使开始/结束变量的范围更大,例如将它们定义为类变量。这样,大概在尝试使用它们进行任何计算之前,这两个变量都将被初始化为值。

于 2013-09-15T18:52:23.887 回答
-2

只需更改此行

Long start = null, end = null;

       Long start =0L;
       Long  end = 0L;
于 2013-09-15T18:56:16.110 回答