使用触摸事件移动imageview

Alv*_*ian 8 layout android touch imageview

我只想要一个简单的事情.我有一个imageview,我可以用触摸移动它

这是我的代码,我很抱歉,如果这是错的,因为我只是自己尝试过

img.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        // TODO Auto-generated method stub
        if (arg1.getAction() == MotionEvent.ACTION_DOWN) {
            status = StartDrag;
        } else if (arg1.getAction() == MotionEvent.ACTION_UP) {
            status = StopDrag;
        }
        return false;
    }
});

@Override
public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub

    if (status == StartDrag) {
        params.leftMargin = (int) event.getX();
        params.topMargin = (int) event.getY();
        img.setLayoutParams(params);
    }
    return super.onTouchEvent(event);
}
Run Code Online (Sandbox Code Playgroud)

你能告诉我正确的方法吗?

Apu*_*iri 20

onTouch用于拖动视图的事件非常适合于子视图RelativeLayoutFrameLayout.

这是一个例子:

@Override
public boolean onTouch(View v, MotionEvent event){
        switch(event.getAction())
        {
            case MotionEvent.ACTION_DOWN :
            {
                x = event.getX();
                                    y = event.getY();
                dx = x-myView.getX();
                dy = y-myView.getY();
            }
            break;
            case MotionEvent.ACTION_MOVE :
            {
                myView.setX(event.getX()-dx);
                myView.setY(event.getY()-dy);
            }
            break;
            case MotionEvent.ACTION_UP :
            {
                //your stuff
            }
        return true;
}
Run Code Online (Sandbox Code Playgroud)

现在什么dxdy做的是,在ACTION_DOWN它记录在您对视图感动,并得到该视图的左(x)的差异和顶部(Y),期间维持这些利润ACTION_MOVE.

true如果您正在参加,则必须返回触摸事件.

更新:对于API 8

在API 8的情况下,The getX()getY()方法没有给出正确的结果,因此您可以使用的是getRawX()getRawY()方法.

示例:

RelativeLayout.LayoutParams parms;
LinearLayout.LayoutParams par;
float dx=0,dy=0,x=0,y=0;

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(event.getAction())
    {
        case MotionEvent.ACTION_DOWN :
        {
            parms = (LayoutParams) myView.getLayoutParams();
            par = (LinearLayout.LayoutParams) getWindow().findViewById(Window.ID_ANDROID_CONTENT).getLayoutParams();
            dx = event.getRawX() - parms.leftMargin;
            dy = event.getRawY() - parms.topMargin;
        }
        break;
        case MotionEvent.ACTION_MOVE :
        {
            x = event.getRawX();
            y = event.getRawY();
            parms.leftMargin = (int) (x-dx);
            parms.topMargin = (int) (y - dy);
            myView.setLayoutParams(parms);
        }
        break;
        case MotionEvent.ACTION_UP :
        {

        }
        break;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 我测试了这段代码.ImageView在移动过程中闪烁,位置非常不准确 (2认同)

Hir*_*tel 20

我这样做了:

private float xCoOrdinate, yCoOrdinate;
Run Code Online (Sandbox Code Playgroud)

onCreate():

ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getActionMasked()) {
            case MotionEvent.ACTION_DOWN:
                xCoOrdinate = view.getX() - event.getRawX();
                yCoOrdinate = view.getY() - event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                view.animate().x(event.getRawX() + xCoOrdinate).y(event.getRawY() + yCoOrdinate).setDuration(0).start();
                break;
            default:
                return false;
            }
       return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

完成

  • 如何仅在视图不会越界的边界内移动 (2认同)