我正在使用自己的GestureDetector类来检测左侧的onFling事件。我看到的所有内容在我的代码中看起来都不错但没有任何反应......
我需要在我的切换按钮之外添加的功能,以打开|关闭我的片段中的导航视图。切换调用我的AnimationLayout类中的方法,如下所示:
public void toggleSidebar()
{
if (mContent.getAnimation() != null)
{
return;
}
if (mOpened)
{
/* opened, make close animation */
mAnimation = new TranslateAnimation(0, -mSidebarWidth, 0, 0);
mAnimation.setAnimationListener(mCloseListener);
} else
{
/* not opened, make open animation */
mAnimation = new TranslateAnimation(0, mSidebarWidth, 0, 0);
mAnimation.setAnimationListener(mOpenListener);
}
mAnimation.setDuration(DURATION);
mAnimation.setFillAfter(true);
mAnimation.setFillEnabled(true);
mContent.startAnimation(mAnimation);
}
和...
public void openSidebar()
{
if (!mOpened)
{
toggleSidebar();
}
}
public void closeSidebar()
{
if (mOpened)
{
toggleSidebar();
}
}
在我的主要活动中,onFling()调用toggle子:
public static AnimationLayout mLayout;
// these constants are used for onFling
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;
private GestureDetector gestureDetector;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mLayout = (AnimationLayout) findViewById(R.id.animation_layout);
gestureDetector = new GestureDetector(this.getApplicationContext(), new MyGestureDetector());
// Set the touch listener for the main view to be our custom gesture
// listener
mLayout.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (gestureDetector.onTouchEvent(event)) {
return true;
}
return false;
}
});
}
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
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) {
Toast.makeText(getApplicationContext(), "right_left", Toast.LENGTH_LONG).show();
Log.i("MyGestureDetector", "R2L!");
mLayout.closeSidebar();
// left to right swipe
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Toast.makeText(getApplicationContext(), "left_right", Toast.LENGTH_LONG).show();
Log.i("MyGestureDetector", "L2R!");
mLayout.openSidebar();
}
return false;
}
// Return true from onDown for the onFling event to register
@Override
public boolean onDown(MotionEvent e) {
return true;
}
}
此按钮工作正常:
...
case R.id.navToggleBtn : {
mLayout.toggleSidebar();
}
...
答案 0 :(得分:1)
我认为一个原因是Gesture在onFling
上工作,条件不满意
我实现了一个OntouchListener试试这个
yourView.setOnTouchListner(onThumbTouch );
OnTouchListener onThumbTouch = new OnTouchListener()
{
float previouspoint = 0 ;
float startPoint=0;
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch(v.getId())
{
case R.id.tvDetailsalaujairiyat: // Give your R.id.sample ...
{
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
{
startPoint=event.getX();
System.out.println("Action down,..."+event.getX());
}
break;
case MotionEvent.ACTION_MOVE:
{
}break;
case MotionEvent.ACTION_CANCEL:
{
previouspoint=event.getX();
if(previouspoint > startPoint){
//Right side swape
}else{
// Left side swape
}
}break;
}
break;
}
}
return true;
}
};
答案 1 :(得分:0)
我赞同@Devunwired,如上所述:
如果布局包含可触摸的子项,则可能是 从他们的父母(你的布局)窃取事件。
所以我补充道:
View swipeView = (View) findViewById(R.id.animation_layout_content);
swipeView .setOnTouchListener(new View.OnTouchListener() {...});
现在效果非常好。