Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)
2018-02-27 16:15
731 查看
Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)Android CircularFloatingActionMenu另外一个不同寻常的地方是,Android CircularFloatingActionMenu可以写在服务Service里面,然后通过上层一个Activity启动这个服务,然后就可以作为Android系统级悬浮按钮悬浮在系统的桌面上使用,这在一些常见的安全软件中很常见,比如,一些安全软件常驻桌面,为用户实时提供流量监控等等这些数据检测或者开关按钮。
现在使用Android CircularFloatingActionMenu实现该功能。
Java代码,其实这里只是写一个后台Service即可,该Service将被其他组件调用:[java] view plain copyimport android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
//import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
//import android.widget.TextView;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
public class SystemOverlayMenuService extends Service {
private final IBinder mBinder = new LocalBinder();
//下方白色+号小按钮
private FloatingActionButton rightLowerButton;
//顶部中心位置的大红色星号按钮
private FloatingActionButton topCenterButton;
private FloatingActionMenu rightLowerMenu;
private FloatingActionMenu topCenterMenu;
private boolean serviceWillBeDismissed;
public SystemOverlayMenuService() {
}
public class LocalBinder extends Binder {
SystemOverlayMenuService getService() {
// Return this instance of LocalService so clients can call public methods
return SystemOverlayMenuService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
serviceWillBeDismissed = false;
// Set up the white button on the lower right corner
// more or less with default parameter
ImageView fabIconNew = new ImageView(this);
fabIconNew.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_new_light));
WindowManager.LayoutParams params = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
//右边下方小按钮
rightLowerButton = new FloatingActionButton.Builder(this)
.setContentView(fabIconNew)
.setSystemOverlay(true) //使该按钮作为系统悬浮按钮显示在设备屏幕上
.setLayoutParams(params)
.build();
SubActionButton.Builder rLSubBuilder = new SubActionButton.Builder(this);
ImageView rlIcon1 = new ImageView(this);
ImageView rlIcon2 = new ImageView(this);
ImageView rlIcon3 = new ImageView(this);
ImageView rlIcon4 = new ImageView(this);
rlIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_chat_light));
rlIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera_light));
rlIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video_light));
rlIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_place_light));
// Build the menu with default options: light theme, 90 degrees, 72dp radius.
// Set 4 default SubActionButtons
SubActionButton rlSub1 = rLSubBuilder.setContentView(rlIcon1).build();
SubActionButton rlSub2 = rLSubBuilder.setContentView(rlIcon2).build();
SubActionButton rlSub3 = rLSubBuilder.setContentView(rlIcon3).build();
SubActionButton rlSub4 = rLSubBuilder.setContentView(rlIcon4).build();
rightLowerMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(rlSub1, rlSub1.getLayoutParams().width, rlSub1.getLayoutParams().height)
.addSubActionView(rlSub2, rlSub2.getLayoutParams().width, rlSub2.getLayoutParams().height)
.addSubActionView(rlSub3, rlSub3.getLayoutParams().width, rlSub3.getLayoutParams().height)
.addSubActionView(rlSub4, rlSub4.getLayoutParams().width, rlSub4.getLayoutParams().height)
.setStartAngle(180)
.setEndAngle(270)
.attachTo(rightLowerButton)
.build();
//创建居于设备顶部居中的大红色按钮
// Set up the large red button on the top center side
// With custom button and content sizes and margins
int redActionButtonSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_size);
int redActionButtonMargin = getResources().getDimensionPixelOffset(R.dimen.action_button_margin);
int redActionButtonContentSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_size);
int redActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_margin);
int redActionMenuRadius = getResources().getDimensionPixelSize(R.dimen.red_action_menu_radius);
int blueSubActionButtonSize = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_size);
int blueSubActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_content_margin);
ImageView fabIconStar = new ImageView(this);
fabIconStar.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_important));
FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(redActionButtonContentSize, redActionButtonContentSize);
fabIconStarParams.setMargins(redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin);
WindowManager.LayoutParams params2 = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
params2.width = redActionButtonSize;
params2.height = redActionButtonSize;
topCenterButton = new FloatingActionButton.Builder(this)
.setSystemOverlay(true)
.setContentView(fabIconStar, fabIconStarParams)
.setBackgroundDrawable(R.drawable.button_action_red_selector)
.setPosition(FloatingActionButton.POSITION_TOP_CENTER) //顶部中心位置
.setLayoutParams(params2)
.build();
//为顶部中心位置的大红色按钮增加弹出的子菜单
// Set up customized SubActionButtons for the right center menu
SubActionButton.Builder tCSubBuilder = new SubActionButton.Builder(this);
tCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));
//小红色关闭叉子那个按钮Builder
SubActionButton.Builder tCRedBuilder = new SubActionButton.Builder(this);
tCRedBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_red_selector));
FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
blueContentParams.setMargins(blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin);
// Set custom layout params
FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize, blueSubActionButtonSize);
tCSubBuilder.setLayoutParams(blueParams);
tCRedBuilder.setLayoutParams(blueParams);
ImageView tcIcon1 = new ImageView(this);
ImageView tcIcon2 = new ImageView(this);
ImageView tcIcon3 = new ImageView(this);
ImageView tcIcon4 = new ImageView(this);
ImageView tcIcon5 = new ImageView(this);
ImageView tcIcon6 = new ImageView(this);
tcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
tcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
tcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
tcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
tcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
tcIcon6.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_cancel));
SubActionButton tcSub1 = tCSubBuilder.setContentView(tcIcon1, blueContentParams).build();
SubActionButton tcSub2 = tCSubBuilder.setContentView(tcIcon2, blueContentParams).build();
SubActionButton tcSub3 = tCSubBuilder.setContentView(tcIcon3, blueContentParams).build();
SubActionButton tcSub4 = tCSubBuilder.setContentView(tcIcon4, blueContentParams).build();
SubActionButton tcSub5 = tCSubBuilder.setContentView(tcIcon5, blueContentParams).build();
SubActionButton tcSub6 = tCRedBuilder.setContentView(tcIcon6, blueContentParams).build();
// Build another menu with custom options
topCenterMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(tcSub1, tcSub1.getLayoutParams().width, tcSub1.getLayoutParams().height)
.addSubActionView(tcSub2, tcSub2.getLayoutParams().width, tcSub2.getLayoutParams().height)
.addSubActionView(tcSub3, tcSub3.getLayoutParams().width, tcSub3.getLayoutParams().height)
.addSubActionView(tcSub4, tcSub4.getLayoutParams().width, tcSub4.getLayoutParams().height)
.addSubActionView(tcSub5, tcSub5.getLayoutParams().width, tcSub5.getLayoutParams().height)
.addSubActionView(tcSub6, tcSub6.getLayoutParams().width, tcSub6.getLayoutParams().height)
.setRadius(redActionMenuRadius)
.setStartAngle(0)
.setEndAngle(180)
.attachTo(topCenterButton)
.build();
topCenterMenu.setStateChangeListener(new FloatingActionMenu.MenuStateChangeListener() {
@Override
public void onMenuOpened(FloatingActionMenu menu) {
}
@Override
public void onMenuClosed(FloatingActionMenu menu) {
if(serviceWillBeDismissed) {
SystemOverlayMenuService.this.stopSelf();
serviceWillBeDismissed = false;
}
}
});
// make the red button terminate the service
tcSub6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceWillBeDismissed = true; // the order is important
topCenterMenu.close(true);
}
});
}
@Override
public void onDestroy() {
if(rightLowerMenu != null && rightLowerMenu.isOpen()) rightLowerMenu.close(false);
if(topCenterMenu != null && topCenterMenu.isOpen()) topCenterMenu.close(false);
if(rightLowerButton != null) rightLowerButton.detach();
if(topCenterButton != null) topCenterButton.detach();
super.onDestroy();
}
}
Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)Android CircularFloatingActionMenu另外一个不同寻常的地方是,Android CircularFloatingActionMenu可以写在服务Service里面,然后通过上层一个Activity启动这个服务,然后就可以作为Android系统级悬浮按钮悬浮在系统的桌面上使用,这在一些常见的安全软件中很常见,比如,一些安全软件常驻桌面,为用户实时提供流量监控等等这些数据检测或者开关按钮。
现在使用Android CircularFloatingActionMenu实现该功能。
Java代码,其实这里只是写一个后台Service即可,该Service将被其他组件调用:[java] view plain copyimport android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
//import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
//import android.widget.TextView;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
public class SystemOverlayMenuService extends Service {
private final IBinder mBinder = new LocalBinder();
//下方白色+号小按钮
private FloatingActionButton rightLowerButton;
//顶部中心位置的大红色星号按钮
private FloatingActionButton topCenterButton;
private FloatingActionMenu rightLowerMenu;
private FloatingActionMenu topCenterMenu;
private boolean serviceWillBeDismissed;
public SystemOverlayMenuService() {
}
public class LocalBinder extends Binder {
SystemOverlayMenuService getService() {
// Return this instance of LocalService so clients can call public methods
return SystemOverlayMenuService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
serviceWillBeDismissed = false;
// Set up the white button on the lower right corner
// more or less with default parameter
ImageView fabIconNew = new ImageView(this);
fabIconNew.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_new_light));
WindowManager.LayoutParams params = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
//右边下方小按钮
rightLowerButton = new FloatingActionButton.Builder(this)
.setContentView(fabIconNew)
.setSystemOverlay(true) //使该按钮作为系统悬浮按钮显示在设备屏幕上
.setLayoutParams(params)
.build();
SubActionButton.Builder rLSubBuilder = new SubActionButton.Builder(this);
ImageView rlIcon1 = new ImageView(this);
ImageView rlIcon2 = new ImageView(this);
ImageView rlIcon3 = new ImageView(this);
ImageView rlIcon4 = new ImageView(this);
rlIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_chat_light));
rlIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera_light));
rlIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video_light));
rlIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_place_light));
// Build the menu with default options: light theme, 90 degrees, 72dp radius.
// Set 4 default SubActionButtons
SubActionButton rlSub1 = rLSubBuilder.setContentView(rlIcon1).build();
SubActionButton rlSub2 = rLSubBuilder.setContentView(rlIcon2).build();
SubActionButton rlSub3 = rLSubBuilder.setContentView(rlIcon3).build();
SubActionButton rlSub4 = rLSubBuilder.setContentView(rlIcon4).build();
rightLowerMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(rlSub1, rlSub1.getLayoutParams().width, rlSub1.getLayoutParams().height)
.addSubActionView(rlSub2, rlSub2.getLayoutParams().width, rlSub2.getLayoutParams().height)
.addSubActionView(rlSub3, rlSub3.getLayoutParams().width, rlSub3.getLayoutParams().height)
.addSubActionView(rlSub4, rlSub4.getLayoutParams().width, rlSub4.getLayoutParams().height)
.setStartAngle(180)
.setEndAngle(270)
.attachTo(rightLowerButton)
.build();
//创建居于设备顶部居中的大红色按钮
// Set up the large red button on the top center side
// With custom button and content sizes and margins
int redActionButtonSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_size);
int redActionButtonMargin = getResources().getDimensionPixelOffset(R.dimen.action_button_margin);
int redActionButtonContentSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_size);
int redActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_margin);
int redActionMenuRadius = getResources().getDimensionPixelSize(R.dimen.red_action_menu_radius);
int blueSubActionButtonSize = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_size);
int blueSubActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_content_margin);
ImageView fabIconStar = new ImageView(this);
fabIconStar.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_important));
FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(redActionButtonContentSize, redActionButtonContentSize);
fabIconStarParams.setMargins(redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin);
WindowManager.LayoutParams params2 = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
params2.width = redActionButtonSize;
params2.height = redActionButtonSize;
topCenterButton = new FloatingActionButton.Builder(this)
.setSystemOverlay(true)
.setContentView(fabIconStar, fabIconStarParams)
.setBackgroundDrawable(R.drawable.button_action_red_selector)
.setPosition(FloatingActionButton.POSITION_TOP_CENTER) //顶部中心位置
.setLayoutParams(params2)
.build();
//为顶部中心位置的大红色按钮增加弹出的子菜单
// Set up customized SubActionButtons for the right center menu
SubActionButton.Builder tCSubBuilder = new SubActionButton.Builder(this);
tCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));
//小红色关闭叉子那个按钮Builder
SubActionButton.Builder tCRedBuilder = new SubActionButton.Builder(this);
tCRedBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_red_selector));
FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
blueContentParams.setMargins(blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin);
// Set custom layout params
FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize, blueSubActionButtonSize);
tCSubBuilder.setLayoutParams(blueParams);
tCRedBuilder.setLayoutParams(blueParams);
ImageView tcIcon1 = new ImageView(this);
ImageView tcIcon2 = new ImageView(this);
ImageView tcIcon3 = new ImageView(this);
ImageView tcIcon4 = new ImageView(this);
ImageView tcIcon5 = new ImageView(this);
ImageView tcIcon6 = new ImageView(this);
tcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
tcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
tcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
tcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
tcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
tcIcon6.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_cancel));
SubActionButton tcSub1 = tCSubBuilder.setContentView(tcIcon1, blueContentParams).build();
SubActionButton tcSub2 = tCSubBuilder.setContentView(tcIcon2, blueContentParams).build();
SubActionButton tcSub3 = tCSubBuilder.setContentView(tcIcon3, blueContentParams).build();
SubActionButton tcSub4 = tCSubBuilder.setContentView(tcIcon4, blueContentParams).build();
SubActionButton tcSub5 = tCSubBuilder.setContentView(tcIcon5, blueContentParams).build();
SubActionButton tcSub6 = tCRedBuilder.setContentView(tcIcon6, blueContentParams).build();
// Build another menu with custom options
topCenterMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(tcSub1, tcSub1.getLayoutParams().width, tcSub1.getLayoutParams().height)
.addSubActionView(tcSub2, tcSub2.getLayoutParams().width, tcSub2.getLayoutParams().height)
.addSubActionView(tcSub3, tcSub3.getLayoutParams().width, tcSub3.getLayoutParams().height)
.addSubActionView(tcSub4, tcSub4.getLayoutParams().width, tcSub4.getLayoutParams().height)
.addSubActionView(tcSub5, tcSub5.getLayoutParams().width, tcSub5.getLayoutParams().height)
.addSubActionView(tcSub6, tcSub6.getLayoutParams().width, tcSub6.getLayoutParams().height)
.setRadius(redActionMenuRadius)
.setStartAngle(0)
.setEndAngle(180)
.attachTo(topCenterButton)
.build();
topCenterMenu.setStateChangeListener(new FloatingActionMenu.MenuStateChangeListener() {
@Override
public void onMenuOpened(FloatingActionMenu menu) {
}
@Override
public void onMenuClosed(FloatingActionMenu menu) {
if(serviceWillBeDismissed) {
SystemOverlayMenuService.this.stopSelf();
serviceWillBeDismissed = false;
}
}
});
// make the red button terminate the service
tcSub6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceWillBeDismissed = true; // the order is important
topCenterMenu.close(true);
}
});
}
@Override
public void onDestroy() {
if(rightLowerMenu != null && rightLowerMenu.isOpen()) rightLowerMenu.close(false);
if(topCenterMenu != null && topCenterMenu.isOpen()) topCenterMenu.close(false);
if(rightLowerButton != null) rightLowerButton.detach();
if(topCenterButton != null) topCenterButton.detach();
super.onDestroy();
}
}
现在使用Android CircularFloatingActionMenu实现该功能。
Java代码,其实这里只是写一个后台Service即可,该Service将被其他组件调用:[java] view plain copyimport android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
//import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
//import android.widget.TextView;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
public class SystemOverlayMenuService extends Service {
private final IBinder mBinder = new LocalBinder();
//下方白色+号小按钮
private FloatingActionButton rightLowerButton;
//顶部中心位置的大红色星号按钮
private FloatingActionButton topCenterButton;
private FloatingActionMenu rightLowerMenu;
private FloatingActionMenu topCenterMenu;
private boolean serviceWillBeDismissed;
public SystemOverlayMenuService() {
}
public class LocalBinder extends Binder {
SystemOverlayMenuService getService() {
// Return this instance of LocalService so clients can call public methods
return SystemOverlayMenuService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
serviceWillBeDismissed = false;
// Set up the white button on the lower right corner
// more or less with default parameter
ImageView fabIconNew = new ImageView(this);
fabIconNew.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_new_light));
WindowManager.LayoutParams params = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
//右边下方小按钮
rightLowerButton = new FloatingActionButton.Builder(this)
.setContentView(fabIconNew)
.setSystemOverlay(true) //使该按钮作为系统悬浮按钮显示在设备屏幕上
.setLayoutParams(params)
.build();
SubActionButton.Builder rLSubBuilder = new SubActionButton.Builder(this);
ImageView rlIcon1 = new ImageView(this);
ImageView rlIcon2 = new ImageView(this);
ImageView rlIcon3 = new ImageView(this);
ImageView rlIcon4 = new ImageView(this);
rlIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_chat_light));
rlIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera_light));
rlIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video_light));
rlIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_place_light));
// Build the menu with default options: light theme, 90 degrees, 72dp radius.
// Set 4 default SubActionButtons
SubActionButton rlSub1 = rLSubBuilder.setContentView(rlIcon1).build();
SubActionButton rlSub2 = rLSubBuilder.setContentView(rlIcon2).build();
SubActionButton rlSub3 = rLSubBuilder.setContentView(rlIcon3).build();
SubActionButton rlSub4 = rLSubBuilder.setContentView(rlIcon4).build();
rightLowerMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(rlSub1, rlSub1.getLayoutParams().width, rlSub1.getLayoutParams().height)
.addSubActionView(rlSub2, rlSub2.getLayoutParams().width, rlSub2.getLayoutParams().height)
.addSubActionView(rlSub3, rlSub3.getLayoutParams().width, rlSub3.getLayoutParams().height)
.addSubActionView(rlSub4, rlSub4.getLayoutParams().width, rlSub4.getLayoutParams().height)
.setStartAngle(180)
.setEndAngle(270)
.attachTo(rightLowerButton)
.build();
//创建居于设备顶部居中的大红色按钮
// Set up the large red button on the top center side
// With custom button and content sizes and margins
int redActionButtonSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_size);
int redActionButtonMargin = getResources().getDimensionPixelOffset(R.dimen.action_button_margin);
int redActionButtonContentSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_size);
int redActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_margin);
int redActionMenuRadius = getResources().getDimensionPixelSize(R.dimen.red_action_menu_radius);
int blueSubActionButtonSize = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_size);
int blueSubActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_content_margin);
ImageView fabIconStar = new ImageView(this);
fabIconStar.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_important));
FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(redActionButtonContentSize, redActionButtonContentSize);
fabIconStarParams.setMargins(redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin);
WindowManager.LayoutParams params2 = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
params2.width = redActionButtonSize;
params2.height = redActionButtonSize;
topCenterButton = new FloatingActionButton.Builder(this)
.setSystemOverlay(true)
.setContentView(fabIconStar, fabIconStarParams)
.setBackgroundDrawable(R.drawable.button_action_red_selector)
.setPosition(FloatingActionButton.POSITION_TOP_CENTER) //顶部中心位置
.setLayoutParams(params2)
.build();
//为顶部中心位置的大红色按钮增加弹出的子菜单
// Set up customized SubActionButtons for the right center menu
SubActionButton.Builder tCSubBuilder = new SubActionButton.Builder(this);
tCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));
//小红色关闭叉子那个按钮Builder
SubActionButton.Builder tCRedBuilder = new SubActionButton.Builder(this);
tCRedBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_red_selector));
FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
blueContentParams.setMargins(blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin);
// Set custom layout params
FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize, blueSubActionButtonSize);
tCSubBuilder.setLayoutParams(blueParams);
tCRedBuilder.setLayoutParams(blueParams);
ImageView tcIcon1 = new ImageView(this);
ImageView tcIcon2 = new ImageView(this);
ImageView tcIcon3 = new ImageView(this);
ImageView tcIcon4 = new ImageView(this);
ImageView tcIcon5 = new ImageView(this);
ImageView tcIcon6 = new ImageView(this);
tcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
tcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
tcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
tcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
tcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
tcIcon6.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_cancel));
SubActionButton tcSub1 = tCSubBuilder.setContentView(tcIcon1, blueContentParams).build();
SubActionButton tcSub2 = tCSubBuilder.setContentView(tcIcon2, blueContentParams).build();
SubActionButton tcSub3 = tCSubBuilder.setContentView(tcIcon3, blueContentParams).build();
SubActionButton tcSub4 = tCSubBuilder.setContentView(tcIcon4, blueContentParams).build();
SubActionButton tcSub5 = tCSubBuilder.setContentView(tcIcon5, blueContentParams).build();
SubActionButton tcSub6 = tCRedBuilder.setContentView(tcIcon6, blueContentParams).build();
// Build another menu with custom options
topCenterMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(tcSub1, tcSub1.getLayoutParams().width, tcSub1.getLayoutParams().height)
.addSubActionView(tcSub2, tcSub2.getLayoutParams().width, tcSub2.getLayoutParams().height)
.addSubActionView(tcSub3, tcSub3.getLayoutParams().width, tcSub3.getLayoutParams().height)
.addSubActionView(tcSub4, tcSub4.getLayoutParams().width, tcSub4.getLayoutParams().height)
.addSubActionView(tcSub5, tcSub5.getLayoutParams().width, tcSub5.getLayoutParams().height)
.addSubActionView(tcSub6, tcSub6.getLayoutParams().width, tcSub6.getLayoutParams().height)
.setRadius(redActionMenuRadius)
.setStartAngle(0)
.setEndAngle(180)
.attachTo(topCenterButton)
.build();
topCenterMenu.setStateChangeListener(new FloatingActionMenu.MenuStateChangeListener() {
@Override
public void onMenuOpened(FloatingActionMenu menu) {
}
@Override
public void onMenuClosed(FloatingActionMenu menu) {
if(serviceWillBeDismissed) {
SystemOverlayMenuService.this.stopSelf();
serviceWillBeDismissed = false;
}
}
});
// make the red button terminate the service
tcSub6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceWillBeDismissed = true; // the order is important
topCenterMenu.close(true);
}
});
}
@Override
public void onDestroy() {
if(rightLowerMenu != null && rightLowerMenu.isOpen()) rightLowerMenu.close(false);
if(topCenterMenu != null && topCenterMenu.isOpen()) topCenterMenu.close(false);
if(rightLowerButton != null) rightLowerButton.detach();
if(topCenterButton != null) topCenterButton.detach();
super.onDestroy();
}
}
Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)Android CircularFloatingActionMenu另外一个不同寻常的地方是,Android CircularFloatingActionMenu可以写在服务Service里面,然后通过上层一个Activity启动这个服务,然后就可以作为Android系统级悬浮按钮悬浮在系统的桌面上使用,这在一些常见的安全软件中很常见,比如,一些安全软件常驻桌面,为用户实时提供流量监控等等这些数据检测或者开关按钮。
现在使用Android CircularFloatingActionMenu实现该功能。
Java代码,其实这里只是写一个后台Service即可,该Service将被其他组件调用:[java] view plain copyimport android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
//import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
//import android.widget.TextView;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
public class SystemOverlayMenuService extends Service {
private final IBinder mBinder = new LocalBinder();
//下方白色+号小按钮
private FloatingActionButton rightLowerButton;
//顶部中心位置的大红色星号按钮
private FloatingActionButton topCenterButton;
private FloatingActionMenu rightLowerMenu;
private FloatingActionMenu topCenterMenu;
private boolean serviceWillBeDismissed;
public SystemOverlayMenuService() {
}
public class LocalBinder extends Binder {
SystemOverlayMenuService getService() {
// Return this instance of LocalService so clients can call public methods
return SystemOverlayMenuService.this;
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
serviceWillBeDismissed = false;
// Set up the white button on the lower right corner
// more or less with default parameter
ImageView fabIconNew = new ImageView(this);
fabIconNew.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_new_light));
WindowManager.LayoutParams params = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
//右边下方小按钮
rightLowerButton = new FloatingActionButton.Builder(this)
.setContentView(fabIconNew)
.setSystemOverlay(true) //使该按钮作为系统悬浮按钮显示在设备屏幕上
.setLayoutParams(params)
.build();
SubActionButton.Builder rLSubBuilder = new SubActionButton.Builder(this);
ImageView rlIcon1 = new ImageView(this);
ImageView rlIcon2 = new ImageView(this);
ImageView rlIcon3 = new ImageView(this);
ImageView rlIcon4 = new ImageView(this);
rlIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_chat_light));
rlIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera_light));
rlIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video_light));
rlIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_place_light));
// Build the menu with default options: light theme, 90 degrees, 72dp radius.
// Set 4 default SubActionButtons
SubActionButton rlSub1 = rLSubBuilder.setContentView(rlIcon1).build();
SubActionButton rlSub2 = rLSubBuilder.setContentView(rlIcon2).build();
SubActionButton rlSub3 = rLSubBuilder.setContentView(rlIcon3).build();
SubActionButton rlSub4 = rLSubBuilder.setContentView(rlIcon4).build();
rightLowerMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(rlSub1, rlSub1.getLayoutParams().width, rlSub1.getLayoutParams().height)
.addSubActionView(rlSub2, rlSub2.getLayoutParams().width, rlSub2.getLayoutParams().height)
.addSubActionView(rlSub3, rlSub3.getLayoutParams().width, rlSub3.getLayoutParams().height)
.addSubActionView(rlSub4, rlSub4.getLayoutParams().width, rlSub4.getLayoutParams().height)
.setStartAngle(180)
.setEndAngle(270)
.attachTo(rightLowerButton)
.build();
//创建居于设备顶部居中的大红色按钮
// Set up the large red button on the top center side
// With custom button and content sizes and margins
int redActionButtonSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_size);
int redActionButtonMargin = getResources().getDimensionPixelOffset(R.dimen.action_button_margin);
int redActionButtonContentSize = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_size);
int redActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.red_action_button_content_margin);
int redActionMenuRadius = getResources().getDimensionPixelSize(R.dimen.red_action_menu_radius);
int blueSubActionButtonSize = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_size);
int blueSubActionButtonContentMargin = getResources().getDimensionPixelSize(R.dimen.blue_sub_action_button_content_margin);
ImageView fabIconStar = new ImageView(this);
fabIconStar.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_important));
FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(redActionButtonContentSize, redActionButtonContentSize);
fabIconStarParams.setMargins(redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin,
redActionButtonContentMargin);
WindowManager.LayoutParams params2 = FloatingActionButton.Builder.getDefaultSystemWindowParams(this);
params2.width = redActionButtonSize;
params2.height = redActionButtonSize;
topCenterButton = new FloatingActionButton.Builder(this)
.setSystemOverlay(true)
.setContentView(fabIconStar, fabIconStarParams)
.setBackgroundDrawable(R.drawable.button_action_red_selector)
.setPosition(FloatingActionButton.POSITION_TOP_CENTER) //顶部中心位置
.setLayoutParams(params2)
.build();
//为顶部中心位置的大红色按钮增加弹出的子菜单
// Set up customized SubActionButtons for the right center menu
SubActionButton.Builder tCSubBuilder = new SubActionButton.Builder(this);
tCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));
//小红色关闭叉子那个按钮Builder
SubActionButton.Builder tCRedBuilder = new SubActionButton.Builder(this);
tCRedBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_red_selector));
FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT);
blueContentParams.setMargins(blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin,
blueSubActionButtonContentMargin);
// Set custom layout params
FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize, blueSubActionButtonSize);
tCSubBuilder.setLayoutParams(blueParams);
tCRedBuilder.setLayoutParams(blueParams);
ImageView tcIcon1 = new ImageView(this);
ImageView tcIcon2 = new ImageView(this);
ImageView tcIcon3 = new ImageView(this);
ImageView tcIcon4 = new ImageView(this);
ImageView tcIcon5 = new ImageView(this);
ImageView tcIcon6 = new ImageView(this);
tcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
tcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
tcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
tcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
tcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
tcIcon6.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_cancel));
SubActionButton tcSub1 = tCSubBuilder.setContentView(tcIcon1, blueContentParams).build();
SubActionButton tcSub2 = tCSubBuilder.setContentView(tcIcon2, blueContentParams).build();
SubActionButton tcSub3 = tCSubBuilder.setContentView(tcIcon3, blueContentParams).build();
SubActionButton tcSub4 = tCSubBuilder.setContentView(tcIcon4, blueContentParams).build();
SubActionButton tcSub5 = tCSubBuilder.setContentView(tcIcon5, blueContentParams).build();
SubActionButton tcSub6 = tCRedBuilder.setContentView(tcIcon6, blueContentParams).build();
// Build another menu with custom options
topCenterMenu = new FloatingActionMenu.Builder(this, true)
.addSubActionView(tcSub1, tcSub1.getLayoutParams().width, tcSub1.getLayoutParams().height)
.addSubActionView(tcSub2, tcSub2.getLayoutParams().width, tcSub2.getLayoutParams().height)
.addSubActionView(tcSub3, tcSub3.getLayoutParams().width, tcSub3.getLayoutParams().height)
.addSubActionView(tcSub4, tcSub4.getLayoutParams().width, tcSub4.getLayoutParams().height)
.addSubActionView(tcSub5, tcSub5.getLayoutParams().width, tcSub5.getLayoutParams().height)
.addSubActionView(tcSub6, tcSub6.getLayoutParams().width, tcSub6.getLayoutParams().height)
.setRadius(redActionMenuRadius)
.setStartAngle(0)
.setEndAngle(180)
.attachTo(topCenterButton)
.build();
topCenterMenu.setStateChangeListener(new FloatingActionMenu.MenuStateChangeListener() {
@Override
public void onMenuOpened(FloatingActionMenu menu) {
}
@Override
public void onMenuClosed(FloatingActionMenu menu) {
if(serviceWillBeDismissed) {
SystemOverlayMenuService.this.stopSelf();
serviceWillBeDismissed = false;
}
}
});
// make the red button terminate the service
tcSub6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceWillBeDismissed = true; // the order is important
topCenterMenu.close(true);
}
});
}
@Override
public void onDestroy() {
if(rightLowerMenu != null && rightLowerMenu.isOpen()) rightLowerMenu.close(false);
if(topCenterMenu != null && topCenterMenu.isOpen()) topCenterMenu.close(false);
if(rightLowerButton != null) rightLowerButton.detach();
if(topCenterButton != null) topCenterButton.detach();
super.onDestroy();
}
}
相关文章推荐
- Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)
- Android CircularFloatingActionMenu:作为系统级按钮悬浮桌面弹出菜单使用(3)
- Android点击MENU弹出的退出按钮退出系统方法及拦截MENU弹出菜单方法
- CircularFloatingActionMenu实现扇形的悬浮菜单
- Android 5.0新控件 FloatingActionButton | 悬浮按钮 介绍及使用详情
- Android CircularFloatingActionMenu在ScrollView这样的滚动View中使用(2)
- Android CircularFloatingActionMenu在ScrollView这样的滚动View中使用(2)
- Android点击MENU,返回键弹出的退出按钮退出系统方法及拦截MENU弹出菜单方法
- Android 5.0新控件——FloatingActionButton(悬浮按钮)
- Android中使用系统桌面背景作为应用背景,支持拖动
- Android中使用系统桌面背景作为应用背景,支持拖动
- Android中使用系统桌面背景作为应用背景,支持拖动
- 使用FloatingActionButton实现可拖拽动态弹出菜单
- FloatingActionMenu 向上弹出菜单
- Android 开源项目源码解析 -->CircularFloatingActionMenu 源码解析(八)
- Android 弹出系统menu菜单
- android悬浮按钮(Floating action button)的两种实现方法
- Android的menu(菜单)按钮的使用(by 星空武哥)
- 点击后弧形展开的炫酷菜单--第三方开源-- CircularFloatingActionMenu(一)
- Android CircularFloatingActionMenu (1)