如何在Android模拟器上平滑地移动图像视图以配合用户手指移动

11

第一次在屏幕上移动ImageView时一切都很好,但第二次ImageView移动不正确。

这是我到目前为止所做的。

img.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        int eid = event.getAction();
        switch (eid) {
            case MotionEvent.ACTION_MOVE:
                FrameLayout.LayoutParams mParams = (FrameLayout.LayoutParams) img.getLayoutParams();
                int x = (int) event.getRawX();
                int y = (int) event.getRawY();
                mParams.leftMargin = x-50;
                mParams.topMargin = y-50; 
                img.setLayoutParams(mParams);
                break;
            case MotionEvent.ACTION_DOWN:
                x1=img.getX();
                y1=img.getY(); 
                break;                         
            case MotionEvent.ACTION_UP:
                img.setX(x1);
                img.setY(y1);                          
                break; 
            default:
                break;
            }
        return true;
    }
});

这是一个例子 http://thegeekyland.blogspot.com/2015/12/android-animations-explained.html - Arlind Hajredinaj
一个很好的例子就是这篇文章。它还处理了比例手势和多点触控 https://android-developers.googleblog.com/2010/06/making-sense-of-multitouch.html - Saran Sankaran
2个回答

43
以下内容适用于我。
我看到你正在使用 img.getX()img.getY(), 所以我假设你正在使用API Level 11或以上。
我假设你的 imgImageView 的实例。 (虽然在 ImageView 中使用 FrameLayout.LayoutParams 很奇怪...)
img.setOnTouchListener(new OnTouchListener()
{
    PointF DownPT = new PointF(); // Record Mouse Position When Pressed Down
    PointF StartPT = new PointF(); // Record Start Position of 'img'
    
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        switch (event.getAction())
        {
            case MotionEvent.ACTION_MOVE :
                img.setX((int)(StartPT.x + event.getX() - DownPT.x));
                img.setY((int)(StartPT.y + event.getY() - DownPT.y));
                StartPT.set( img.getX(), img.getY() );
                break;
            case MotionEvent.ACTION_DOWN :
                DownPT.set( event.getX(), event.getY() );
                StartPT.set( img.getX(), img.getY() );
                break;
            case MotionEvent.ACTION_UP :
                // Nothing have to do
                break;
            default :
                break;
        }
        return true;
    }
});

===========================================================
====================== [2013/05/15 添加] =======================
===========================================================

这里介绍的新对象是 PointF。 请使用以下代码导入 PointF 对象:

import android.graphics.PointF;

实际上,这只是一个记录浮点数x和浮点数y的对象。 如果您确实无法导入该对象,请自己编写如下所示的代码:

public class PointF
{
  public float x = 0;
  public float y = 0;
  public PointF(){};
  public PointF( float _x, float _y ){ x = _x; y = _y; }
  public void set( float _x, float _y ){ x = _x; y = _y; }

}

PointF DownPT = new PointF(); // 记录鼠标按下时的位置PointF StartPT = new PointF(); // 记录 'img' 的起始位置请告诉我如何声明这些对象。 - user2380151
@user2380151: 抱歉,是我不好。请使用以下代码导入“PointF”对象:import android.graphics.PointF;实际上,这只是一个记录浮点数x和y的对象。如果您真的无法导入该对象,请自己编写一个类似于以下内容的类:public class PointF { public float x = 0; public float y = 0; public PointF(){}; public PointF( float _x, float _y ){ x = _x; y = _y; } } - IEBasara
不错的解决方案,但是我该如何防止图像进入虚拟按钮区域下面。这会导致我的图像消失? - BoazGarty
@IEBasara我想在触摸时旋转图像视图,而不使用矩阵...下一步该怎么做? - Gorgeous_DroidVirus
1
如何使视图在特定范围内可拖动? - DroidLearner

1
这段代码可以帮助您在屏幕范围内拖动imageview。希望对您有所帮助。
 @Override
public boolean onTouch(View v, MotionEvent event) {

int X = (int) event.getRawX();
        int Y = (int) event.getRawY();
        RelativeLayout.LayoutParams paramsnew = (RelativeLayout.LayoutParams) v.getLayoutParams();

        switch(event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                _xDelta = X - paramsnew.leftMargin;
                _yDelta = Y - paramsnew.topMargin;
                imgposx = img.getX();
                imgposy = img.getY();
                break;
            case MotionEvent.ACTION_UP:
                img.setX(diyoposx);
                img.setY( diyoposy );
                break;
            case MotionEvent.ACTION_MOVE:
                RelativeLayout.LayoutParams param = (RelativeLayout.LayoutParams) v.getLayoutParams();
                param.leftMargin = X - _xDelta;
                param.topMargin = Y - _yDelta;
                param.rightMargin=(250*-1);
                param.bottomMargin=(250*-1);
                v.setLayoutParams(param);
                break;
        }
        mViewGroup.invalidate(); }

这里的mViewGroup是包含ImageView的RelativeLayout的ViewGroup实例。
mViewGroup= (ViewGroup) findViewById(R.id.relativeLayout);

另外,imgposx和imgposy是全局变量

float imgposx, imgposy;

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