2014-10-21 6 views
0

Я разрабатываю проект, в котором я хочу diffrent задачи для различного времени, как если кнопка пользователя после 5 milisecond затем код, выполнить, и если время прессования является более, что тогда diffrentКак подсчитать время нажатия кнопки в android?

фактически ет создание chathead как в facebook чат

проблема в том, это на ActionDown Event я хочу, чтобы открыть или запустить мое приложение

, но проблема в том, когда пользователь пытается перераспределить chathead из одного места в другое огонь события как

This is my code 

здесь в ACTION_DOWN случае я хочу намерение приложения

 public class ChadHead extends Service { 
    private final Handler mHandler = new Handler(); 
    private Runnable mTimer1; 
private WindowManager windowManager; 
private ImageView chatHead; 
Display display; 
int width; 
    int count=0; 


@Override 
public IBinder onBind(Intent intent) { 
    // Not used 
    return null; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 

    mTimer1 = new Runnable() { 

      @Override 
      public void run() { 
       count++; 
       // TODO Auto-generated method stub 
       mHandler.postDelayed(this, 5000); 
       if (count == 1) { 
        mHandler.removeCallbacks(mTimer1); 
        // put your code here: 
       } 
      } 
     }; 



    windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 

    chatHead = new ImageView(this); 
    chatHead.setImageResource(R.drawable.ic_launcher); 

    final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.WRAP_CONTENT, 
      WindowManager.LayoutParams.TYPE_PHONE, 
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
      PixelFormat.TRANSLUCENT); 

    params.gravity = Gravity.TOP | Gravity.LEFT; 
    params.x = 0; 
    params.y = 100; 

    windowManager.addView(chatHead, params); 

    chatHead.setOnTouchListener(new View.OnTouchListener() { 
     private int initialX; 
     private int initialY; 
     private float initialTouchX; 
     private float initialTouchY; 

     @SuppressWarnings("deprecation") 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       initialX = params.x; 
       initialY = params.y; 
       initialTouchX = event.getRawX(); 
       initialTouchY = event.getRawY(); 

       mHandler.postDelayed(mTimer1, 0); 
       /*Intent i; 
       PackageManager manager = getPackageManager(); 
       try { 
        i = manager.getLaunchIntentForPackage("com.technorapper.technorappermapp"); 
       if (i == null) 
        throw new PackageManager.NameNotFoundException(); 
       i.addCategory(Intent.CATEGORY_LAUNCHER); 
       startActivity(i); 
       } catch (PackageManager.NameNotFoundException e) { 

       }*/ 


       Toast.makeText(getApplicationContext(), "TechnoRapper", 50) 
         .show(); 

       return true; 
      case MotionEvent.ACTION_MOVE: 
       params.x = initialX 
         + (int) (event.getRawX() - initialTouchX); 
       params.y = initialY 
         + (int) (event.getRawY() - initialTouchY); 
       windowManager.updateViewLayout(chatHead, params); 

       display = windowManager.getDefaultDisplay(); 
       width = display.getWidth(); 

       return true; 
      case MotionEvent.ACTION_UP: 
       count = 0; 
       if (initialTouchX < width/2) { 
        initialTouchX = 0; 
       } else if (initialTouchX >= width/2) { 
        initialTouchX = width; 
       } 
       return true; 
      } 
      return false; 
     } 
    }); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (chatHead != null) 
     windowManager.removeView(chatHead); 
} 
    } 

ответ

2

Я сталкивался с этим, так как 3 месяца назад, вот мое решение:

