我试图向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}}
```
答案 0 :(得分:0)
如果你不想使用Gravity,你应该自己计算位置。
在onResume方法中获得更好的效果,其中布局膨胀和测量已经完成。
如果你想进行onCreate,你可以使用显示宽度和高度。
如果您有自定义视图,则可以将计算代码放在onMeasure方法中。