Android: Как позвонить на Touch только после onLongClick? - PullRequest
5 голосов
/ 29 марта 2011

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

Ответы [ 3 ]

9 голосов
/ 29 марта 2011

Зарегистрируйте 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;
   }
}
2 голосов
/ 03 июня 2012

Вы можете создать два 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;
        }
    });
2 голосов
/ 12 марта 2012

Основная идея 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);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...