安卓:查找缩放(使用捏用矩阵布局进行缩放)后ImageView的绝对点击位置 [英] Android: Find absolute click position on the ImageView after zooming (using pinch to zoom using Matrix Layout)
问题描述
我正在使用的Android你好,对于捏放大功能第三版发现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);
}
您可以使用当前应用到的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();
这篇关于安卓:查找缩放(使用捏用矩阵布局进行缩放)后ImageView的绝对点击位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!