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

use*_*151 10 android android-imageview

当我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;
    }
});
Run Code Online (Sandbox Code Playgroud)

IEB*_*ara 36

以下是我认为它可能起作用的情况.

我看到你正在使用img.getX(),img.getY()所以我假设你正在使用API​​级别11或更高级别.

而且我认为你img的实例是ImageView.(FrameLayout.LayoutParams虽然ImageView 的用法很奇怪......)

以下是如何正确使用它:

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;
    }
});
Run Code Online (Sandbox Code Playgroud)




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

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

import android.graphics.PointF;
Run Code Online (Sandbox Code Playgroud)

实际上,这只是一个用于记录float x和float 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; }

}
Run Code Online (Sandbox Code Playgroud)