Android:如何在触摸移动(ACTION_MOVE)时移动视图

215

我想做一个简单的控制:一个带有视图的容器。如果我触摸容器并移动手指,我希望视图跟随我的手指移动。

应该使用什么类型的容器(布局)?如何实现这一点?

我不需要使用表面,只需要一个简单的布局即可。


2
以下是一个示例:http://thegeekyland.blogspot.com/2015/12/android-animations-explained.html - Arlind Hajredinaj
13个回答

1
与@Alex Karshin的答案相同,我做了一些修改。
public class MovingObject implements OnTouchListener {
private RelativeLayout.LayoutParams lParams;
private PointF viewPoint, prePoint, currPoint;

public MovingObject() {
    lParams = null;
    viewPoint = new PointF();
    prePoint = new PointF();
    currPoint = new PointF();
}

public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        viewPoint.set(view.getX(), view.getY());
        prePoint.set(event.getRawX(), event.getRawY());
        lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        break;
    case MotionEvent.ACTION_UP:
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        break;
    case MotionEvent.ACTION_POINTER_UP:
        break;
    case MotionEvent.ACTION_MOVE:
        currPoint.set(event.getRawX(), event.getRawY());
        moveToCurrentPoint(view);
        break;
    }
    view.invalidate();
    return true;
}

private void moveToCurrentPoint(View view) {
    float dx = currPoint.x - prePoint.x - prePoint.x + viewPoint.x;
    float dy = currPoint.y - prePoint.y - prePoint.y + viewPoint.y;
    lParams.leftMargin = (int) (prePoint.x + dx);
    lParams.topMargin = (int) (prePoint.y + dy);
    view.setLayoutParams(lParams);
}
}

0

//如果你想移动相机或其他什么东西,可以按照以下方法进行操作。在我的情况下,我正在实现相机,您可以将其应用于任何您想要的对象

public class VideoCallActivity extends AppCompatActivity implements 
  View.OnTouchListener {
 FrameLayout myLayout1;

@SuppressLint("ClickableViewAccessibility")
@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
  //in the frame layout I am setting my camera
   myLayout1.setOnTouchListener(this);
  
  }

   float dX, dY;

@Override
public boolean onTouch(View view, MotionEvent event) {
    switch (event.getAction()) {
 //this is your code
        case MotionEvent.ACTION_DOWN:
            dX = view.getX() - event.getRawX();
            dY = view.getY() - event.getRawY();
            break;
        case MotionEvent.ACTION_MOVE:
            view.animate()
                    .x(event.getRawX() + dX)
                    .y(event.getRawY() + dY)
                    .setDuration(0)
                    .start();
            break;
        default:
            return false;
    }
    return true;
}

0

Kotlin的简单代码:

var dx = 0f
var dy = 0f

private fun setMyViewListener(): OnTouchListener {
    return OnTouchListener { view, event ->

        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                dx = view.x - event.rawX
                dx = view.y - event.rawY
            }
            MotionEvent.ACTION_MOVE -> view.animate()
                    .x(event.rawX + dx)
                    //.y(event.rawY + dy) // uncomment this line to move y
                    .setDuration(0)
                    .start()
        }

        true
    }
}

然后像这样调用它:

var myView = findViewById<ConstraintLayout>(R.id.myView)
myView.setOnTouchListener(setMyViewListener())

伙计,不错的尝试,但你的代码不够流畅,在移动对象/视图时存在一些问题。再看一遍吧。 - Kishan Solanki
兄弟,不错的尝试,但是你的代码还不够流畅,在移动物体/视图时出现了一些问题。再仔细看一遍吧。 - Kishan Solanki

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