【问题标题】:Slide Up an image using EventMotion in Android在 Android 中使用 EventMotion 向上滑动图像
【发布时间】:2014-11-19 16:44:12
【问题描述】:

我正在尝试使用触摸侦听器在 android 中向上滑动布局。当用户触摸屏幕并将手指向上拖动屏幕时,我期望 MOTION_UP 应该被拦截。而 MOTION_DOWN 则相反。但是当我调试时,Up 和 Down 都会被调用。

当我使用动画向上拖动时,我试图向上滑动布局。我不明白我做错了什么。以前有人遇到过这种情况吗?任何提示都有帮助,谢谢。

这是我的代码:

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class MainActivity extends Activity implements AnimationListener,
        OnDragListener {

    // Animation
    private Animation animSlideUp;
    private ImageView img;
    private Rect rect;

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        img = (ImageView) findViewById(R.id.interstitialImg);
        img.setOnDragListener(this);
        img.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {

                if (event.getActionMasked() == MotionEvent.ACTION_UP) {
                    System.out.println("up");

                    rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v
                            .getBottom());
                    v.getHitRect(rect);
                    if (rect.contains(Math.round(v.getX() + event.getX()),
                            Math.round(v.getY() + event.getY()))) {
                        System.out.println("inside");
                        // Animation slide_up = AnimationUtils.loadAnimation(
                        // getApplicationContext(), R.anim.slide_up);
                        // img.startAnimation(slide_up);
                    } else {
                        // outside
                        System.out.println("outside");
                    }
                }
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    System.out.println("down");
                    // Construct a rect of the view's bounds
                    rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v
                            .getBottom());
                    return true;
                }
                if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    // if (!rect.contains(v.getLeft() + (int) event.getX(),
                    // v.getTop() + (int) event.getY())) {
                    // // User moved outside bounds
                    // System.out.println("moved outside bounds " + rect);
                    // }
                }
                return true;
            }
        });
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // check for zoom in animation
        if (animation == animSlideUp) {
            System.out.println("animation: " + animation);
            overridePendingTransition(R.anim.slide_up, R.anim.slide_up);
            finish();
        }

    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAnimationStart(Animation animation) {
        // TODO Auto-generated method stub
    }

    @SuppressLint("NewApi")
    @Override
    public boolean onDrag(View v, DragEvent e) {
        if (e.getAction() == DragEvent.ACTION_DROP) {
            System.out.println("action drop");
            View view = (View) e.getLocalState();
            ViewGroup from = (ViewGroup) view.getParent();
            from.removeView(view);
            RelativeLayout to = (RelativeLayout) v;
            to.addView(view);
            view.setVisibility(View.VISIBLE);
        }
        return true;
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        overridePendingTransition(R.anim.slide_up, R.anim.slide_up);
    }
}

【问题讨论】:

    标签: android ontouchlistener touch-event


    【解决方案1】:

    我希望当用户触摸屏幕并将手指向上拖动屏幕时应该拦截 MOTION_UP。

    呃,不。

    救援文档:

    public static final int ACTION_DOWN 按下手势已开始,该动作包含初始起始位置。

    将 ACTION_DOWN 视为用户交互的开始。 DOWN 不指示方向。粗略地说,它告诉您用户已将他/她的手指放在屏幕上。

    同样:

    public static final int ACTION_UP 按下的手势已完成,该动作包含最终释放位置以及自上次向下或移动事件以来的任何中间点。

    同样,UP 并不是您想象的那样。这意味着用户已经将他/她的手指从屏幕上抬起。

    现在让我们看看你的代码:

    rect = new Rect(v.getLeft(), v.getTop(), v.getRight(), v
                            .getBottom());
    v.getHitRect(rect);
    if (rect.contains(Math.round(v.getX() + event.getX()),
                            Math.round(v.getY() + event.getY()))) {
        System.out.println("inside");
        // Animation slide_up = AnimationUtils.loadAnimation(
        // getApplicationContext(), R.anim.slide_up);
        // img.startAnimation(slide_up);
    } else {
        // outside
        System.out.println("outside");
    }
    

    首先,getHitRect(Rect) 填充您作为参数提供的rect。因此,不需要使用v.getLeft(), v.getTop(), v.getRight(), v.getBottom() 对其进行初始化。

    其次,既然您在img 上设置了OnTouchListener,为什么需要检查event.getX()event.getY() 是否在视图范围内?事实上,你没有。因为,onTouch(...)如果用户在外面触摸不会触发

    第三,你可能不需要实现OnTouchListener 来做你想做的事.. 或者至少不是你现在的样子。例如,如果您要查找的只是用户是否有flinged 的视图UP 或DOWN,您可以依赖SimpleOnGestureListener。此问题的公认答案将向您展示如何使用它:Android: How to handle right to left swipe gestures

    那么这些 ACTION_DOWN 和 ACTION_UP 事件究竟是用来做什么的呢?好吧,当您需要更好的控制时,您可以使用它们:例如对用户输入做出反应立即。例如,您甚至无法负担使用SimpleOnGestureListener 在屏幕上移动视图的基本功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多