簡體   English   中英

如何計算Android中的按鈕按下時間?

[英]how to count button press time in android?

我正在開發一個項目,在該項目中,我想在不同的時間執行不同的任務,例如如果用戶在5毫秒后按下按鈕,則執行代碼;如果按下時間大於該時間,則需要進行差異

實際上是像在Facebook聊天中一樣創建聊天頭

問題是在ActionDown事件上我想打開或啟動我的應用程序

但是問題是,當用戶嘗試將聊天頭從一個位置重新分配到其他位置時,會觸發類似

 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);
}
  }

您可以使用View.OnTouchListener和兩個時間戳來存儲按鈕單擊的開始時間(ACTION_DOWN)和結束時間(ACTION_UP)。 然后,這兩個變量之間的差異(結束-開始)將告訴您按鈕單擊時間的持續時間,並且您可以根據自己的喜好執行代碼。

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();
        }
    }
});

自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;
            }
        });

使用此代碼,您可以移動聊天頭,事件將在500毫秒后開始。 無需使用OnClickListener,檢查位置是否不變,因此將其檢測為OnClickListener。
如果您想在捕獲某些動作時停止OnTouch事件,只需在ACTION_MOVE中放入“布爾變量”

如果您想要自定義持續時間,則必須自己進行編程。

但是,建議使用android內置函數。 有一個View.OnLongClickListenerView.OnClickListener來區分單擊視圖的兩個不同的持續時間。

我無法告訴您完整的確切代碼,但我可以在這里解釋流程,我從您的回答中得到的是,您需要在上次按下按鈕的基礎上執行不同的操作,這就是您可以執行的操作。 您需要兩個Date變量,即current和lastTime

  DateTimeUtils.getCurrentUTCFormattedDateTime()

將lastTime存儲在操作中的首選項中,從首選項中獲取最后一個時間,並獲取當前時間並將其減去,以獲得差值。

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

給您以秒為單位的時差,然后您決定要做什么。 希望對您有所幫助:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM