android - android中的触摸手势移动 View

标签 android

我想通过手势移动 View 。我搜索并添加了这段代码,但仍然无法正常工作。

请帮我看看是哪里出了问题。

public boolean onTouchEvent(MotionEvent event) {
    curX = event.getX();
    curY = event.getY();
    if(event.getPointerCount() == 2) {
        previousFingerDistance = currentFingerDistance;
        currentFingerDistance = fingerDist(event);

        if(previousFingerDistance == currentFingerDistance) {
            prevX = curX;
            prevY = curY;
            invalidate();
        }
    }
    return true;
}

最佳答案

试试这段代码。我正在使用它在屏幕上移动 ImageView,但我认为它适合其他类型的 View 。

imView.setOnTouchListener(new OnTouchListener() {
                private static final String TAG = "Touch";
                // These matrices will be used to move and zoom image

                Matrix savedMatrix = new Matrix();
                PointF start = new PointF();
                public PointF mid = new PointF();

                // We can be in one of these 3 states
                public static final int NONE = 0;
                public static final int DRAG = 1;
                public static final int ZOOM = 2;
                public int mode = NONE;

                float oldDist;

                public boolean onTouch(View v, MotionEvent event) {

                    ImageView view = (ImageView) v;
                    view.setScaleType(ImageView.ScaleType.MATRIX);
                    switch (event.getAction() & MotionEvent.ACTION_MASK) {
                    case MotionEvent.ACTION_DOWN:

                        savedMatrix.set(matrix);
                        start.set(event.getX(), event.getY());
                        Log.d(TAG, "mode=DRAG");
                        mode = DRAG;
                        break;

                    case MotionEvent.ACTION_POINTER_DOWN:

                        oldDist = spacing(event);
                        Log.d(TAG, "oldDist=" + oldDist);
                        if (oldDist > 10f) {

                            savedMatrix.set(matrix);
                            midPoint(mid, event);
                            mode = ZOOM;
                            Log.d(TAG, "mode=ZOOM");
                        }
                        break;

                    case MotionEvent.ACTION_MOVE:

                        if (mode == DRAG) {

                            matrix.set(savedMatrix);
                            matrix.postTranslate(event.getX() - start.x,
                                    event.getY() - start.y);
                        } else if (mode == ZOOM) {

                            float newDist = spacing(event);
                            Log.d(TAG, "newDist=" + newDist);
                            if (newDist > 10f) {

                                matrix.set(savedMatrix);
                                float scale = newDist / oldDist;
                                matrix.postScale(scale, scale, mid.x, mid.y);
                            }
                        }
                        break;

                    case MotionEvent.ACTION_UP:
                    case MotionEvent.ACTION_POINTER_UP:

                        mode = NONE;
                        Log.d(TAG, "mode=NONE");
                        break;
                    }

                    // Perform the transformation
                    Log.d("point",start.x +" "+start.y);
                    view.setImageMatrix(matrix);

                    return true; // indicate event was handled
                }

                private float spacing(MotionEvent event) {
                    float x = event.getX(0) - event.getX(1);
                    float y = event.getY(0) - event.getY(1);
                    return FloatMath.sqrt(x * x + y * y);
                }

                private void midPoint(PointF point, MotionEvent event) {

                    float x = event.getX(0) + event.getX(1);
                    float y = event.getY(0) + event.getY(1);
                    point.set(x / 2, y / 2);
                }

            });

更一般的看法

public boolean onTouch(View view, MotionEvent motionEvent) {
    switch (motionEvent.getAction()) {
        case MotionEvent.ACTION_DOWN:
            float dx =  motionEvent.getX();
            float dy =  motionEvent.getY();
            break;

        case MotionEvent.ACTION_MOVE:
            float x =  motionEvent.getX();
            fload y =  motionEvent.getY();
            RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) view.getLayoutParams();
            float left = lp.leftMargin + (x - dx);
            float top = lp.topMargin + (y - dy);
            lp.leftMargin = (int)left;
            lp.topMargin = (int)top;
            view.setLayoutParams(lp);
            break;
    }
    return true;
}

关于android - android中的触摸手势移动 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17696202/

相关文章:

android - 在 Android 中使用 DataOutputStream 在 POST 正文中发送特殊字符 (ë ä ï)

Android TextView 多行格式化

android - 在 Kotlin 中将回调转换为可挂起的协程

java - Android:捕获每种可能类型的 "Enter"键(硬键和软键)的代码?

c# - Unity android Native Camera 作为 WebcamTexture

android - 每次应用程序启动时请求 Google Cloud Messaging (GCM) 注册 ID

android - 检索从 sqlite 数据库加载的微调器中选定元素的 id

android - 如何从 Android Studio 中的忽略文件生成器中删除用户模板?

java - 使用 Eclipse 访问现有的 SQLite 数据库

android - 如何检查自定义android是否已 Root ?