如何在不使用设置重力选项的情况下将框架布局中的FAB设置到屏幕底部

时间:2017-09-11 15:44:32

标签: android drag-and-drop ontouchlistener

我试图向FAB添加一个触摸侦听器,以便我可以将其拖动到FrameLayout中的任何位置,我的触摸侦听器工作正常但FAB的默认位置位于屏幕顶部,我希望它位于屏幕的右下角。

如果我将引力设置为底部,我的触控器无法工作,如何动态获取它?

下面是我的工作代码

布局代码

```

private int mTopMargin = 300;
mFab = (FloatingActionButton) findViewById(R.id.dash_fab);

FrameLayout.LayoutParams lpDraggableView = new 
FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, 
FrameLayout.LayoutParams.WRAP_CONTENT);

mFab.setLayoutParams(lpDraggableView);

mFab.setOnTouchListener(OnTouchToDrag);

public View.OnTouchListener OnTouchToDrag = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        FrameLayout.LayoutParams dragParam = (FrameLayout.LayoutParams) v.getLayoutParams();
        switch (event.getAction()) {
            case MotionEvent.ACTION_MOVE: {
                if (((int) event.getRawY() - (v.getHeight() + mTopMargin)) > 0) {
                    dragParam.topMargin = (int) event.getRawY() - (v.getHeight() + mTopMargin);
                    TCLog.d("Custom", "topMargin" + ((int) event.getRawY() - (v.getHeight() + mTopMargin)));
                    dragParam.leftMargin = (int) event.getRawX() - (v.getWidth());
                    v.setLayoutParams(dragParam);
                }
                break;
            }
            case MotionEvent.ACTION_UP: {
                //  dragParam.height = 150;
                //  dragParam.width = 150;
                dragParam.height = v.getHeight();
                dragParam.width = v.getWidth();
                dragParam.topMargin = (int) event.getRawY() - (v.getHeight() + mTopMargin);
                dragParam.leftMargin = (int) event.getRawX() - (v.getWidth() / 2);
                v.setLayoutParams(dragParam);
                break;
            }
            case MotionEvent.ACTION_DOWN: {

                break;
            }
        }
        return true;
    }

};

```

活动 ```

DisplayMetrics displayMetrics = getBaseContext().getResources().getDisplayMetrics();

float dpHeight = displayMetrics.heightPixels ;
float dpWidth = displayMetrics.widthPixels ; 
lpDraggableView.topMargin = dpHeight;
lpDraggableView.leftMargin = dpWIdth;
mFab.setLayoutParams(lpDraggableView);

即使我尝试动态设置布局参数,它也会离开屏幕。 ```

{{1}}

```

1 个答案:

答案 0 :(得分:0)

如果你不想使用Gravity,你应该自己计算位置。

在onResume方法中获得更好的效果,其中布局膨胀和测量已经完成。

如果你想进行onCreate,你可以使用显示宽度和高度。

如果您有自定义视图,则可以将计算代码放在onMeasure方法中。