след като се борих толкова много с слушателя на жестове и неговите методи - onFling, onLongPress и т.н., реших да напиша свой собствен, идеята ми не е толкова различна от записването на времето на всяко натискане, има подобно решение на SO.
Разбирам какъв беше проблемът ми: ако използвате onTouch - всичките ви докосвания се прихващат и интерпретират чрез него, но simpleGestureListener обработва собствените си събития чрез onDown, така че onTouch никога не се извиква; в тази ситуация трябваше да напиша доста елементарна логика:
- на ACTION_DOWN, стартирайте таймера за обратно отброяване за около 300 милисекунди - след като отметне около 290, проверете отново дали събитието все още е в действие
- ако събитието е действие надолу - по същество е продължително натискане и изображението ми реагира съответно - става по-голямо, ако не - просто не правете нищо
- при ACTION_UP: проверете дали е било дълго натискане, ако е било - потребителят е отменил задържането си и изображението става по-малко, но в противен случай - беше бързо натискане!
Код по-долу:
public class DoubleTapWorking1 extends Activity implements View.OnTouchListener {
ImageView sample;
boolean still_down ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sample = (ImageView) findViewById(R.id.sample);
sample.setOnTouchListener(this);
still_down = false ;
}
@Override
public boolean onTouch(final View v,final MotionEvent e) {
switch (e.getAction()){
case MotionEvent.ACTION_DOWN:
still_down =false;
CountDownTimer timer = new CountDownTimer(500,10){
@Override
public void onTick(long millisUntilFinished) {
if((int)millisUntilFinished < 100 && e.getAction() == MotionEvent.ACTION_DOWN){
still_down = true ;
}
}
@Override
public void onFinish() {
if( still_down){
//code to make imageView larger
}
}
}.start();
break ;
case MotionEvent.ACTION_UP:
if(still_down) {
//your code to make image smaller
}
else{
action_on_single_tap(v);
}
break ;
}
return true;
}
private void action_on_single_tap(final View v){
//your code to do with image on single tap - move somewhere else, make invisible etc.
}
}
РЕДАКТИРАНЕ: друго по-добро решение.
Имах проблеми с таймера за обратно отброяване - не отброяваше до края по някаква причина. Приложих някаква стара идея - разграничете дълго щракване и щракване с помощта на 2 слушателя - LongClickListener, ClickListener. Това работи много по-добре от решението по-горе.
Код по-долу:
private class Gestures_future implements View.OnClickListener, View.OnLongClickListener{
int margin_long_press_x1;
int margin_long_press_y1;
int margin_long_press_x2;
int margin_long_press_y2;
RelativeLayout.LayoutParams params_generic = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
public Gestures_future(final int margin_long_press_x1,final int margin_long_press_y1,final int margin_long_press_x2,final int margin_long_press_y2
){
params_generic.leftMargin = 30;
params_generic.topMargin = 40;
this.margin_long_press_x1 = margin_long_press_x1;
this.margin_long_press_y1 = margin_long_press_y1;
this.margin_long_press_x2 = margin_long_press_x2;
this.margin_long_press_y2 = margin_long_press_y2;
}
@Override
public void onClick(View v) {
Log.wtf("x", "on click!");
TextView d = (TextView)v;
int current_id = v.getId();
String answer_content = d.getText().toString();
if (answers_player1_ids.contains(current_id)) {
if (Battlefield.getStateOfAnswer1PlacePlayer1() == false) {
d.setText("");
Battlefield.answer1_place_busy_player1 = true;
answer_place1_player1.setTextSize(20);
answer_place1_player1.setText(answer_content);
upper_layout_answer_counter++;
} else if (Battlefield.getStateOfAnswer2PlacePlayer1() == false) {
d.setText("");
Battlefield.answer2_place_busy_player1 = true;
answer_place2_player1.setTextSize(20);
answer_place2_player1.setText(answer_content);
upper_layout_answer_counter++;
if (upper_layout_answer_counter == 2) {
upper_layout_answer_counter = 0;
see_answers1.performClick();
}
}
}
else if (answers_player2_ids.contains(current_id)) {
if (Battlefield.getStateOfAnswer1Place() == false){
d.setText("");
Battlefield.answer1_place_busy = true;
answer_place1.setTextSize(20);
answer_place1.setText(answer_content);
lower_layout_answer_counter++;
} else if (Battlefield.getStateOfAnswer2Place() == false) {
d.setText("");
Battlefield.answer2_place_busy = true;
answer_place2.setTextSize(20);
answer_place2.setText(answer_content);
lower_layout_answer_counter++;
if (lower_layout_answer_counter == 2) {
lower_layout_answer_counter = 0;
see_answers2.performClick();
}
}
}
}
@Override
public boolean onLongClick(View v){
Log.wtf("x", "on long click!");
final TextView d = (TextView)v;
Log.wtf("x", d.getText().toString() + " long clicked!" );
d.setTextSize(30);
RelativeLayout.LayoutParams x = new RelativeLayout.LayoutParams(350, 500);
x.setMargins(margin_long_press_x1, margin_long_press_y1, 0, 0);
d.setLayoutParams(x);
d.requestLayout();
new CountDownTimer(3000,500){
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
RelativeLayout.LayoutParams t1 = new RelativeLayout.LayoutParams(130, 170);
t1.setMargins(margin_long_press_x2, margin_long_press_y2, 0, 0);
d.setTextSize(10);
d.setLayoutParams(t1);
d.requestLayout();
}
}.start();
return true;
}
}
Решението по-горе работи добре за мен.
person
ERJAN
schedule
09.10.2015