扇形展开的悬浮菜单按钮CircularFloatingActionMenu

Android CircularFloatingActionMenu在github上项目主页地址:https://github.com/oguzbilgener/CircularFloatingActionMenu

Android CircularFloatingActionMenu要实现的效果如动态图所示:

Java代码:

import android.animation.ObjectAnimator;
import android.animation.PropertyValuesHolder;
import android.app.Activity;
import android.os.Bundle;
//import android.view.Menu;
//import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
 
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionButton;
import com.oguzdev.circularfloatingactionmenu.library.FloatingActionMenu;
import com.oguzdev.circularfloatingactionmenu.library.SubActionButton;
 
/**
 * 一个FloatingActionButton有一个FloatingActionMenu,FloatingActionMenu添加动画弹出的子菜单。
 * FloatingActionButton的按钮点击事件将触发、弹出FloatingActionMenu中包含的子菜单。
 * FloatingActionMenu使用attachTo方法附着在一个FloatingActionButton上。
 * FloatingActionMenu在attachTo到一个FloatingActionButton后,两者之间发生关联。
 * FloatingActionMenu在添加子菜单时候,首先需要一个SubActionButton.Builder,该SubActionButton.
 * Builder通过setContentView(ImageView
 * image).build()把一个ImageView创建生产一个SubActionButton ,
 * 然后通过FloatingActionMenu.Builder的add方法把前面生成的SubActionButton添加进去。
 * 
 * 
 * 按钮的旋转动画在onMenuOpened和onMenuClosed中做。
 * 
 */
 
public class MenuWithFABActivity extends Activity {
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
 
		// 添加 右下角的白色+号按钮
		final ImageView fabIconNew = new ImageView(this);
		fabIconNew.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_new_light));
		final FloatingActionButton rightLowerButton = new FloatingActionButton.Builder(this).setContentView(fabIconNew)
				.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
		// FloatingActionMenu通过attachTo(rightLowerButton)附着到FloatingActionButton
		final FloatingActionMenu rightLowerMenu = new FloatingActionMenu.Builder(this)
				.addSubActionView(rLSubBuilder.setContentView(rlIcon1).build())
				.addSubActionView(rLSubBuilder.setContentView(rlIcon2).build())
				.addSubActionView(rLSubBuilder.setContentView(rlIcon3).build())
				.addSubActionView(rLSubBuilder.setContentView(rlIcon4).build()).attachTo(rightLowerButton).build();
 
		// Listen menu open and close events to animate the button content view
		rightLowerMenu.setStateChangeListener(new FloatingActionMenu.MenuStateChangeListener() {
			@Override
			public void onMenuOpened(FloatingActionMenu menu) {
				// 增加按钮中的+号图标顺时针旋转45度
				// Rotate the icon of rightLowerButton 45 degrees clockwise
				fabIconNew.setRotation(0);
				PropertyValuesHolder pvhR = PropertyValuesHolder.ofFloat(View.ROTATION, 45);
				ObjectAnimator animation = ObjectAnimator.ofPropertyValuesHolder(fabIconNew, pvhR);
				animation.start();
			}
 
			@Override
			public void onMenuClosed(FloatingActionMenu menu) {
				// 增加按钮中的+号图标逆时针旋转45度
				// Rotate the icon of rightLowerButton 45 degrees
				// counter-clockwise
				fabIconNew.setRotation(45);
				PropertyValuesHolder pvhR = PropertyValuesHolder.ofFloat(View.ROTATION, 0);
				ObjectAnimator animation = ObjectAnimator.ofPropertyValuesHolder(fabIconNew, pvhR);
				animation.start();
			}
		});
 
		// 左边中间的红底白色星型按钮
		// Set up the large red button on the center right 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 starParams = new FloatingActionButton.LayoutParams(redActionButtonSize,
				redActionButtonSize);
		starParams.setMargins(redActionButtonMargin, redActionButtonMargin, redActionButtonMargin,
				redActionButtonMargin);
		fabIconStar.setLayoutParams(starParams);
 
		FloatingActionButton.LayoutParams fabIconStarParams = new FloatingActionButton.LayoutParams(
				redActionButtonContentSize, redActionButtonContentSize);
		fabIconStarParams.setMargins(redActionButtonContentMargin, redActionButtonContentMargin,
				redActionButtonContentMargin, redActionButtonContentMargin);
 
		final FloatingActionButton leftCenterButton = new FloatingActionButton.Builder(this)
				.setContentView(fabIconStar, fabIconStarParams)
				.setBackgroundDrawable(R.drawable.button_action_red_selector)// 红底白星按钮选中时候状态变化和背景颜色
				.setPosition(FloatingActionButton.POSITION_LEFT_CENTER)// 左边居中
				.setLayoutParams(starParams).build();
 
		// Set up customized SubActionButtons for the right center menu
		SubActionButton.Builder lCSubBuilder = new SubActionButton.Builder(this);
		lCSubBuilder.setBackgroundDrawable(getResources().getDrawable(R.drawable.button_action_blue_selector));
 
		FrameLayout.LayoutParams blueContentParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
				FrameLayout.LayoutParams.MATCH_PARENT);
		blueContentParams.setMargins(blueSubActionButtonContentMargin, blueSubActionButtonContentMargin,
				blueSubActionButtonContentMargin, blueSubActionButtonContentMargin);
		lCSubBuilder.setLayoutParams(blueContentParams);
		// Set custom layout params
		FrameLayout.LayoutParams blueParams = new FrameLayout.LayoutParams(blueSubActionButtonSize,
				blueSubActionButtonSize);
		lCSubBuilder.setLayoutParams(blueParams);
 
		ImageView lcIcon1 = new ImageView(this);
		ImageView lcIcon2 = new ImageView(this);
		ImageView lcIcon3 = new ImageView(this);
		ImageView lcIcon4 = new ImageView(this);
		ImageView lcIcon5 = new ImageView(this);
 
		lcIcon1.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_camera));
		lcIcon2.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_picture));
		lcIcon3.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_video));
		lcIcon4.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_location_found));
		lcIcon5.setImageDrawable(getResources().getDrawable(R.drawable.ic_action_headphones));
 
		// Build another menu with custom options
		final FloatingActionMenu leftCenterMenu = new FloatingActionMenu.Builder(this)
				.addSubActionView(lCSubBuilder.setContentView(lcIcon1, blueContentParams).build())
				.addSubActionView(lCSubBuilder.setContentView(lcIcon2, blueContentParams).build())
				.addSubActionView(lCSubBuilder.setContentView(lcIcon3, blueContentParams).build())
				.addSubActionView(lCSubBuilder.setContentView(lcIcon4, blueContentParams).build())
				.addSubActionView(lCSubBuilder.setContentView(lcIcon5, blueContentParams).build())
				.setRadius(redActionMenuRadius).setStartAngle(70).setEndAngle(-70).attachTo(leftCenterButton).build();
 
	}
 
	// @Override
	// public boolean onCreateOptionsMenu(Menu menu) {
	// // Inflate the menu; this adds items to the action bar if it is present.
	// getMenuInflater().inflate(R.menu.menu_with_fab, menu);
	// return true;
	// }
	//
	// @Override
	// public boolean onOptionsItemSelected(MenuItem item) {
	// // Handle action bar item clicks here. The action bar will
	// // automatically handle clicks on the Home/Up button, so long
	// // as you specify a parent activity in AndroidManifest.xml.
	// int id = item.getItemId();
	// if (id == R.id.action_settings) {
	// return true;
	// }
	// return super.onOptionsItemSelected(item);
	// }
}

