Java 用户重新定位浮动操作按钮

Java 用户重新定位浮动操作按钮,java,android,android-studio,material-design,floating-action-button,Java,Android,Android Studio,Material Design,Floating Action Button,最后,我找到了浮动动作按钮示例教程 链接: 现在我想允许用户将操作按钮移动到屏幕上的任何位置。然后,他可能会打开它并选择其中一个选项 上次我用视图对象而不是浮动ActionButton对象做了同样的事情,效果非常好。使用浮动操作按钮,它没有脱落 我做了两次尝试 1) 在第一个例子中,我将SetOnTouchListLiner设置为LayoutFater对象(就像我的视图示例中那样),但我唯一能做的就是向左或向右滑动屏幕,然后将按钮稍微向右或向左移动。当我按下按钮然后移动时,什么也没发生 2) 我

最后,我找到了浮动动作按钮示例教程

链接:

现在我想允许用户将操作按钮移动到屏幕上的任何位置。然后,他可能会打开它并选择其中一个选项

上次我用视图对象而不是浮动ActionButton对象做了同样的事情,效果非常好。使用浮动操作按钮,它没有脱落

我做了两次尝试

1) 在第一个例子中,我将SetOnTouchListLiner设置为LayoutFater对象(就像我的视图示例中那样),但我唯一能做的就是向左或向右滑动屏幕,然后将按钮稍微向右或向左移动。当我按下按钮然后移动时,什么也没发生

2) 我还尝试将setOnTouchListiner直接设置为FloatingActionButton,但它甚至没有显示

我如何让用户移动浮动动作按钮

下面是查看对象的代码,下面是我尝试使用FloatingActionButton的第1次尝试

还有一句话:FlyingButton扩展服务,MaterialDesignDialog扩展活动。那是故意的。一般来说,我希望所有系统图标上都有一个按钮。由于MaterialDesignDialog不能按我所希望的那样工作,我扩展了Activity类,因为我怀疑问题出在扩展服务中

查看对象

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);
}
}