The*_*One 2 android drag-and-drop imagebutton android-studio
我有这个使用服务激活的覆盖按钮.所以它是一个背景按钮.即使其他程序正在运行,您也可以看到该按钮.但是我在按钮上添加功能时遇到问题,当我按住它时,我可以将它拖到我想要的任何地方到屏幕上.我在这里检查了一些拖放选项,但我无法在我的程序中正确应用它.
在我的dragDrop()方法上,由于以下强制转换错误,它不起作用:
error(WindowManagerLayoutParams could not be cast on Freamelayout.LayoutParams)..
这是我的服务代码:
public class MainPowerAndVolumeService extends Service {
private ViewGroup mView;
private LayoutInflater inflater;
private ImageButton mainButton;
private Button testButton;
@Override
public IBinder
onBind(Intent intent) {
return null;
}
public void onCreate( ) {
super.onCreate();
/*This will make your window or layout to be overlay and of course you can click the buttons*/
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT
);
/*This will load the main.xml view through inflate*/
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mView = (ViewGroup) inflater.inflate(R.layout.main, null);
mainButton =(ImageButton) mView.findViewById(R.id.MainButton);
wm.addView(mView,params);
buttonListener();
dragDrop( );
}
public void dragDrop(){
mainButton.setOnTouchListener(new View.OnTouchListener() {
int prevX,prevY;
/**this does not work since framelayout could not be cast to the Window Manager**/
@Override
public boolean onTouch(final View v, final MotionEvent event) {
final FrameLayout.LayoutParams par = (FrameLayout.LayoutParams) v.getLayoutParams();
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE: {
par.topMargin += (int) event.getRawY() - prevY;
prevY = (int) event.getRawY();
par.leftMargin += (int) event.getRawX() - prevX;
prevX = (int) event.getRawX();
v.setLayoutParams(par);
return true;
}
case MotionEvent.ACTION_UP: {
par.topMargin += (int) event.getRawY() - prevY;
par.leftMargin += (int) event.getRawX() - prevX;
v.setLayoutParams(par);
return true;
}
case MotionEvent.ACTION_DOWN: {
prevX = (int) event.getRawX();
prevY = (int) event.getRawY();
par.bottomMargin = -2 * v.getHeight();
par.rightMargin = -2 * v.getWidth();
v.setLayoutParams(par);
return true;
}
}
return false;
}
});
}
public void buttonListener(){
mainButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Intent intent = Intent.
Toast.makeText(MainPowerAndVolumeService.this,
"ImageButton (selector) is clicked!",
Toast.LENGTH_SHORT).show();
}
});
}
public void onDestroy(){
super.onDestroy();
((WindowManager) getSystemService(WINDOW_SERVICE)).removeView(mView);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
你必须设置params.gravity为Gravity.TOP | Gravity.LEFT.将其设置为params首次初始化视图时以及在更新视图时的设置OnTouchListener.这是代码:
mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_DOWN)
{
/* You can play around with the offset to set where you want the users finger to be on the view. Currently it should be centered.*/
xOffset = v.getWidth()/2;
yOffset = v.getHeight()/2;
x = (int) event.getRawX() - xOffset;
y = (int) event.getRawY() - yOffset;
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
x,y,
WindowManager.LayoutParams.TYPE_PHONE ,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity. LEFT;
wm.updateViewLayout(mView, params);
return true;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
如果你想保存它,以便当用户重新加载你的应用程序时你的按钮显示在同一个位置,只需在OnTouchListeners中为x和y设置一个SharedPreference ACTION_UP.然后调用它们并params在第一次初始化视图时将它们插入到您的视图中.
| 归档时间: |
|
| 查看次数: |
2772 次 |
| 最近记录: |