Android WindowManager触摸屏上的类型\系统\警报布局
我的应用程序会在特定时间向用户显示一个按钮,作为类型\系统\警报,我正在尝试让用户移动它。触摸和移动动作会记录以下代码,但按钮不会移动。我错过了什么Android WindowManager触摸屏上的类型\系统\警报布局,android,move,ontouchlistener,layoutparams,window-managers,Android,Move,Ontouchlistener,Layoutparams,Window Managers,我的应用程序会在特定时间向用户显示一个按钮,作为类型\系统\警报,我正在尝试让用户移动它。触摸和移动动作会记录以下代码,但按钮不会移动。我错过了什么 //create button mbtRec = new Button(ACR.getContext()); mbtRec.setText(R.string.start_recording); mbtRec.setTypeface(null, Typeface.BOLD); mbtRec.setBackgr
//create button
mbtRec = new Button(ACR.getContext());
mbtRec.setText(R.string.start_recording);
mbtRec.setTypeface(null, Typeface.BOLD);
mbtRec.setBackgroundColor(Color.RED); //mbtRec.setBackgroundResource(R.drawable.ic_launcher);
mbtRec.setOnClickListener(recButtonOnClickListener);
mbtRec.setOnTouchListener(recButtonOnTouchListener);
//create layout params
recButtonLayoutParams = new WindowManager.LayoutParams();
recButtonLayoutParams.flags = WindowManager.LayoutParams.FORMAT_CHANGED; //8
recButtonLayoutParams.format = PixelFormat.RGBA_8888; //PixelFormat.TRANSLUCENT
recButtonLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
recButtonLayoutParams.gravity = Gravity.TOP | Gravity.CENTER; //51
recButtonLayoutParams.width = WindowManager.LayoutParams.FILL_PARENT;
recButtonLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
paramWindowManager.addView(this.mbtRec, recButtonLayoutParams);
OnTouchListener recButtonOnTouchListener = new View.OnTouchListener() {
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
Tools.Log("Drag", "Started Dragging");
break;
case MotionEvent.ACTION_UP:
Tools.Log("Drag", "Stopped Dragging");
break;
case MotionEvent.ACTION_MOVE:
Tools.Log("Drag", "Dragging");
recButtonLayoutParams.x =(int) event.getRawX();
recButtonLayoutParams.y= (int) event.getRawY();
mbtRec.setLayoutParams(recButtonLayoutParams);
mbtRec.invalidate();
break;
default:
break;
}
return false;
}
};
我认为您需要使用
mbtRec.postInvalidate()
,和删除gravity
,因为您更改了WindowManager的布局参数,而不是调用:
mbtRec.setLayoutParams(recButtonLayoutParams);
mbtRec.invalidate();
你应致电:
paramWindowManager.updateLayout(this.mbtRec, recButtonLayoutParams);
在ACTION\u MOVE案例的末尾。我正在做类似的事情,但使用了marginLeft和marginTop。 更改布局后,需要调用
windowManager.updateViewLayout(recButton, recButtonLayoutParams);
您可以将按钮设置为适合屏幕
recButtonLayoutParams.width = WindowManager.LayoutParams.FILL_PARENT;
所以你不能在x方向移动它
除非其父对象被设置为“包裹内容”,否则它也会阻止您在Y方向移动它
这就是我所看到的,希望这能有所帮助。我已经通过@yoah的提示和10天的更多研究,成功地得到了我想要的。我必须把@pingpongboss()的回复添加到我的电子邮件中,这对我帮助很大 下面是我在我的通话记录应用程序中提出和实现的内容
我在这个问题上悬赏了。我需要一个解决上述问题的方案,以便用户可以在屏幕上移动/拖动按钮。您没有尝试改用它吗?我知道,但它是用于活动的。我已经有服务把按钮放在屏幕上了。我所要做的就是能够移动它,改变是什么?你能解释一下吗?除了这件事,几乎所有的事情都不一样。请回顾我的回答谢谢!这对我帮助很大!谢谢你!!我的触觉有点像手推车。你的代码解决了我的问题。你的回答真的帮了我很大的忙。再次感谢你,老兄
private WindowManager recButtonWindowManager;
private Button recButton = null;
WindowManager.LayoutParams prms;
boolean touchconsumedbyMove = false;
int recButtonLastX;
int recButtonLastY;
int recButtonFirstX;
int recButtonFirstY;
OnTouchListener recButtonOnTouchListener = new View.OnTouchListener() {
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public boolean onTouch(View v, MotionEvent event) {
WindowManager.LayoutParams prm = getRecbuttonLayout();
int totalDeltaX = recButtonLastX - recButtonFirstX;
int totalDeltaY = recButtonLastY - recButtonFirstY;
switch(event.getActionMasked())
{
case MotionEvent.ACTION_DOWN:
recButtonLastX = (int) event.getRawX();
recButtonLastY = (int) event.getRawY();
recButtonFirstX = recButtonLastX;
recButtonFirstY = recButtonLastY;
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) event.getRawX() - recButtonLastX;
int deltaY = (int) event.getRawY() - recButtonLastY;
recButtonLastX = (int) event.getRawX();
recButtonLastY = (int) event.getRawY();
if (Math.abs(totalDeltaX) >= 5 || Math.abs(totalDeltaY) >= 5) {
if (event.getPointerCount() == 1) {
prm.x += deltaX;
prm.y += deltaY;
touchconsumedbyMove = true;
recButtonWindowManager.updateViewLayout(getManualRecButton(), prm);
}
else{
touchconsumedbyMove = false;
}
}else{
touchconsumedbyMove = false;
}
break;
default:
break;
}
return touchconsumedbyMove;
}
};
private WindowManager.LayoutParams getRecbuttonLayout() {
if (prms != null) {
return prms;
}
prms = new WindowManager.LayoutParams();
prms.format = PixelFormat.TRANSLUCENT;
prms.flags = LayoutParams.FORMAT_CHANGED; // 8
prms.type = LayoutParams.TYPE_SYSTEM_ALERT;
prms.gravity = Gravity.TOP | Gravity.CENTER;
prms.width = LayoutParams.WRAP_CONTENT;
prms.height = LayoutParams.WRAP_CONTENT;
// Tools.Log("getRecbuttonLayout", "return getRecbuttonLayout()");
return prms;
}
private Button getManualRecButton() {
if (recButton != null) {
return recButton;
}
recButton = new Button(ACR.getContext());
recButton.setText(R.string.start_recording);
recButton.setTypeface(null, Typeface.BOLD);
recButton.setGravity(Gravity.CENTER_VERTICAL);
recButton.setBackgroundColor(Color.parseColor("#65FF0000"));
recButton.setPadding(100, 30, 100, 30);
recButton.setOnClickListener(recButtonOnClickListener);
recButton.setOnTouchListener(recButtonOnTouchListener);
return recButton;
}