Android imageview在触摸事件时不移动
调用ontouch事件时,我的imageview不会移动…尽管我可以从日志跟踪中看到动作向上和动作移动 这是我的密码:-Android imageview在触摸事件时不移动,android,imageview,Android,Imageview,调用ontouch事件时,我的imageview不会移动…尽管我可以从日志跟踪中看到动作向上和动作移动 这是我的密码:- public boolean onTouch(View v, MotionEvent motion) { float dy ; float dx; double r = 0; float angle = 0; switch(v.getId()) { case R.id.arrow:
public boolean onTouch(View v, MotionEvent motion) {
float dy ;
float dx;
double r = 0;
float angle = 0;
switch(v.getId())
{
case R.id.arrow:
switch(motion.getActionMasked())
{
case MotionEvent.ACTION_MOVE:
Log.w(this.getClass().getName(),"In MOTION MOVE");
mX1 = motion.getX();
mY1 = motion.getY();
break;
case MotionEvent.ACTION_UP:
Log.w(this.getClass().getName(),"In MOTION UP");
mX2 = motion.getX();
mY2 = motion.getY();
dy = -( mY2-mY1);
dx = -(mX2-mX1);
r = Math.atan2(dy, dx);
angle = (int)Math.toDegrees(r);
updateRotation(angle);
break;
default:
break;
}
Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Double.toString(angle));
break;
default:
break;
}
return true;
}
基本上,我试图计算当用户触摸imageview并改变其位置时的角位移
======================================
编辑:-下面是我的更新旋转功能:-
public void updateRotation(double angle)
{
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.arrow);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
String filePath = null;
Matrix mtx = new Matrix();
Log.d(this.getClass().getName(), "Value: " + Double.toString(angle));
if(angle > 90)
angle = 90;
mtx.postRotate((float) angle);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
Drawable draw =new BitmapDrawable(bitmap);
mImageView.setBackgroundDrawable(draw);
}
=========================================================
编辑2:修改的函数
public boolean onTouch(View v, MotionEvent motion) {
float dy ;
float dx;
double r = 0;
switch(v.getId())
{
case R.id.arrow:
switch(motion.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
mX1 = motion.getX();
mY1 = motion.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.w(this.getClass().getName(),"In MOTION MOVE");
mX1 = motion.getX();
mY1 = motion.getY();
break;
case MotionEvent.ACTION_UP:
Log.w(this.getClass().getName(),"In MOTION UP");
mX2 = motion.getX();
mY2 = motion.getY();
dy = -( mY2-mY1);
dx = -(mX2-mX1);
r = Math.atan2(dy, dx);
mAngle = (int)Math.toDegrees(r);
updateRotation();
break;
default:
break;
}
Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Float.toString(mAngle));
break;
default:
break;
}
return true;
}
=============================================
编辑3:-奇怪的是,如果我修改我的onTouch事件并执行动作中的所有计算,imageview会对每个触摸事件做出响应,但这不是我想要的,因为我无法在动作中进行正确的盎格鲁旋转\u移动事件Ruchira
通过查看您的代码并亲自使用许多onTouch创新,我可以告诉您,问题肯定出在您的onTouchEvent()
中。在ACTION\u MOVE
中记录mX1
和mY1
,而不记录原始ACTION\u DOWN
事件。这意味着每次移动手指时,onTouchEvent()
方法都会认为这是原始位置。请尝试以下方法:
public boolean onTouch(View v, MotionEvent motion) {
float dy ;
float dx;
double r = 0;
float angle = 0;
switch(v.getId())
{
case R.id.arrow:
switch(motion.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
mX1 = motion.getX();
mY1 = motion.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.w(this.getClass().getName(),"In MOTION MOVE");
//Just to support real time rotation, you could:
mX2 = motion.getX();
mY2 = motion.getY();
//... some rotation code.
break;
case MotionEvent.ACTION_UP:
Log.w(this.getClass().getName(),"In MOTION UP");
// All of this should be fine.
mX2 = motion.getX();
mY2 = motion.getY();
dy = -( mY2-mY1);
dx = -(mX2-mX1);
r = Math.atan2(dy, dx);
angle = (int)Math.toDegrees(r);
updateRotation(angle);
break;
default:
break;
}
Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Double.toString(angle));
break;
default:
break;
}
return true;
}
这至少应该正确地跟踪你的数字,这样它们才可能被实际使用
其他注意事项
最常见的错误是确保没有将任何跟踪变量设置为final。如果是这种情况,代码将设置一次,但不会再次设置
在处理Drawable时,去掉原始Drawable及其回调非常重要。这是一个众所周知的问题,在安卓系统中从未解决,因为无法决定何时需要,何时不需要。从本质上讲,Android最终会耗尽内存,但不一定会告诉你,只是无法更新图像。这就是您执行此操作的方式(在替换图像时)
最后,您必须让图像知道它必须重新绘制自己。情况并非总是如此,但事实往往如此<代码>mImageView.invalidate()通常会解决问题,应该放在updateRotation()
方法的最后一行
模糊逻辑
通过查看您的代码并亲自使用许多onTouch创新,我可以告诉您,问题肯定出在您的onTouchEvent()
中。在ACTION\u MOVE
中记录mX1
和mY1
,而不记录原始ACTION\u DOWN
事件。这意味着每次移动手指时,onTouchEvent()
方法都会认为这是原始位置。请尝试以下方法:
public boolean onTouch(View v, MotionEvent motion) {
float dy ;
float dx;
double r = 0;
float angle = 0;
switch(v.getId())
{
case R.id.arrow:
switch(motion.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
mX1 = motion.getX();
mY1 = motion.getY();
break;
case MotionEvent.ACTION_MOVE:
Log.w(this.getClass().getName(),"In MOTION MOVE");
//Just to support real time rotation, you could:
mX2 = motion.getX();
mY2 = motion.getY();
//... some rotation code.
break;
case MotionEvent.ACTION_UP:
Log.w(this.getClass().getName(),"In MOTION UP");
// All of this should be fine.
mX2 = motion.getX();
mY2 = motion.getY();
dy = -( mY2-mY1);
dx = -(mX2-mX1);
r = Math.atan2(dy, dx);
angle = (int)Math.toDegrees(r);
updateRotation(angle);
break;
default:
break;
}
Log.d(this.getClass().getName(), "Value of angle in ontouch: " + Double.toString(angle));
break;
default:
break;
}
return true;
}
这至少应该正确地跟踪你的数字,这样它们才可能被实际使用
其他注意事项
最常见的错误是确保没有将任何跟踪变量设置为final。如果是这种情况,代码将设置一次,但不会再次设置
在处理Drawable时,去掉原始Drawable及其回调非常重要。这是一个众所周知的问题,在安卓系统中从未解决,因为无法决定何时需要,何时不需要。从本质上讲,Android最终会耗尽内存,但不一定会告诉你,只是无法更新图像。这就是您执行此操作的方式(在替换图像时)
最后,您必须让图像知道它必须重新绘制自己。情况并非总是如此,但事实往往如此<代码>mImageView.invalidate()通常会解决问题,应该放在updateRotation()
方法的最后一行
FuzzicalLogic更新操作()do做什么?@Reno添加了功能更新操作()do做什么?@Reno添加了功能我粘贴了修改后的代码,但imageview仍在第一次触摸时响应(旋转180度)随后不旋转。我已将修改后的函数作为问题的一部分放入Edit2your ACTION_MOVE仍会更新mX1和mY1。将其更改为更新mX2和mY2。只有你的动作才能改变mX1和mY1。如果没有看到全班同学,我无法确定。。。但我在上面的编辑中找到了一些东西。(给它几分钟时间发布)不,没有。这正是你的喜好。如果需要,可以手动处理所有滚动。(不过我不推荐)。是的,有几种选择。实际上,您可以将触摸处理移动到有权访问滚动的父视图,并在其中进行中断,然后根据发生的情况推迟到ImageView或滚动器。您可以为应用程序设置一个指示器,比如在旋转前长按图像,并使用“isRotating”变量通知应用程序和滚动条。不过,你要问的其实是另一个问题。我粘贴了修改后的代码,但imageview仍在第一次触摸时响应(旋转180次),随后没有旋转。我已将修改后的函数作为问题的一部分放入Edit2your ACTION_MOVE仍会更新mX1和mY1。将其更改为更新mX2和mY2。只有你的动作才能改变mX1和mY1。如果没有看到全班同学,我无法确定。。。但我在上面的编辑中找到了一些东西。(给它几分钟时间发布)不,没有。这正是你的喜好。如果需要,可以手动处理所有滚动。(不过我不推荐)。是的,有几种选择。实际上,您可以将触摸处理移动到有权访问滚动的父视图,并在其中进行中断,然后根据发生的情况推迟到ImageView或滚动器。你可以设定一个