【问题标题】:Rotate layout containing a sticker based on onTouchListener in android基于android中的onTouchListener旋转包含贴纸的布局
【发布时间】:2015-09-24 13:52:59
【问题描述】:

我已经尝试了一个多星期,但我无法根据触摸正确旋转布局(相对)。我需要设置旋转角度,以便当我在布局左下角移动手指时布局旋转(其中有一个小图像)。基本上我有一个带有贴纸图像的相对布局。我可以通过触摸布局的各个角来拖动和缩放贴纸(图像),但我无法正确旋转它。有人可以帮我设置旋转角度,以便整个布局可以顺利旋转吗?

这里是代码sn-p

            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN: {
                lastTouchedScaleXPosition = event.getX();
                lastTouchedScaleYPosition = event.getY();

                if(previousXPosition == 0 && previousYPosition == 0){

                    int[] viewLocation = new int[2];
                    v.getLocationOnScreen(viewLocation);
                    previousXPosition= viewLocation[0];
                    previousYPosition= viewLocation[1];

                }
                break;
            }

            case MotionEvent.ACTION_MOVE: {

                currentTouchedXPosition = event.getX() - lastTouchedScaleXPosition;
                currentTouchedYPosition = event.getY() - lastTouchedScaleYPosition;

                currentXPosition = previousXPosition + currentTouchedXPosition;
                currentYPosition = previousYPosition + currentTouchedYPosition;


                RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.parent);
                int w =  mainLayout.getWidth();
                int h =  mainLayout.getHeight();

                float center_x = 0;
                float center_y = 0;
                center_x +=  w/2;
                center_y +=  h/2;

                double tx = currentXPosition - center_x, ty = currentYPosition - center_y;
                double t_length = Math.sqrt(tx*tx + ty*ty);
                double a = Math.toDegrees(Math.acos(ty / t_length));

                mainLayout.setRotation((float) a);

                mainLayout.setTranslationX((w - h) / 2);
                mainLayout.setTranslationY((h - w) / 2);

                ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) mainLayout.getLayoutParams();
                lp.height = w;
                lp.width =  h;

                parent.setLayoutParams(lp);


                previousXPosition = currentXPosition;
                previousYPosition = currentYPosition;

                break;
            }
        }
        return true;
    }

`

【问题讨论】:

  • 在哪里/如何初始化“lastTouchedXPosition”?在'case ...ACTION_DOWN'部分我只能看到'lastTouchedScaleXPosition'
  • 抱歉混淆了 lastTouchedScaleXPosition 和 lastTouchedScaleYPosition
  • 同时我基本上也能够检测到逆时针旋转。但是,即使我使用了 AsyncTask,我也无法摆脱闪烁,并且旋转检测也不可靠。所以我会删除我的答案,因为我对一半的解决方案不满意。
  • 有没有更好的计算旋转角度的方法?
  • 数学部分似乎很简单,但 Java 并不是最快的语言,每次用户移动手指时您都会进行大量计算。加上动画的重绘。我确定我做不到,但我想知道一个解决方案。

标签: android android-layout rotation


【解决方案1】:

尝试了很多东西,但没有得到想要的结果。这个链接帮助我解决了这个问题。 rotate and resize the image view with single finger in android

来源链接https://github.com/ryanch741/android-view-rotate-zoom-single-finger

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多