Как рассчитать время нажатия кнопки в Android?
Я занимаюсь разработкой проекта, в котором я хочу задание diffrent на разное время, например, если пользователь нажимает кнопку через 5 миллисекунд, затем выполняется код, а если время нажатия больше, чем разность
на самом деле они создают чат, как в чате Facebook
проблема в том, что на ActionDown Event я хочу открыть или запустить мое приложение
но проблема в том, что когда пользователь пытается перераспределить чат-чат из одного места в другое, событие запускается как
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);
}
}
4 ответа
Я сталкивался с этим 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, когда перехватываете какое-либо действие, просто поместите 'boolean variable' в ACTION_MOVE
Вы можете использовать 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();
}
}
});
Если вы хотите иметь пользовательские длительности, вы должны запрограммировать его самостоятельно.
Однако рекомендуется использовать встроенные функции Android. Есть View.OnLongClickListener и View.OnClickListener, чтобы отличать две разные длительности для нажатия на представления.
Я не могу сказать вам полный точный код, но я могу объяснить поток здесь, что я получаю из вашего ответа, что вы должны выполнять различные действия в зависимости от последнего нажатия кнопки, вот как вы можете это сделать. Вам нужны две переменные даты, то есть current и lastTime
DateTimeUtils.getCurrentUTCFormattedDateTime()
сохранить lastTime в настройках на action down, извлечь последний раз из настроек и получить текущее время и вычесть его, чтобы получить разницу.
long difference = (current.getTime() - lastSaved.getTime()) / 1000;
даст вам разницу во времени в секундах, затем вы решите, что делать. Надеюсь, это поможет:)