创建后立即移动视图

时间:2017-11-12 21:05:48

标签: android view move ontouchevent

我正在开发一款简单的纸牌游戏。 我有一个卡片堆栈,它只是一个imageview。在触摸时我创建一个自定义卡对象(视图)。为了移动卡片,我已经覆盖了Card对象中的onTouchEvent方法。

问题是,如何在点击堆叠时立即移动卡片来创建它?目前我首先需要点击(创建卡片),抬起手指然后再次点击以移动卡片。

我已经看过How to programmatically trigger the touch event in android?,但这只会触发一个触摸事件片刻。

  

活动

public void createCard(View v) {
    if (mCardCounter < 4) {
        Card card = new Card(this);
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));
        layoutParams.setMargins(30, 30, 0, 0);
        card.setLayoutParams(layoutParams);
        mRootFrameLayout.addView(card);
        mCardCounter++;
    }
  

@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            dX = this.getX() - event.getRawX();
            dY = this.getY() - event.getRawY();
            break;
        case MotionEvent.ACTION_MOVE:
            this.animate()
                    .x(event.getRawX() + dX)
                    .y(event.getRawY() + dY)
                    .setDuration(0)
                    .start();
            }
            break;
        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情。

创建一个具有整个Activity的范围的布尔值。

boolean isActionDown = false;

然后在onTouchEvent方法

@Override
public boolean onTouchEvent(MotionEvent event) {
    super.onTouchEvent(event);

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            if(!isActionDown){
                isActionDown = true;
                dX = this.getX() - event.getRawX();
                dY = this.getY() - event.getRawY();
            }
            else{
                this.animate()
                    .x(event.getRawX() + dX)
                    .y(event.getRawY() + dY)
                    .setDuration(0)
                    .start();
                }
            }
            break;
        case MotionEvent.ACTION_UP:
            isActionDown = false;
            break;
    }
    return true;
}