2012-05-09 24 views
20

Bir düğmeye basıp basılı tuttuğunuzda tekrarlı eylem uygulamak istiyorum. Örnek: Kullanıcı bir düğmeye basıp basılı tuttuğunda, kullanıcı parmağını düğmeden kaldırıncaya kadar tekrar tekrar sabit bir aralıkta benzer bir yöntem çağırmalıdır.android bir düğmeye basıp basılı tuttuğunuzda eylemi tekrarlayın

+3

Ancak benim uygulama ihtiyacım. Kullanıcı düğmeyi basılı tutarken imleci sürekli hareket ettirmek istiyorum. Her dokunuş için iyi çalışıyor. Kullanıcı düğmeyi basılı tutarken sadece eylemi tekrarlamak istiyorum. –

+2

@JoxTraex: Lütfen bir bakış açısıyla bakış açınızı detaylandırın ve ne kadar destek alındığını görün. –

cevap

59

Bunu gerçekleştirmenin birçok yolu vardır, ancak oldukça basit olanı,numaralı telefona belirli bir gecikmeyle Runnable göndermek olacaktır. o en temel form olarak, böyle biraz görünecektir:

Button button = (Button) findViewById(R.id.button); 
button.setOnTouchListener(new View.OnTouchListener() { 

    private Handler mHandler; 

    @Override public boolean onTouch(View v, MotionEvent event) { 
     switch(event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      if (mHandler != null) return true; 
      mHandler = new Handler(); 
      mHandler.postDelayed(mAction, 500); 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mHandler == null) return true; 
      mHandler.removeCallbacks(mAction); 
      mHandler = null; 
      break; 
     } 
     return false; 
    } 

    Runnable mAction = new Runnable() { 
     @Override public void run() { 
      System.out.println("Performing action..."); 
      mHandler.postDelayed(this, 500); 
     } 
    }; 

}); 

Fikri oldukça basittir: 'aşağı' dokunmatik işlem gerçekleştiğinde bir Handler tekrarlanan eylem içeren bir Runnable göndermek. Bundan sonra, 'yukarı' dokunma eylemi geçene kadar Runnable'u tekrar göndermeyin. Runnable, Handler ('aşağı' dokunma eylemi hala devam ederken) kendisini, yukarı dokunma eylemi tarafından kaldırılana kadar yayınlamaya devam edecek - 'yinelenen' özelliği budur.

Düğmenin gerçek davranışına ve takip ettiğiniz onclick/ontouch'a bağlı olarak, ilk gönderiyi gecikmeden yapmak isteyebilirsiniz.

+0

Eğer kullanıcı 5 saniye diyelim ki tuşunu basılı tuttuğunda ekstra bir şey yapmak istersem, kullanıcının 5 saniye boyunca düğmeyi tuttuğunu nasıl anlarım. –

+0

Başka bir gecikmeli 'Runnable'ı' Handler''e aktarabilirsiniz. Tek seferlik bir etkinlik olması gerekiyorsa, tekrar 'Runnable'ın kendisinden göndermeyin. Ayrıca, 5 saniye geçmeden düğmenin serbest bırakılması durumunda, 'yukarı' eylemde onu çıkarmayı unutmayın. –

+0

Düğme alanının dışına kaldırılıncaya kadar oy ver, işleyiciyi tetiklemeye devam edecektir. ACTION_CANCEL, ACTION_UP üzerinde bir düşüş olarak minimum düzeyde gereklidir. Maalesef bu düğme bir kaydırma görünümünde veya başka bir kaydırılabilir pencere öğesi içeriyorsa, bu kod, ekranın kapalı olduğu veya kullanıcı parmaklarından uzakta olsa bile, dokunmuş gereçlerin hala bekletildiği anlamına gelebilir. –

0

Bu View için bir View.OnKeyListener kayıt olabilirsiniz. Lütfen, aksi takdirde bu tür geri bildirimleri geri almak daha iyi bir hesaba katınız - yönteminizin biraz "ağır" bir şey yapması durumunda - UI düzgün olmayacaktır. Mükemmel bir fikir olmasa da,

1

. İmleç bir adımı hareket ettirdiğiniz ve zamanlayıcıyı yeniden başlattığınız bir aralıkta ateş etmek için onKeyDown'da bir zamanlayıcıyı başlatarak gerçekleştirilebilir. Daha sonra zamanlayıcıyı onKeyUp olayında iptal edebilirsiniz. Bunun diğer sistemlerde nasıl çalıştığı tipik olarak ilk tuşa basmak ve ardından kullanıcının düğmeyi kesin olarak tutmasını sağlamak için biraz beklemek ... sonra tekrar biraz daha hızlı olabilir. Bir klavyenin otomatik tekrarlandığını düşünün. Bu çalışmalı ve ui parçasını olumsuz yönde etkilememelidir.

+0

Neden bunun harika bir fikir olmadığını söylüyorsunuz? – Suragch

İlgili konular