Android可拖动的ImageView

5
我有一个ImageView,我想在用户触摸并移动时重新定位它的Y轴。我可以重新定位它,但当我移动它时,它会闪烁并且不够平滑。它也不能完美地跟随我的手指。有没有办法消除闪烁并改善定位?我正在使用标准的ImageView。
这是我在OnTouch方法中所拥有的:
imageView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN: {
                    final float y = event.getY();

                    // Remember where we started
                    mLastTouchY = y;
                }
                    break;

                case MotionEvent.ACTION_MOVE:
                    final float y = event.getY();

                    // Calculate the distance moved
                    final float dy = y - mLastTouchY;

                    // Move the object
                    mPosY += dy;

                    // Remember this touch position for the next move event
                    mLastTouchY = y;

                    imageView.setTranslationY(mPosY);
                    return true;
            }
            return false;
        }
    });

检查一下,这对我来说很有效 http://www.vogella.com/tutorials/AndroidDragAndDrop/article.html - Droidman
我已经尝试过这个,但它并没有按照我的意愿执行。我只想沿着Y轴移动ImageView,而不是把它拖来拖去的。 - user3925833
2个回答

2

您想使图像仅沿Y轴移动,而不是任意位置。如果这是您的问题,这就是答案。

1.从此处(https://android-drag-and-drop-basic.googlecode.com/archive/942b651010cc6cad4376df1651123982c1a7474f.zip)下载项目。

2.在DragAndDropBasicActivity类中注释掉这些行,就像我在这里所做的一样。

public boolean onTouch(View v, MotionEvent event) {
    boolean eventConsumed = true;
    int x = (int)event.getX();
    int y = (int)event.getY();

    int action = event.getAction();
    if (action == MotionEvent.ACTION_DOWN) {
        if (v == letterView) {
            dragging = true;
            eventConsumed = false;
        }
    } else if (action == MotionEvent.ACTION_UP) {

//          if (dragging) {
//              emptyLetterView.getHitRect(hitRect);
//              if (hitRect.contains(x, y))
//                  setSameAbsoluteLocation(letterView, emptyLetterView);
//          }
        dragging = false;
        eventConsumed = false;

    } else if (action == MotionEvent.ACTION_MOVE) {
        if (v != letterView) {
            if (dragging) {
                setAbsoluteLocationCentered(letterView, x, y);
            }
        }
    }

    return eventConsumed;

}


private void setSameAbsoluteLocation(View v1, View v2) {
    AbsoluteLayout.LayoutParams alp2 = (AbsoluteLayout.LayoutParams) v2.getLayoutParams();
    setAbsoluteLocation(v1, alp2.x, alp2.y);
}

//This method helps the image to keep center of your touch point
private void setAbsoluteLocationCentered(View v, int x, int y) {
    setAbsoluteLocation(v, x - v.getWidth() / 2, y - v.getHeight() / 2);
}

// this method help to place the image in exact position when your finger moved up (that is Action UP)
private void setAbsoluteLocation(View v, int x, int y) {
    AbsoluteLayout.LayoutParams alp = (AbsoluteLayout.LayoutParams) v.getLayoutParams();

// don't forget to comment this line

    //alp.x = x;
    alp.y = y;
    v.setLayoutParams(alp);
}

0

试一下这个

chatHead.setOnTouchListener(new View.OnTouchListener() {
        private int initialX;
        private int initialY;
        private float initialTouchX;
        private float initialTouchY;
        private LayoutParams params = (LayoutParams) chatHead
                .getLayoutParams();

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                initialX = params.x;
                initialY = params.y;
                initialTouchX = event.getRawX();
                initialTouchY = event.getRawY();
                return true;
            case MotionEvent.ACTION_UP:
                return true;
            case MotionEvent.ACTION_MOVE:
                params.x = initialX
                        + (int) (event.getRawX() - initialTouchX);
                params.y = initialY
                        + (int) (event.getRawY() - initialTouchY);
                windowManager.updateViewLayout(chatHead, params);
                return true;
            }
            return false;
        }
    });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接