Java 用户重新定位浮动操作按钮
最后,我找到了浮动动作按钮示例教程 链接: 现在我想允许用户将操作按钮移动到屏幕上的任何位置。然后,他可能会打开它并选择其中一个选项 上次我用视图对象而不是浮动ActionButton对象做了同样的事情,效果非常好。使用浮动操作按钮,它没有脱落 我做了两次尝试 1) 在第一个例子中,我将SetOnTouchListLiner设置为LayoutFater对象(就像我的视图示例中那样),但我唯一能做的就是向左或向右滑动屏幕,然后将按钮稍微向右或向左移动。当我按下按钮然后移动时,什么也没发生 2) 我还尝试将setOnTouchListiner直接设置为FloatingActionButton,但它甚至没有显示 我如何让用户移动浮动动作按钮 下面是查看对象的代码,下面是我尝试使用FloatingActionButton的第1次尝试 还有一句话:FlyingButton扩展服务,MaterialDesignDialog扩展活动。那是故意的。一般来说,我希望所有系统图标上都有一个按钮。由于MaterialDesignDialog不能按我所希望的那样工作,我扩展了Activity类,因为我怀疑问题出在扩展服务中 查看对象Java 用户重新定位浮动操作按钮,java,android,android-studio,material-design,floating-action-button,Java,Android,Android Studio,Material Design,Floating Action Button,最后,我找到了浮动动作按钮示例教程 链接: 现在我想允许用户将操作按钮移动到屏幕上的任何位置。然后,他可能会打开它并选择其中一个选项 上次我用视图对象而不是浮动ActionButton对象做了同样的事情,效果非常好。使用浮动操作按钮,它没有脱落 我做了两次尝试 1) 在第一个例子中,我将SetOnTouchListLiner设置为LayoutFater对象(就像我的视图示例中那样),但我唯一能做的就是向左或向右滑动屏幕,然后将按钮稍微向右或向左移动。当我按下按钮然后移动时,什么也没发生 2) 我
public class FlyingButton extends Service {
private WindowManager windowManager;
public Dialog dialog;
View layout,dialogLayout;
int ciekawyX, ciekawyY;
ImageView button1,button2,button3,button_cross;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
setTheme(R.style.AppTheme);
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
layout = inflater.inflate(R.layout.activity_main, null);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.START;
params.x = 0;
params.y = 0;
windowManager.addView(layout, params);
try {
layout.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
float move_X_axis,move_Y_axis;
@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//Log.e("ACTION_DOWN","1");
initialX = paramsF.x;
initialY = paramsF.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
//Log.e("ACTION_UP","2");
if( (move_X_axis < 0.1) && (move_Y_axis < 0.1) ) {
if (layout.getWindowToken() != null) {
//windowManager.removeView(layout);
Log.e(""+move_X_axis,""+move_Y_axis);
CustomDialog();
}
}
break;
case MotionEvent.ACTION_MOVE:
//Log.e("ACTION_MOVE","3");
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(layout, paramsF);
move_X_axis = event.getRawX() - initialTouchX;
move_Y_axis = event.getRawY() - initialTouchY;
ciekawyX = paramsF.x;
ciekawyY = paramsF.y;
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
//if (chatHead != null) windowManager.removeView(chatHead);
}
public void CustomDialog(){
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
dialogLayout = inflater.inflate(R.layout.dialogbox, null);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.START;
params.x = ciekawyX;
params.y = ciekawyY;
if(layout.getWindowToken() != null) {
windowManager.removeView(layout);
//}
//if(dialogLayout.getWindowToken() != null){
windowManager.addView(dialogLayout, params);
}
button1 = (ImageView) dialogLayout.findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
Log.e("BRAWO","KLIKNALES BUTTON1");
}
});
button2 = (ImageView) dialogLayout.findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
Log.e("BRAWO","KLIKNALES BUTTON2");
}
});
button3 = (ImageView) dialogLayout.findViewById(R.id.button3);
button3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
Log.e("BRAWO","KLIKNALES BUTTON3");
}
});
button_cross = (ImageView) dialogLayout.findViewById(R.id.cross_button);
button_cross.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v)
{
if(dialogLayout.getWindowToken() != null) {
windowManager.removeView(dialogLayout);
//}
//if(dialogLayout.getWindowToken() != null){
windowManager.addView(layout, params);
}
}
});
}
}
我已经在我的项目中实现了这种类型的浮动按钮。我认为您的问题是由于
LayoutInflater
。不要在WindowManager
中设置包含浮动按钮的视图。将浮动按钮直接设置到您的WindowManager
以下是我的代码,它对我很有效:
public class notificationService extends Service{
private WindowManager windowManager;
WindowManager.LayoutParams params;
FloatingActionButton Abutton;
Context context;
public FloatingActionMenu menu;
private final IBinder noteBind = new NotificationBinder();
@Override
public boolean onUnbind(Intent intent){
return false;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return noteBind;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Abutton = new FloatingActionButton(this);
Abutton.setProgress(0,true);
Abutton.setColorNormal(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColor,null));
Abutton.setColorPressed(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorPressed,null));
Abutton.setColorRipple(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorRipple,null));
Abutton.setImageResource(R.mipmap.pause_note);
Abutton.setX(25);
Abutton.setOnClickListener(new View.OnClickListener() { //set onclick events here
@Override
public void onClick(View view) {
// Handle your onClick event here.
}
});
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(Abutton,params); //directly add your floating button here.
try {
Abutton.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Get current time in nano seconds.
initialX = paramsF.x;
initialY = paramsF.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(Abutton, paramsF);
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (Abutton != null) windowManager.removeView(Abutton);
}
}
我只通过编程实现了这个按钮。因此,没有用于此的xml布局。希望这对您有所帮助:)不幸的是,您的解决方案不起作用。按钮甚至没有出现。我也找不到您设置为按钮的方法。它是:setProgress()、setColorNormal()、setColorPressed()、setColorRipple()。这些问题无法解决。也许我们讨论不同的浮动动作按钮?我已经实现了这个浮动按钮。我发现在你的链接中,这个按钮也有描述。你添加了正确的依赖项吗?是的,我添加了<代码>依赖项{compilefiletree(dir:'libs',include:['*.jar'])testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.1.0'compile'com.android.support:design:23.1.0'compile'com.github.clans:fab:1.6.2'}那么问题出在哪里?你能添加错误日志吗?那是我的错。我导入了android.support.design.widget.FloatingActionButton而不是com.github.clans.fab.FloatingActionButton。现在可以看到方法,但是当谈到getColor方法时,它会说:
Error:(68,47)Error:非静态方法getColor(参考资料,int,Resources.Theme)不能从静态上下文引用
public class notificationService extends Service{
private WindowManager windowManager;
WindowManager.LayoutParams params;
FloatingActionButton Abutton;
Context context;
public FloatingActionMenu menu;
private final IBinder noteBind = new NotificationBinder();
@Override
public boolean onUnbind(Intent intent){
return false;
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return noteBind;
}
@Override
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Abutton = new FloatingActionButton(this);
Abutton.setProgress(0,true);
Abutton.setColorNormal(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColor,null));
Abutton.setColorPressed(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorPressed,null));
Abutton.setColorRipple(ResourcesCompat.getColor(getResources(),R.color.floatingButtonColorRipple,null));
Abutton.setImageResource(R.mipmap.pause_note);
Abutton.setX(25);
Abutton.setOnClickListener(new View.OnClickListener() { //set onclick events here
@Override
public void onClick(View view) {
// Handle your onClick event here.
}
});
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(Abutton,params); //directly add your floating button here.
try {
Abutton.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Get current time in nano seconds.
initialX = paramsF.x;
initialY = paramsF.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(Abutton, paramsF);
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
@Override
public void onDestroy() {
super.onDestroy();
if (Abutton != null) windowManager.removeView(Abutton);
}
}