다음 코드 단편을 기반으로, onFling 제스처가 Button의 GridView에 대해 인식되지 않는 이유가 궁금했습니다 (개인적인 이유로 Button을 다른보기 대신 사용함) :onFling 제스처가 Button의 GridView에 대해 인식되지 않습니다.
가 여기 내 MainActivity의 :
public class MainActivity extends AppCompatActivity {
private GridView grid;
GestureDetector gDetector;
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
grid = (GridView)findViewById(R.id.grid);
// 4X4 grid.
grid.setNumColumns(4);
ArrayList<Button> mButtons = new ArrayList<Button>();
Button button = null;
for (int i = 0; i < 16; i++) {
button = new Button(this);
button.setText(i + "");
mButtons.add(button);
}
grid.setAdapter(new CustomAdapter(this, mButtons));
gDetector = new GestureDetector(this, new SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent event) {
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
final int position = grid.pointToPosition(Math.round(e1.getX()), Math.round(e1.getY()));
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
if (Math.abs(e1.getX() - e2.getX()) > SWIPE_MAX_OFF_PATH
|| Math.abs(velocityY) < SWIPE_THRESHOLD_VELOCITY) {
return false;
}
if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE) {
Toast.makeText(MainActivity.this, "top at index " + position, Toast.LENGTH_SHORT).show();
} else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE) {
Toast.makeText(MainActivity.this, "bottom at index " + position, Toast.LENGTH_SHORT).show();
}
} else {
if (Math.abs(velocityX) < SWIPE_THRESHOLD_VELOCITY) {
return false;
}
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE) {
Toast.makeText(MainActivity.this, "left at index " + position, Toast.LENGTH_SHORT).show();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) {
Toast.makeText(MainActivity.this, "right at index " + position, Toast.LENGTH_SHORT).show();
}
}
return super.onFling(e1, e2, velocityX, velocityY);
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return gDetector.onTouchEvent(event);
}
... 여기 내 CustomAdapter입니다 :
public class CustomAdapter extends BaseAdapter {
private ArrayList<Button> mButtons = null;
private Context ctx;
public CustomAdapter(Context ctx, ArrayList<Button> button) {
this.ctx = ctx;
this.mButtons = button;
}
@Override
public int getCount() {
return mButtons.size();
}
@Override
public Object getItem(int position) {return (Object) mButtons.get(position);}
@Override
public long getItemId(int position) {
// Position and id are synonymous.
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Button button;
// Assigns a view to convertView should it be null, otherwise, casts convertView to the
// correct View type.
if (convertView == null) {
button = mButtons.get(position);
} else {
button = (Button) convertView;
}
return button;
}
}
... 그리고 분명히 슬쩍는 onFling 만에 인정받을 것 GridView가 wrap_content로 설정되어있을 때 화면의 아래쪽 절반, GridView가 match_parent로 설정된 경우 스 와이프가 전혀 작동하지 않습니다.
이 많은 감사 : 여기에 다음과 같이 슬쩍 만 동봉 광장에 작업에 wrap_content로 설정 그리드입니다.
버튼이 터치 이벤트를 소비했기 때문에 버튼에서 손가락을 떼었을 때 'onTouchEvent()'이 (가) 호출되지 않았습니다. 상위 뷰 클래스 (예 : gridview)를 재정의하고 onInterceptTouchEvent()를 사용하여 터치 이벤트를 가로 채기 위해 관심을 표시해야 할 수 있습니다. http://stackoverflow.com/questions/9181529/detect-fling-gesture-over-clickable-items – headuck
@headuck 댓글을 주셔서 감사합니다. 비록 당신이 위의 스 니펫을 기반으로 GridView를 재정의 할 샘플 코드를 제게 제공 할 수 있습니까? 나는 그것을 크게 고맙게 생각한다. – DaveNOTDavid