setTranslationX和setTranslationY在Android中使Button的位置错误。为什么?

时间:2016-09-14 15:14:08

标签: android android-layout android-widget

我有两个按钮:1和2.第一个按钮位于布局的中心,第二个按钮将使用setTranslationX and setTranslationY进行翻译。代码是

    btn1 = (Button) findViewById(R.id.btn1);
    setRotateButton(btn1,2,1);
    btn2 = (Button) findViewById(R.id.btn2);
    setRotateButton(btn2,2,2);

其中setRotateButton

public void setRotateButton(Button btn,int numViews,int index)
{
    //Locate button in center
    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(130, 130);
    lp.gravity = Gravity.CENTER;
    btn.setLayoutParams(lp);
    //Translation
    if (index>1) //To avoid first case
    {
        float angleDeg = index * 360.0f / numViews - 90.0f;
        float angleRad = (float)(angleDeg * Math.PI / 180.0f);
        btn.setTranslationX(400 * (float)Math.cos(angleRad));
        btn.setTranslationY(400 * (float)Math.sin(angleRad));
    }    
}

我发现了一个问题,当我使用setTranslationX,setTranslationY时,按钮2的位置可以转换到另一个位置,但是按钮2的位置输入错误。它总是返回相同的值。检查一下。我使用onTouch方法(mainFrame是一个包含这两个按钮的FrameLayout)。你能帮我修一下setRotateButton中的功能吗?非常感谢你。

 @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();

        mainFrame.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {

                int x = (int) event.getX();
                int y = (int) event.getY();

                for (int i = 0; i < mainFrame.getChildCount(); i++) {
                    View current = mainFrame.getChildAt(i);
                    if (current instanceof Button) {
                        Button b = (Button) current;
                        Log.d("TAG","Btn pos:"+String.valueOf(b.getLeft())+";"+String.valueOf(b.getRight())+";"+String.valueOf(b.getTop())+";"+String.valueOf(b.getBottom()));
                        if (!isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(),
                                b.getBottom())) {
                            b.getBackground().setState(defaultStates);
                            b.getBackground().setAlpha(255);

                        }

                        if (isPointWithin(x, y, b.getLeft(), b.getRight(), b.getTop(),
                                b.getBottom())) {
                            b.getBackground().setState(STATE_PRESSED);
                            b.getBackground().setAlpha(150);
                            b.performClick();

                            if (b != mLastButton) {
                                mLastButton = b;

                            }
                        }

                    }

                }
                return true;
            }

        });

    }

这是日志结果

当我在按钮1内移动手指并移到外面时

09-15 00:15:50.981 20547-20547/com.example.circlelayout D/TAG: Btn pos:0;150;300;450
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615

当我在按钮2内移动手指并向外移动时。它们是相同的值

09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615
09-15 00:01:40.891 20547-20547/com.example.circlelayout D/TAG: Btn pos:397;527;485;615

1 个答案:

答案 0 :(得分:2)

getLeft()等方法未考虑View已翻译。它们总是返回在布局过程中计算的初始值。

因此,您需要使用getX()getY()来计算新的右下角。例如:

int bX = b.getX();
intbY = b.getY();

if (isPointWithin(x, y,
             bX, bX + (b.getRight() - b.getLeft()),
             bY, bY + (b.getBottom() - b.getTop()) ) )
{
     b.getBackground().setState(STATE_PRESSED);
     b.getBackground().setAlpha(150);
     b.performClick();

     if (b != mLastButton) {
         mLastButton = b;
     }
}