2

У меня есть два плейера с представлением, один вложен в другой. Чтобы получить правильное поведение (прокручивая плейер внутреннего вида без изменения внешнего), мне пришлось переопределить пейджеры внутреннего вида onTouchListener и поместить в него всю мою логику onTouch/onClick (получена идея от here).Получение эффекта пульсации/селектора без интерактивного макета

Работает отлично, но поскольку у меня нет onClickListener, я потерял эффект селектора. Когда я помещаю android:clickable="true" в элемент макета, я получаю эффект селектора, но поведение пейджеров в представлении неверно.

Есть ли способ добиться эффекта селектора из onTouchListener?

innerPager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 

       if (gestureDetector.onTouchEvent(event)) { 
        Log.d(DEBUG_LOG, "Single tap."); 
        return true; 
       } else if(event.getAction() == MotionEvent.ACTION_DOWN && v instanceof ViewGroup) { 
        ((ViewGroup) v).requestDisallowInterceptTouchEvent(true); 
       } 

       return false; 
      } 
     }); 

ответ

3

This решил это для меня. Просто добавьте следующий код к моему OnTouchListener и заменил вид на карту моим внутренним пейджером просмотра текущего элемента:

// Since the host view actually supports clicks, you can return false 
// from your touch listener and continue to receive events. 
myTextView.setOnTouchListener(new View.OnTouchListener() { 
@Override 
public boolean onTouch(View v, MotionEvent e) { 
    // Convert to card view coordinates. Assumes the host view is 
    // a direct child and the card view is not scrollable. 
    float x = e.getX() + v.getLeft(); 
    float y = e.getY() + v.getTop(); 

    // Simulate motion on the card view. 
    myCardView.drawableHotspotChanged(x, y); 

    // Simulate pressed state on the card view. 
    switch (e.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN: 
      myCardView.setPressed(true); 
      break; 
     case MotionEvent.ACTION_UP: 
     case MotionEvent.ACTION_CANCEL: 
      myCardView.setPressed(false); 
      break; 
    } 

    // Pass all events through to the host view. 
    return false; 
} 
}); 
Смежные вопросы