首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android手指同时旋转、缩放和移动图像?

Android手指同时旋转、缩放和移动图像?
EN

Stack Overflow用户
提问于 2012-02-09 21:28:37
回答 2查看 3.3K关注 0票数 2

我想问一下,用手指旋转、缩放和移动图像这三个功能可以在一个应用程序中同时实现吗?我找到了拖拽图片加上缩放功能的源代码。但是,我找不到将旋转函数添加到代码中的方法。

有人能教你如何一起构建这三个函数吗?

EN

回答 2

Stack Overflow用户

发布于 2013-09-17 14:39:53

试着用下面的代码,它对我很有效。

代码语言:javascript
复制
float[] lastEvent = null;
float d = 0f;
float newRot = 0f;
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
public static String fileNAME;
public static int framePos = 0;

private float scale = 0;
private float newDist = 0;

// Fields
private String TAG = this.getClass().getSimpleName();

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

// Remember some things for zooming
private PointF start = new PointF();
private PointF mid = new PointF();
float oldDist = 1f;

 public boolean onTouch(View v, MotionEvent event) {
            ImageView view = (ImageView) v;

            // Handle touch events here...
            switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist = spacing(event);
                if (oldDist > 10f) {
                    savedMatrix.set(matrix);
                    midPoint(mid, event);
                    mode = ZOOM;
                }
                lastEvent = new float[4];
                lastEvent[0] = event.getX(0);
                lastEvent[1] = event.getX(1);
                lastEvent[2] = event.getY(0);
                lastEvent[3] = event.getY(1);
                d = rotation(event);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                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 && event.getPointerCount() == 2) {
                    float newDist = spacing(event);
                    matrix.set(savedMatrix);
                    if (newDist > 10f) {
                        float scale = newDist / oldDist;
                        matrix.postScale(scale, scale, mid.x, mid.y);
                    }
                    if (lastEvent != null) {
                        newRot = rotation(event);
                        float r = newRot - d;
                        matrix.postRotate(r, view.getMeasuredWidth() / 2,
                                view.getMeasuredHeight() / 2);
                    }
                }
                break;
            }

            view.setImageMatrix(matrix);

            return true;
        }

//用于在多点触控上旋转图像。

代码语言:javascript
复制
private float rotation(MotionEvent event) {
    double delta_x = (event.getX(0) - event.getX(1));
    double delta_y = (event.getY(0) - event.getY(1));
    double radians = Math.atan2(delta_y, delta_x);

    return (float) Math.toDegrees(radians);
}
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);
    }
票数 2
EN

Stack Overflow用户

发布于 2012-02-09 22:50:10

我推荐使用android-multitouch-controller。它对我来说效果很好,它提供了多点触摸缩放、平移和旋转功能,就像你想要的那样。它是在Apache v2下授权的。旋转时要小心。多点触摸旋转只适用于某些设备。

注意:在使用Synaptics或Synaptics之类的"2x1D“传感器(G1、MyTouch、Droid、Nexus One)而不是真正的2D传感器(如HTC Incredible或HTC EVO 4G)的老式触摸屏设备上,旋转是很奇怪的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9211733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档