【问题标题】:How to set rotation of a view based on other view position如何根据其他视图位置设置视图的旋转
【发布时间】:2018-01-30 10:06:42
【问题描述】:

我知道这个问题没有多大意义,但我有两种观点。

第一个我根据活动上的触摸事件设置其位置X & Y

第二个就像一个固定在活动中间的箭头,我希望它准确地指向第一个视图的位置。

那么有没有一种方法可以将视图的位置坐标转换为基于屏幕中心的角度值?

parentView.setOnTouchListener(new OnTouchListener() {
      @Override
      public boolean onTouch(View view, MotionEvent event) {
        marker.setX(event.getX()); // marker is the first view
        marker.setY(event.getY());
        FixedArrow.setRotation(/* ??? */); //FixedArrow is the second view
        return true;
      }
    });

【问题讨论】:

    标签: java android libgdx


    【解决方案1】:

    这是中学几何学的任务。基本上你需要的是解决直角三角形。这个三角形的一侧始终是从屏幕中心到最近的屏幕边框的线,另一侧是从中心到用户点击点的线。应用那里的三角函数,你可以计算出一个角度。

    最后的公式和解释带图可以看this answer

    【讨论】:

      【解决方案2】:

      试试这样的

      public float getAngle(Point target, Point center) {
          float angle = (float) Math.toDegrees(Math.atan2(target.y - center.y, target.x - center.x));
      
          if(angle < 0){
              angle += 360;
          }
      
          return angle;
      }
      

      调用它做这样的事情

      Point target = new Point((int) event.getX(), (int) event.getY());
      Point center = new Point(parentView.getWidth()/2, parentView.getHeight()/2);
      FixedArrow.setRotation(getAngle(target,center)); 
      

      【讨论】:

      • 你能解释一下这里的参数吗?调用方法时应该传递什么?
      • 它不太奏效,这里有 30 度的差异,我认为原因是我必须进行强制转换,因为 Point 类在其构造函数中采用 int 值!或者这可能是一个完全不同的原因!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多