我有一个ViewFlipper,它包含一个ImageView。我希望能够滑动以更改图像/视图,然后单击图像以播放声音。
我有一个GestureDetector正在处理OnFling以更改视图。我试图将一个onClickListener放到imageview上,但它已经停止了OnFling的工作。
最后,我在我的GestureDetector中添加了一个onSingleTapConfirmed。这很有效,但是它在Activity中的任何地方都注册了一个单击而不仅仅是ImageView。
有人可以建议如何缩小onSingleTapConfirmed以适应Imageview吗?
到目前为止,这是我的代码:
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Log.v("Swipe", "Right to Left");
viewFlipper.setInAnimation(slideLeftIn);
viewFlipper.setOutAnimation(slideLeftOut);
viewFlipper.addView(nextImage(true));
viewFlipper.showNext();
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Log.v("Swipe", "Left to Right");
viewFlipper.setInAnimation(slideRightIn);
viewFlipper.setOutAnimation(slideRightOut);
viewFlipper.addView(nextImage(false));
viewFlipper.showNext();
}
} catch (Exception e) {
// nothing
}
return false;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e)
{
// TODO Auto-generated method stub
Log.v("SingleTap", "OnSingleTapConfirmed Run");
return super.onSingleTapConfirmed(e);
}
}
private View nextImage(boolean righttoleft) {
ImageView imgv1 = new ImageView(this);
if(righttoleft == true)
{
Uri image = Uri.parse("android.resource://com.owentech.brainybaby/drawable/" + variables.letters[variables.currentpos]);
imgv1.setImageURI(image);
imgv1.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
return imgv1;
}
答案 0 :(得分:3)
过去我遇到过这个问题。
也许您可以尝试通过将OnTouchListener设置为ViewFlipper来实现单击,因此,ViewFlipper将是唯一的触摸事件接收器。然后在onTouch函数中编写播放声音代码。最后,为了保持onFling正常工作,将onTouch函数的返回值设置为false。
viewFlipper.setOnTouchListener(new OnTouchListener()
{
@Override
public boolean onTouch(View view, MotionEvent e) {
// TODO Auto-generated method stub
switch(e.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
//put the playing sound code here.
break;
}
return false; //means that the listener dosen't consume the event
}
}
);
这只是解决此问题的简单解决方案。如果您想要实现更复杂的功能,例如当手指在屏幕上滑动以改变视图时避免声音播放,则必须花费更多精力来区分手势,例如:计算ACTION_DOWN事件和ACTION_UP事件之间的时间,并在声音小于300ms时播放声音。
我希望这会对你有所帮助。 :)