2015-12-31 3 views
2

Я создал службу, которая отображает пользовательский View внутри настраиваемого LinearLayout. Сервис работает нормально, и на экране отображается View, но я не могу получить View или LinearLayout для получения любых событий касания (я просто хочу, чтобы один из них получал события касания, мне все равно). Это то, что у меня есть:Android onTouchEvent для пользовательского представления

MyLayout.java

public class MyLayout extends LinearLayout { 

    public MyLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public MyLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyLayout(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     onTouchEvent(ev); 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Toast.makeText(this.getContext(), "Touched layout", Toast.LENGTH_SHORT).show(); 
     Log.d("TOUCH", "Touched layout"); 
     return true; 
    } 
} 

MyView.java

public class MyViewextends View{ 

    public MyView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public MyView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyView(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     Toast.makeText(this.getContext(), "Touched View", Toast.LENGTH_SHORT).show(); 
     Log.d("TOUCH", "Touched View"); 
     return true; 
    } 
} 

ответ

4

Из SDK Документация:

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

Необходимо вернуть true, когда событие ACTION_DOWN активировано, чтобы указать, что вас интересуют последующие вызовы, относящиеся к этому же событию.

Если вам нужно написать метод onTouchEvent для Android в классе View, вот пример исходного кода (код шаблона/скелета), который показывает, как реализовать этот метод, в том числе, как использовать MotionEvent в методе и как получить й и у расположения сенсорного события:

public boolean onTouchEvent(MotionEvent event) { 

    int eventAction = event.getAction(); 

    // you may need the x/y location 
    int x = (int)event.getX(); 
    int y = (int)event.getY(); 

    // put your code in here to handle the event 
    switch (eventAction) { 
     case MotionEvent.ACTION_DOWN: 
      break; 
     case MotionEvent.ACTION_UP: 
      break; 
     case MotionEvent.ACTION_MOVE: 
      break; 
    } 

    // tell the View to redraw the Canvas 
    invalidate(); 

    // tell the View that we handled the event 
    return true; 

} 

Я прокомментировал код, и я думаю, что это показывает наиболее распространенный способ используется этот метод, поэтому я не буду беспокоить, чтобы добавить какие-либо объяснения здесь. Я показал, как получить местоположение x и y события касания, потому что вы обычно хотите проверить, где произошло событие.

Итак, если вы хотите увидеть пример метода Android onTouchEvent (в классе View), я надеюсь, что этот пример полезен.

исх: http://alvinalexander.com/android/android-ontouchevent-example-method-view-class

+0

Спасибо за ответ, я попытался это, но это не сработало. Ни «LinearLayout», ни «View» не регистрируют события касания. – yawers

+1

в xml set android: clickable = "true" –

+0

Я добавил это в xml для 'MyLayout' и для' MyView', но он до сих пор не регистрирует события касания. – yawers

1

Ваш взгляд не получает каких-либо событий прикосновения, потому что ваш заказ LinearLayout блокирует события, как он не отправляет события в его дочерних Views.

Я не совсем уверен, почему вы переопределение методов onInterceptTouchEvent() и onTouchEvent() в вашем MyLayout, но если вы не требовать от них, я хотел бы предложить, чтобы удалить их обоих, поэтому макет имеет свое поведение по умолчанию в отношении обработки сенсорных событий ,

Если вы действительно нуждаетесь в них, возможно, придется вызывать super методы каждого:

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return super.onInterceptTouchEvent(ev); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    Toast.makeText(this.getContext(), "Touched layout", Toast.LENGTH_SHORT).show(); 
    Log.d("TOUCH", "Touched layout"); 
    return super.onTouchEvent(event); 
} 
+0

Спасибо за ответ. Если я могу получить, чтобы мой LinearLayout получал события, которые хороши, но тост и журнал не отображаются, когда я прикасаюсь к нему. Я попытался внести изменения, которые вы предложили, но это все еще не сработало. – yawers

Смежные вопросы