Android:如何通过触摸旋转元素?

Android:如何通过触摸旋转元素?,第1张

概述我试图通过触摸并移动手指在视图内部旋转可绘制对象.我已经提出了几种解决方案,但是它们在设备上都不自然.这是我的第一种方法:根据用户触摸屏幕的位置以及手指移动的方向,我改变了可绘制对象的旋转程度,该旋转程度或多或少是任意计算的.privatevoidupdateRotation(floatx,fl

我试图通过触摸并移动手指在视图内部旋转可绘制对象.我已经提出了几种解决方案,但是它们在设备上都不自然.

这是我的第一种方法:根据用户触摸屏幕的位置以及手指移动的方向,我改变了可绘制对象的旋转程度,该旋转程度或多或少是任意计算的.

private voID updateRotation(float x, float y, float oldX, float oldY) {    int wIDth = getWIDth();    int height = getHeight();    float centerX = wIDth / 2;    float centerY = height / 2;    float xSpeed = rotationSpeed(x, oldX, wIDth);    float ySpeed = rotationSpeed(y, oldY, height);     if ((y < centerY && x > oldX)        || (y > centerY && x < oldX))        rotation += xSpeed;    else if ((y < centerY && x < oldX)             || (y > centerY && x > oldX))        rotation -= xSpeed;    if ((x > centerX && y > oldY)        || (x < centerX && y < oldY))        rotation += ySpeed;    else if ((x > centerX && y < oldY)             || (x < centerX && y > oldY))        rotation -= ySpeed;}private static float rotationSpeed(float pos, float oldPos, float max) {    return (Math.abs(pos - oldPos) * 180) / max;}

这种方法有一些令人讨厌的副作用:有时可绘制对象会在手指不动时旋转,并且旋转速度通常不如用户的手指快.

因此,我放弃了这段代码,从第二种方法开始.我正在使用三角函数来计算与手指移动等效的实际旋转:

private voID updateRotation(float x, float y, float oldX, float oldY) {    float centerX = getWIDth() / 2;    float centerY = getHeight() / 2;    float a = distance(centerX, centerY, x, y);    float b = distance(centerX, centerY, oldX, oldY);    float c = distance(x, y, oldX, oldY);    double r = Math.acos((Math.pow(a, 2) + Math.pow(b, 2) - Math.pow(c, 2))                         / (2 * a * b));    if ((oldY < centerY && x < oldX)        || (oldY > centerY && x > oldX)        || (oldX > centerX && y < oldY)        || (oldX < centerX && y > oldY))        r *= -1;     rotation += (int) Math.todegrees(r);}private float distance(float x1, float y1, float x2, float y2) {    return Math.abs(x1 - x2) + Math.abs(y1 - y2);}

尽管这听起来确实对我来说是正确的解决方案,但效果也不佳.手指运动有时会被忽略-计算可能会太昂贵吗?此外,旋转仍比实际手指移动快一点.

理想情况下,如果我开始旋转可绘制对象的特定点,则该点应始终保持在手指下方.你能告诉我如何实现吗?

编辑:

这是我对Snailer的建议的采纳.我不得不切换参数以使atan2方法旋转到正确的方向,现在效果很好:

private voID updateRotation(float x, float y) {    double r = Math.atan2(x - getWIDth() / 2, getHeight() / 2 - y);    rotation = (int) Math.todegrees(r);}

解决方法:

通过获取手指和屏幕中心之间的夹角,可以轻松完成此 *** 作.与上面的第二个示例类似.在您的ontouchEvent中,将getX()/ getY()发送到此方法:

    private double getdegreesFromtouchEvent(float x, float y){        double delta_x = x - (Screen WIDth) /2;        double delta_y = (Screen Height) /2 - y;        double radians = Math.atan2(delta_y, delta_x);        return Math.todegrees(radians);    }

然后,当您draw()时,您可以根据结果旋转画布.显然,您需要使用if(MotionEvent.getAction()== MotionEvent.ACTION_MOVE)来更新角度.

总结

以上是内存溢出为你收集整理的Android:如何通过触摸旋转元素?全部内容,希望文章能够帮你解决Android:如何通过触摸旋转元素?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1083055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存