【问题标题】:Immediately move view after creation创建后立即移动视图
【发布时间】:2017-11-12 21:05:48
【问题描述】:

我正在开发一个简单的纸牌游戏。 我有一个卡片叠,它只是一个图像视图。触摸时,我创建了一个自定义卡片对象(视图)。为了移动卡片,我重写了 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;
}

【问题讨论】:

  • 你试过我的建议了吗?成功了吗?

标签: android view move touch-event


【解决方案1】:

你可以试试这样的。

创建一个具有整个 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;
}

【讨论】:

  • 您能否再解释一下您的方法?问题是 Card 对象根本没有收到任何 touchEvents,因为它只是在屏幕上创建和添加的。抬起手指并再次触摸时触发第一次触摸事件
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多