在Android中使用EventMotion向上滑动图像

时间:2014-11-19 16:44:13

标签: android ontouchlistener ontouchevent

我正在尝试使用触摸侦听器在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);
    }
}

1 个答案:

答案 0 :(得分:2)

  

我希望当用户触摸屏幕并将手指拖到屏幕上时,应截取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()初始化它。

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

第三,你可能不需要实现OnTouchListener来做你想做的事情......或者至少,不是你现在的样子。例如,如果您要查找的只是用户{UP}向下flinged,则您可以依赖SimpleOnGestureListener。此问题的接受答案将告诉您如何使用它:Android: How to handle right to left swipe gestures

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