Android: Как вызвать onTouch только после onLongClick?

У меня есть изображение, которое можно перемещать и масштабировать с жестким жестом. Все это делается внутри onTouch() . Я хочу ограничить это и сделать его подвижным (и масштабируемым) только после того, как пользователь сделал длинный клик на изображении. Как мне это сделать?

Зарегистрируйте LongCLickListener . Если распознан длинный клик, установите флаг в значение true.

В методе OnTouch допускается масштабирование и перемещение, только если для флага установлено значение true. После перемещения и масштабирования снова установите флаг в значение false.

Вот несколько псевдокодов:

 public class MyActivity extends Activity { private boolean longClick = false; public boolean onTouch(View v, MotionEvent event) { if (longClick) { // do scaling and moving ... longClick = false; } return false; } public boolean onLongClick(View v) { longClick = true; return false; } } 

Основная идея Roflcoptr правильная, но даже если вы переместите указатель без длинного щелчка, вызывается onLongClick. Чтобы этого избежать, вы можете использовать этот код:

 final int NONE=0; final int DRAG=1; final int LONG_PRESS=2; int mode=NONE; PointF start=new PointF(); public boolean onLongClick(View v) { if(mode==NONE) mode=LONG_PRESS; //it helps to avoid unwanted onLongClick return false; } public boolean onTouch(View v, MotionEvent event){ switch(event.getAction() & MotionEvent.ACTION_MASK){ case MotionEvent.ACTION_DOWN: start.set(event.getX(),event.getY()); //point where we started from break; case MotionEvent.ACTION_UP: mode=NONE; break; case MotionEvent.ACTION_MOVE: if(mode==NONE && getDistance(event.getX(),event.getY(),start.x,start.y)>30d) mode=DRAG; //if we really move our pointer, then start the drag mode. //it helps to avoid unwanted moving if(mode==DRAG){ //do your stuff } if(mode==LONG_PRESS){ //do your stuff } break; } } //returns distance between 2 points private double getDistance(float x1,float y1,float x2,float y2){ float dx=Math.abs(x1-x2); float dy=Math.abs(y1-y2); return Math.sqrt(dx*dx+dy*dy); } 

Надеюсь, это поможет кому-то)

Вы можете создать два View.ontouchlistener для работы и один пустой, и установить прослушиватель для просмотра только на onlongpress

  LinearLayout.LayoutParams longpressLP = new LinearLayout.LayoutParams(100,100); LinearLayout longpress = new LinearLayout(this); longpress.setBackgroundColor(Color.GREEN); mainlayout.addView(longpress,longpressLP); final View.OnTouchListener buttontouch=new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub if(event.getAction()==MotionEvent.ACTION_DOWN) v.setOnTouchListener(buttontouchnone); else Toast.makeText(getApplicationContext(), "Touched", Toast.LENGTH_SHORT).show(); return false; } }; final View.OnTouchListener buttontouchnone=new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "None Touch", Toast.LENGTH_SHORT).show(); return false; } }; longpress.setOnTouchListener(buttontouch); longpress.setOnLongClickListener(new View.OnLongClickListener() { public boolean onLongClick(View v) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "LongClick", Toast.LENGTH_SHORT).show(); v.setOnTouchListener(buttontouch); return true; } });