参考链接:

https://blog.csdn.net/zhangphil/article/details/50257149

https://blog.csdn.net/jdh99/article/details/71171814

要实现点击扇形展开效果菜单,需要使用CSS中的transform和transition属性。以下是一种实现方式: HTML结构: ```html <div class="menu"> <div class="item item1"></div> <div class="item item2"></div> <div class="item item3"></div> <div class="item item4"></div> <div class="item item5"></div> <div class="center"></div> </div> ``` CSS样式: ```css .menu { position: relative; width: 200px; height: 200px; } .item { position: absolute; width: 50px; height: 50px; background-color: #ccc; border-radius: 50%; transition: transform 0.5s ease; } .item1 { top: -25px; left: 75px; } .item2 { top: 35px; left: 35px; } .item3 { top: 75px; left: -25px; } .item4 { top: 35px; left: -85px; } .item5 { top: -25px; left: -45px; } .center { position: absolute; top: 50%; left: 50%; width: 20px; height: 20px; background-color: #333; border-radius: 50%; transform: translate(-50%, -50%); cursor: pointer; } ``` JavaScript代码: ```javascript var menu = document.querySelector('.menu'); var items = document.querySelectorAll('.item'); var center = document.querySelector('.center'); var isOpen = false; center.addEventListener('click', function() { if (isOpen) { // 关闭菜单 menu.classList.remove('open'); items.forEach(function(item, index) { item.style.transform = 'rotate(0deg)'; }); } else { // 打开菜单 menu.classList.add('open'); items.forEach(function(item, index) { item.style.transform = 'rotate(' + (index * 72) + 'deg)'; }); } isOpen = !isOpen; }); ``` 在上面的代码中,我们通过JavaScript监听中心圆的点击事件,并根据菜单是否打开来决定是展开还是收起菜单。当菜单打开时,我们给菜单容器添加open类名,并将每个菜单项按照一定角度旋转,从而形成扇形展开效果。当菜单关闭时,我们将open类名移除,并将每个菜单项旋转回初始状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值