安卓:查找缩放(使用捏用矩阵布局进行缩放)后ImageView的绝对点击位置缩放、矩阵、布局、位置

2023-09-05 08:56:51 作者:解脱i

我正在使用的Andr​​oid你好,对于捏放大功能第三版发现code。使用这个捏放大优良工程后,但放大后,我想要得到的图像视图绝对的点击位置。

下面是我的code

 包org.example.touch;
进口android.app.Activity;
进口android.graphics.Bitmap;
进口android.graphics.Matrix;
进口android.graphics.PointF;
进口android.os.Bundle;
进口android.util.FloatMath;
进口android.util.Log;
进口android.view.MotionEvent;
进口android.view.View;
进口android.view.View.OnTouchListener;
进口android.widget.GridView;
进口android.widget.ImageView;

公共类触摸扩展活动实现OnTouchListener {
私有静态最后字符串变量=触摸;

私有静态最终浮动MIN_ZOOM = 1.0F;
私有静态最终浮动MAX_ZOOM = 5.0F;

//这些矩阵将用于移动和放大图像
字模=新的Matrix();
矩阵savedMatrix =新的Matrix();

//我们可以在这3个状态之一
静态最终诠释无= 0;
静态最终诠释DRAG = 1;
静态最终诠释ZOOM = 2;
INT模式=无;

//记住一些东西放大
的PointF开始=新的PointF();
的PointF中期=新的PointF();
浮oldDist = 1F;

ImageView的IMAGE2;
IMAGE2 =(ImageView的)this.findViewById(R.id.imageView2);
image2.setOnTouchListener(新OnTouchListener(){

                公共布尔onTouch(视图V,MotionEvent事件){

                     ImageView的观点=(ImageView的)IMAGE2;
                      //这里处理触摸事件...
                        开关(event.getAction()及MotionEvent.ACTION_MASK){
                        案例MotionEvent.ACTION_DOWN:
                            savedMatrix.set(矩阵);
                            start.set(event.getX(),event.getY());
                            模式=阻力;
                            打破;
                        案例MotionEvent.ACTION_POINTER_DOWN:
                            oldDist =间距(事件);
                            如果(oldDist> 10F){
                                savedMatrix.set(矩阵);
                                中点(中,事件);
                                模式=变焦;
                            }
                            打破;
                        案例MotionEvent.ACTION_UP:
                        案例MotionEvent.ACTION_POINTER_UP:
                            模式=无;
                            打破;
                        案例MotionEvent.ACTION_MOVE:
                            如果(模式==拖动){
                                matrix.set(savedMatrix);
                                matrix.postTranslate(event.getX() -  start.x,event.getY() -  start.y);
                            }
                            否则,如果(模式==变焦){
                                浮newDist =间距(事件);
                                如果(newDist> 10F){
                                    matrix.set(savedMatrix);
                                    浮规模= newDist / oldDist;
                                    matrix.postScale(规模化,规模化,mid.x,mid.y);
                                }
                            }
                            打破;
                        }
                        view.setImageMatrix(矩阵);
}

        / **确定第一两个手指之间的空间* /
        私人浮动间距(MotionEvent事件){
            浮X = event.getX(0) -  event.getX(1);
            浮Y = event.getY(0) -  event.getY(1);
            返回FloatMath.sqrt(X * X + Y * Y);
        }

        / **计算前两个手指的中点* /
        私人无效中点(的PointF点,MotionEvent事件){
            浮X = event.getX(0)+ event.getX(1);
            浮Y = event.getY(0)+ event.getY(1);
            point.set(X / 2,Y / 2);
        }
 

解决方案 连接矩阵APP安卓版下载 连接矩阵软件免费版下载 去秀手游网

您可以使用当前应用到的ImageView来分从原来的默认点映射到/矩阵。

 从触摸//分/点击放大/转换ImageView的事件
浮动X;
浮动Ÿ;

浮initialPoints =新的浮动[] {X,Y};

//反转矩阵和地图点回
    如果(transformMatrix.invert(inverseTransformMatrix))
            inverseTransformMatrix.mapPoints(initialFocalPoints);
 

initialPoints 现在包含原始点,即其中点击点是,如果没有矩阵施加到imageview的

修改:应该在里面添加了这个地方,所以你知道他们是什么

 矩阵inverseTransformMatrix =新的Matrix();
矩阵transformMatrix =新的Matrix();
 

I am using code found in Hello Android, 3rd Edition for Pinch to Zoom functionality. After using this the pinch to zoom works fine, but after zooming i want to get the absolute click position on the image view.

Here is my code

package org.example.touch;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.GridView;
import android.widget.ImageView;

public class Touch extends Activity implements OnTouchListener {
private static final String TAG = "Touch";

private static final float MIN_ZOOM = 1.0f;
private static final float MAX_ZOOM = 5.0f;

// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();

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

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

ImageView image2;
image2 = (ImageView)this.findViewById(R.id.imageView2);
image2.setOnTouchListener(new OnTouchListener() {

                public boolean onTouch(View v, MotionEvent event) {

                     ImageView view = (ImageView) image2;
                      // 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;
                            break;
                        case MotionEvent.ACTION_POINTER_DOWN:
                            oldDist = spacing(event);
                            if (oldDist > 10f) {
                                savedMatrix.set(matrix);
                                midPoint(mid, event);
                                mode = ZOOM;
                            }
                            break;
                        case MotionEvent.ACTION_UP:
                        case MotionEvent.ACTION_POINTER_UP:
                            mode = NONE;
                            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);
                                if (newDist > 10f) {
                                    matrix.set(savedMatrix);
                                    float scale = newDist / oldDist;
                                    matrix.postScale(scale, scale, mid.x, mid.y);
                                }
                            }
                            break;
                        }
                        view.setImageMatrix(matrix);
}

        /** Determine the space between the first two fingers */
        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);
        }

        /** Calculate the mid point of the first two fingers */
        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);
        }

解决方案

You can use the matrix that is currently applied to the imageview to map points to/from the original default points.

//points from a touch/click event on the zoomed/translated imageview
float X;
float Y;

float initialPoints = new float[]{X, Y};

//invert the matrix and map points back
    if(transformMatrix.invert(inverseTransformMatrix))
            inverseTransformMatrix.mapPoints(initialFocalPoints);

initialPoints now contains the original points, i.e where the click point would be if no matrix was applied to the imageview

EDIT: should have added this in there somewhere so you know what they are.

Matrix inverseTransformMatrix = new Matrix();
Matrix transformMatrix = new Matrix();