Soru & Cevap

İki Butona Aynı Anda Basılı Olma Durumu

29.04.2016 - 12:34

Arkadaşlar android ile kontrol edilebilen bir wifi car yapıyorum.4 tane butonum var; ileri , geri , sağ ve sol. İleri butonuna bastığım andan butondan elimi çekene kadar yani basılı tuttuğum sürece arabanın ileri gitmesi gerekiyor mantıken.Bunu handle etmek için şöyle bir kod yazdım ve sorunsuz bir şekilde çalışıyor.

 @Override
    public boolean onTouch(View v, MotionEvent event) {
        String action;

        if (v.getId() == moveForward.getId())
            action = "/forward/";

        else if (v.getId() == moveReverse.getId())
            action = "/reverse/";

        else if (v.getId() == moveRigth.getId())
            action = "/right/";

        else
            action = "/left/";

        String serverAddress = ipAddress.getText().toString() + ":" + "80" + action;

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            HttpRequestTask requestTask = new HttpRequestTask(serverAddress);
            requestTask.execute("1");

        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            HttpRequestTask requestTask = new HttpRequestTask(serverAddress);
            requestTask.execute("0");
        }
        return false;
    }

 private class HttpRequestTask extends AsyncTask<String, Void, String> {

        private String serverAdress;
        private String serverResponse = "";

        public HttpRequestTask(String serverAdress) {
            this.serverAdress = serverAdress;
        }

        @Override
        protected String doInBackground(String... params) {

            String val = params[0];
            String url = "http://" + serverAdress + val;
 
            try {
                HttpClient client = new DefaultHttpClient();
                HttpGet getRequest = new HttpGet();
                getRequest.setURI(new URI(url));
                HttpResponse response = client.execute(getRequest);

                InputStream inputStream = null;
                inputStream = response.getEntity().getContent();
                BufferedReader bufferedReader =
                        new BufferedReader(new InputStreamReader(inputStream));

                serverResponse = bufferedReader.readLine();
                inputStream.close();

            } catch (URISyntaxException e) {
                e.printStackTrace();
                serverResponse = e.getMessage();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                serverResponse = e.getMessage();
            } catch (IOException e) {
                e.printStackTrace();
                serverResponse = e.getMessage();
            }

            return serverResponse;
        }

 

Fakat şöyle bir senaryo da var. İleri veya geri butonlarına basılı olduğu sırada sağ ve sol a dönme butonlarına da basılı olabilir ve bu durumda ileri sağa veya ileri sola gidebilmesi lazım.Fakat aynı anda iki butonun basılı olması durumunu nasıl handle edeceğim bir yol bulamadım.Herhangi bir öneriniz var mı?

289 Görüntülenme

1 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-17846-1496738325.jpg
haciabdullahsarikaya
10.05.2016 - 04:55

Merhaba,

 

Global bir değişken oluşturmalısın öncelikle son tıklanma zamanını tutacak olan bir değişken olmalı.

Başlangıç değeri 0 olsun.

private int mLastClickTime=0; 

Daha sonra tıklandığı zaman 

//1sn den az ise şuanki zaman ile son tıklanma zamanı arasındaki fark önleme yapar  
if (SystemClock.elapsedRealtime() - mLastClickTime < 1000) {
        return;
          }
    mLastClickTime = SystemClock.elapsedRealtime(); // yeni son tıklanma zamanı artık bu 

//KOD KISMI

//yapılacak işlemleri buraya verebilirsin artık yani hangi butona
// tıkladıysa o işlemleri aynı anda yapabilir.


Umarım faydalı olur.

Kolay gelsin.

Cihad
10.05.2016 - 05:29
Öncelikle cevabın için teşekkürler. Şimdi anlattığın olayı anlamadım şuan. Kodların son halini yukarıda güncelledim. İstersen onun üzerinden bir anlatayım ; gördüğün gibi ileri butonuna basıldığı süre boyunca server a http:IpAdresi:80/forward/1 gibi veya geri butonuna basılı olduğu sürece http:IpAdresi:80/reverse/1 gibi parametre yollayıp bağlanabiliyorum. Mesela ileri butonuna basılıyken aynı zmanda sağa basılı olduğu zman yeni bir task oluşturup http:IpAdresi:80/forward/1/right/1 şeklinde parametre yollamam lazım. Verdiğin kodu yukarıda nasıl kullanacağım anlayamadım, biraz daha açıklar mısın ?