private int count = 0; 
    Button btn; 
    private final Handler mHandler = new Handler(); 
    private Runnable mTimer1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button) findViewById(R.id.btn); 
     mTimer1 = new Runnable() { 

      @Override 
      public void run() { 
       count++; 
       // TODO Auto-generated method stub 
       mHandler.postDelayed(this, 500); 
       if (count == 1) { 
        mHandler.removeCallbacks(mTimer1); 
        // put your code here: 
       Intent i; 
       PackageManager manager = getPackageManager(); 
       try { 
        i = manager.getLaunchIntentForPackage("com.technorapper.technorappermapp"); 
       if (i == null) 
        throw new PackageManager.NameNotFoundException(); 
       i.addCategory(Intent.CATEGORY_LAUNCHER); 
       startActivity(i); 
       } catch (PackageManager.NameNotFoundException e) { 

       } 

       } 
      } 
     }; 
     btn.setOnTouchListener(new OnTouchListener() { 

      private int initialX; 
      private int initialY; 
      private float initialTouchX; 
      private float initialTouchY; 

      @Override 
      public boolean onTouch(View v, final MotionEvent event) { 
       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        initialX = (int) btn.getX(); 
        initialY = (int) btn.getY(); 
        initialTouchX = event.getRawX(); 
        initialTouchY = event.getRawY(); 
        mHandler.postDelayed(mTimer1, 0); 
        return true; 
       case MotionEvent.ACTION_UP: 
        count = 0; 
        return true; 
       case MotionEvent.ACTION_MOVE: 
        runOnUiThread(new Runnable() { 
         public void run() { 
          btn.setX(initialX 
            + (int) (event.getRawX() - initialTouchX)); 
          btn.setY(initialY 
            + (int) (event.getRawY() - initialTouchY)); 
         } 
        }); 

        return true; 
       } 
       return false; 
      } 
     }); 

с этим кодом вы можете переместить chathead и начать событие после 500 milisecond. Не нужно использовать OnClickListener, проверьте, не изменилась ли позиция, поэтому определите ее как OnClickListener.
И если вы хотите, чтобы остановить OnTouch события, когда поймать какое-то действие, просто поставить «логические переменную» в ACTION_MOVE

+0

Я загрузил свой код, пожалуйста, просмотрите –

+0

Хмм, я думаю, это нормально. Попытайтесь поместить свое намерение после mHandler.removeCallbacks (mTimer1) ... (например, мой ответ на обновление), затем запустите для теста. Я жду вашего ответа – kemdo

+1

сделано, но с некоторыми разными трюками, но ваши анды помогают мне в этом за то, что thankyou –

1

Если вы хотите сделать какой-то нестандартные длительности вы должны запрограммировать его самостоятельно.

Однако рекомендуется использовать функции сборки android. Есть View.OnLongClickListener и View.OnClickListener, чтобы отличить от двух разных длительностей для щелчка по просмотрам.

+0

На самом деле эм делать это в onTouchListner так что любая длинные сенсорная функция или нет –

0

Я не могу сказать вам полный точный код, но я могу объяснить поток здесь, то, что я получаю от вашего ответа, заключается в том, что вам нужно делать разные действия на основе последнего нажатия кнопки, вот как ты можешь сделать. Вам нужно два Переменные даты, т.е. ток и LastTime

DateTimeUtils.getCurrentUTCFormattedDateTime() 

Хранить LastTime в настройках на действии вниз выборки в последний раз от предпочтений и получить текущее время и вычитать его, чтобы получить разницу.

long difference = (current.getTime() - lastSaved.getTime())/1000; 

дает вам разницу во времени в секундах, тогда вы решаете, что делать. Надеюсь, что это поможет :)

+0

вы можете попросить больше, если вам нужны дальнейшее руководство –

+0

фактически ет создание chathead как в facebook чате проблемы это на ActionDown Event я хочу, чтобы открыть или запустить мое приложение , но проблема в том, когда пользователь пытается перераспределить chathead из одного места в другое огонь события –

+0

нормально , но посмотрите, что никто не может написать полный код для вас, я дал вам эту идею в соответствии с моим пониманием, удачи –

2

Вы можете использовать View.OnTouchListener и две временные метки для сохранения нажатия кнопки (ACTION_DOWN) и времени окончания (ACTION_UP). Затем разница между этими двумя переменными (end-start) будет указывать на продолжительность нажатия кнопки, и вы можете выполнить код в соответствии с вашими предпочтениями.

test.setOnTouchListener(new OnTouchListener() { 
    private long start = 0; 
    private long end = 0; 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction()==MotionEvent.ACTION_DOWN) { 
      this.start = System.currentTimeMillis(); 
     } else if (event.getaction()==MotionEvent.ACTION_UP) { 
      this.end = System.currentTimeMillis(); 
     } 
    } 
}); 
Смежные вопросы