旋转和缩放使用多点触摸的机器人 [英] rotation and scaling using multi touch in android
本文介绍了旋转和缩放使用多点触摸的机器人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我要旋转和多点触摸事件缩放图像, 我能够拖动,缩放图像,但我无法理解图像的旋转。 我现在面临的问题,所以请帮助我尽快。 我的code是有
公共类触摸扩展活动实现OnTouchListener {
私有静态最后字符串变量=触摸;
//这些矩阵将用于移动和放大图像
字模=新的Matrix();
矩阵矩阵1 =新的Matrix();
矩阵savedMatrix =新的Matrix();
矩阵savedMatrix2 =新的Matrix();
//我们可以在这3个状态之一
静态最终诠释无= 0;
静态最终诠释DRAG = 1;
静态最终诠释ZOOM = 2;
INT模式=无;
浮oldscale = 0;
//记住一些东西放大
的PointF开始=新的PointF();
的PointF中期=新的PointF();
浮oldDist = 1F;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.main);
ImageView的观点=(ImageView的)findViewById(R.id.imageView2);
view.setOnTouchListener(本);
ImageView的厂景=(ImageView的)findViewById(R.id.imageView2);
view1.setOnTouchListener(本);
// ...
//围绕一个蛋糕错误工作
matrix.setTranslate(1F,1F);
matrix1.setTranslate(1F,1F);
view.setImageMatrix(矩阵);
view1.setImageMatrix(矩阵);
}
@覆盖
公共布尔onTouch(视图V,MotionEvent rawEvent){
WrapMotionEvent事件= WrapMotionEvent.wrap(rawEvent);
// ...
ImageView的观点=(ImageView的)V;
//转储触摸事件日志
dumpEvent(事件);
//这里处理触摸事件...
双R = Math.atan2(event.getX() - 400/2,
400个/ 2 - event.getY());
INT旋转=(int)的Math.toDegrees(r)的;
浮newRot =新的浮动(旋转);
开关(event.getAction()及MotionEvent.ACTION_MASK){
案例MotionEvent.ACTION_DOWN:
savedMatrix.set(矩阵);
start.set(event.getX(),event.getY());
Log.d(TAG模式= DRAG);
模式=阻力;
打破;
案例MotionEvent.ACTION_POINTER_DOWN:
oldDist =间距(事件);
Log.d(TAG,oldDist =+ oldDist);
如果(oldDist> 10F){
savedMatrix.set(矩阵);
中点(中,事件);
模式=变焦;
Log.d(TAG模式= ZOOM);
}
打破;
案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_POINTER_UP:
模式=无;
Log.d(TAG模式= NONE);
打破;
案例MotionEvent.ACTION_MOVE:
matrix.postRotate(15);
如果(模式==拖动){
// ...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
否则,如果(模式==变焦){
浮newDist =间距(事件);
Log.d(TAG,newDist =+ newDist);
如果(newDist> 10F){
matrix.set(savedMatrix);
浮规模= newDist / oldDist;
matrix.postScale(规模化,规模化,mid.x,mid.y);
Log.e(秤| mid.x | mid.y规模++ mid.x ++ mid.y);
}
}
打破;
}
view.setImageMatrix(矩阵);
返回true; //表示事件已经被处理
}
/ **显示在LogCat中查看事件,调试* /
私人无效dumpEvent(WrapMotionEvent事件){
// ...
字符串名称[] = {DOWN,UP,移动,取消,外,
POINTER_DOWN,POINTER_UP,7?,8?,9? };
StringBuilder的SB =新的StringBuilder();
INT行动= event.getAction();
INT行动code =动作和放大器; MotionEvent.ACTION_MASK;
sb.append(事件响应_)追加(姓名[动作code])。
如果(动作code == MotionEvent.ACTION_POINTER_DOWN
||行动code == MotionEvent.ACTION_POINTER_UP){
sb.append((PID).append(
作用>> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append());
}
sb.append([);
的for(int i = 0; I< event.getPointerCount();我++){
。sb.append(#)追加(ⅰ);
sb.append((PID).append(event.getPointerId(ⅰ));
sb.append()=)追加((int)的event.getX(ⅰ))。
。sb.append(,)追加((int)的event.getY(ⅰ));
如果第(i + 1&其中; event.getPointerCount())
sb.append(;);
}
sb.append(]);
Log.d(TAG,sb.toString());
}
/ **确定第一两个手指之间的空间* /
私人浮动间距(WrapMotionEvent事件){
// ...
浮X = event.getX(0) - event.getX(1);
浮Y = event.getY(0) - event.getY(1);
返回FloatMath.sqrt(X * X + Y * Y);
}
/ **计算前两个手指的中点* /
私人无效中点(的PointF点,WrapMotionEvent事件){
// ...
浮X = event.getX(0)+ event.getX(1);
浮Y = event.getY(0)+ event.getY(1);
point.set(X / 2,Y / 2);
}
}
所以,请给我提供了这个问题的精确解。
解决方案
浮法[] lastEvent = NULL;
浮D = 0F;
浮newRot = 0F;
@覆盖
公共布尔onTouch(视图V,MotionEvent事件){
ImageView的观点=(ImageView的)V;
//转储触摸事件日志
dumpEvent(事件);
//这里处理触摸事件...
开关(event.getAction()及MotionEvent.ACTION_MASK){
案例MotionEvent.ACTION_DOWN:
savedMatrix.set(矩阵);
start.set(event.getX(),event.getY());
如果(Constant.TRACE)Log.d(TAG模式= DRAG);
模式=阻力;
lastEvent = NULL;
打破;
案例MotionEvent.ACTION_POINTER_DOWN:
oldDist =间距(事件);
savedMatrix.set(矩阵);
中点(中,事件);
模式=变焦;
如果(Constant.TRACE)Log.d(TAG模式= ZOOM);
lastEvent =新的浮动[4];
lastEvent [0] = event.getX(0);
lastEvent [1] = event.getX(1);
lastEvent [2] = event.getY(0);
lastEvent [3] = event.getY(1);
D =旋转(事件);
打破;
案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_POINTER_UP:
模式=无;
lastEvent = NULL;
如果(Constant.TRACE)Log.d(TAG模式= NONE);
打破;
案例MotionEvent.ACTION_MOVE:
如果(模式==拖动){
// ...
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,event.getY() - start.y);
}
否则,如果(模式==变焦和放大器;&安培; event.getPointerCount()== 2){
浮newDist =间距(事件);
如果(Constant.TRACE)Log.d(TAG,计数=+ event.getPointerCount());
如果(Constant.TRACE)Log.d(TAG,newDist =+ newDist);
matrix.set(savedMatrix);
如果(newDist> 10F){
浮规模= newDist / oldDist;
matrix.postScale(规模化,规模化,mid.x,mid.y);
}
如果(lastEvent!= NULL){
newRot =旋转(事件);
如果(Constant.TRACE)Log.d(Degreeeeeeeeeee,newRot =+(newRot));
浮动R = newRot-D;
matrix.postRotate(R,imgView.getMeasuredWidth()/ 2,imgView.getMeasuredHeight()/ 2);
}
}
打破;
}
view.setImageMatrix(矩阵);
返回true; //表示事件已经被处理
}
/ **确定前两个手指之间的度* /
私人浮动旋转(MotionEvent事件){
双delta_x =(event.getX(0) - event.getX(1));
双delta_y =(event.getY(0) - event.getY(1));
双弧度= Math.atan2(delta_y,delta_x);
如果(Constant.TRACE)Log.d(旋转~~~~~~~~~~~~~~~~~,delta_x +##+ delta_y +##+弧度+##
+ Math.toDegrees(弧度));
返程(浮点)Math.toDegrees(弧度);
}
试试这个code,但要记住一些老的手机有问题,旋转......
i want to rotate and scale the image on multi touch event, i am able to drag, scale the image but i can't understand the rotation of image. i am facing problem so please help me asap. my code is there
public class Touch extends Activity implements OnTouchListener {
private static final String TAG = "Touch";
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix matrix1 = new Matrix();
Matrix savedMatrix = new Matrix();
Matrix savedMatrix2 = 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;
float oldscale =0;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView view = (ImageView) findViewById(R.id.imageView2);
view.setOnTouchListener(this);
ImageView view1 = (ImageView) findViewById(R.id.imageView2);
view1.setOnTouchListener(this);
// ...
// Work around a Cupcake bug
matrix.setTranslate(1f, 1f);
matrix1.setTranslate(1f, 1f);
view.setImageMatrix(matrix);
view1.setImageMatrix(matrix1);
}
@Override
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
// ...
ImageView view = (ImageView) v;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
double r = Math.atan2(event.getX() - 400 / 2,
400 / 2 - event.getY());
int rotation = (int) Math.toDegrees(r);
float newRot = new Float(rotation);
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_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE");
break;
case MotionEvent.ACTION_MOVE:
matrix.postRotate(15);
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);
Log.e("scale | mid.x | mid.y", scale + " " +mid.x + " " + mid.y);
}
}
break;
}
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
/** Show an event in the LogCat view, for debugging */
private void dumpEvent(WrapMotionEvent event) {
// ...
String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
"POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
StringBuilder sb = new StringBuilder();
int action = event.getAction();
int actionCode = action & MotionEvent.ACTION_MASK;
sb.append("event ACTION_").append(names[actionCode]);
if (actionCode == MotionEvent.ACTION_POINTER_DOWN
|| actionCode == MotionEvent.ACTION_POINTER_UP) {
sb.append("(pid ").append(
action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
sb.append(")");
}
sb.append("[");
for (int i = 0; i < event.getPointerCount(); i++) {
sb.append("#").append(i);
sb.append("(pid ").append(event.getPointerId(i));
sb.append(")=").append((int) event.getX(i));
sb.append(",").append((int) event.getY(i));
if (i + 1 < event.getPointerCount())
sb.append(";");
}
sb.append("]");
Log.d(TAG, sb.toString());
}
/** Determine the space between the first two fingers */
private float spacing(WrapMotionEvent 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, WrapMotionEvent event) {
// ...
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
}
so please provide me exact solution for this problem.
解决方案
float[] lastEvent = null;
float d = 0f;
float newRot = 0f;
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
if (Constant.TRACE) Log.d(TAG, "mode=DRAG");
mode = DRAG;
lastEvent = null;
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
if (Constant.TRACE) Log.d(TAG, "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;
if (Constant.TRACE) Log.d(TAG, "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 && event.getPointerCount()==2) {
float newDist = spacing(event);
if (Constant.TRACE) Log.d(TAG, "Count=" + event.getPointerCount());
if (Constant.TRACE) Log.d(TAG, "newDist=" + newDist);
matrix.set(savedMatrix);
if (newDist > 10f) {
float scale = newDist / oldDist;
matrix.postScale(scale, scale, mid.x, mid.y);
}
if (lastEvent!=null){
newRot = rotation(event);
if (Constant.TRACE) Log.d("Degreeeeeeeeeee", "newRot="+(newRot));
float r = newRot-d;
matrix.postRotate(r, imgView.getMeasuredWidth()/2, imgView.getMeasuredHeight()/2);
}
}
break;
}
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
/** Determine the degree between the first two fingers */
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);
if (Constant.TRACE) Log.d("Rotation ~~~~~~~~~~~~~~~~~", delta_x+" ## "+delta_y+" ## "+radians+" ## "
+Math.toDegrees(radians));
return (float) Math.toDegrees(radians);
}
Try this code, but remember some old phone have problem with rotation..
这篇关于旋转和缩放使用多点触摸的机器人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文