Android编程实现仿易信精美弹出框效果【附demo源码下载】
发布时间 - 2026-01-10 22:43:25 点击率:次本文实例讲述了Android编程实现仿易信精美弹出框效果。分享给大家供大家参考,具体如下:

截图:
动画效果介绍:
1.点击ActionBar上“+”按钮,菜单从上方弹出(带反弹效果);
2.再次点击“+”、点击空白区域或者点击返回键,菜单向上方收起;
3.点击弹出框上的按钮时,该按钮放大,其它按钮缩小,菜单整体渐变退出。
主体代码:
1.Activity.
/**
* 仿易信动画弹出框
*/
public class MainActivity extends ActionBarActivity {
//用于标记页面顶端位置
private View topView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
topView = findViewById(R.id.main_top);
}
private PopupWindow popupWindow;
private int line1DeltaY, line2DeltaY;
//仿易信更多弹出框
private void showPopup() {
if (popupWindow == null) {
View contentView = LayoutInflater.from(this).inflate(R.layout.yixin_pop_layout, null);
//点击空白区域关闭
View blankView = contentView.findViewById(R.id.yixin_more_blank);
View blankView2 = contentView.findViewById(R.id.yixin_more_blank2);
initItems(contentView);
//测量高度
int line2Height = ViewUtils.getViewMeasuredHeight(itemViews[0]);
line1DeltaY = -getActionBarHeight() - 40;
line2DeltaY = line1DeltaY - line2Height;
blankView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismissPopup();
}
});
blankView2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismissPopup();
}
});
popupWindow = new PopupWindow(contentView, ScreenUtils.getScreenW(this), ScreenUtils.getScreenH(this));
//随便设置一个drawable作为背景
popupWindow.setBackgroundDrawable(new ColorDrawable());
}
if (!popupWindow.isShowing()) {
popupWindow.showAsDropDown(topView, 0, 0);
for (int i = 0; i < itemViews.length; i++) {
if (i < 3) {
//第一行
itemViews[i].startAnimation(AnimationHelper.createPopupAnimIn(this, line1DeltaY));
} else {
//第二行
itemViews[i].startAnimation(AnimationHelper.createPopupAnimIn(this, line2DeltaY));
}
}
popupWindow.getContentView().startAnimation(AnimationHelper.createPopupBgFadeInAnim());
}
}
private void dismissPopup() {
if (popupWindow == null || !popupWindow.isShowing()) {
return;
}
ViewGroup contentView = (ViewGroup) popupWindow.getContentView();
contentView.startAnimation(AnimationHelper.createPopupBgFadeOutAnim(AnimationHelper.TIME_OUT));
for (int i = 0; i < itemViews.length; i++) {
if (i < 3) {
//第一行
itemViews[i].startAnimation(AnimationHelper.createPopupAnimOut(this, line1DeltaY));
} else {
//第二行
itemViews[i].startAnimation(AnimationHelper.createPopupAnimOut(this, line2DeltaY));
}
}
//动画结束时隐藏popupWindow
contentView.postDelayed(new Runnable() {
@Override
public void run() {
popupWindow.dismiss();
}
}, AnimationHelper.TIME_OUT + 10);
}
private View[] itemViews;
//初始化popupWindow上的按钮
private void initItems(View parent) {
int[] viewIds = new int[]{R.id.yixin_more_item1, R.id.yixin_more_item2, R.id.yixin_more_item3,
R.id.yixin_more_item4, R.id.yixin_more_item5, R.id.yixin_more_item6};
itemViews = new View[viewIds.length];
int itemWidth = ScreenUtils.getScreenW(this) / 3;
OnClickImpl l = new OnClickImpl();
for (int i = 0; i < viewIds.length; i++) {
int id = viewIds[i];
itemViews[i] = parent.findViewById(id);
GridLayout.LayoutParams p = (GridLayout.LayoutParams) itemViews[i].getLayoutParams();
p.width = itemWidth;
itemViews[i].setLayoutParams(p);
itemViews[i].setOnClickListener(l);
}
}
private class OnClickImpl implements View.OnClickListener {
@Override
public void onClick(View v) {
final int viewId = v.getId();
//背景动画
popupWindow.getContentView().startAnimation(AnimationHelper.createPopupBgFadeOutAnim(AnimationHelper.TIME_OUT_CLICK));
//动画结束时隐藏popupWindow
v.postDelayed(new Runnable() {
@Override
public void run() {
popupWindow.dismiss();
//动画结束时响应点击事件
handleEvent(viewId);
}
}, AnimationHelper.TIME_OUT_CLICK + 10);
//按钮动画
for (View item : itemViews) {
if (item.getId() == v.getId()) {
//点击的按钮,放大
item.startAnimation(AnimationHelper.createPopupItemBiggerAnim(MainActivity.this));
} else {
//其它按钮,缩小
item.startAnimation(AnimationHelper.createPopupItemSmallerAnim(MainActivity.this));
}
}
}
}
//popupWindow上按钮的点击事件
private void handleEvent(int viewId) {
Toast.makeText(this, "点击了按钮:" + viewId, Toast.LENGTH_SHORT).show();
}
private int getActionBarHeight() {
return getSupportActionBar().getHeight();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_more) {
if (popupWindow == null || !popupWindow.isShowing()) {
showPopup();
} else {
dismissPopup();
}
return true;
}
return super.onOptionsItemSelected(item);
}
//点击返回键时,如果popupWindow是显示状态,则关闭它
@Override
public void onBackPressed() {
if (popupWindow != null && popupWindow.isShowing()) {
dismissPopup();
return;
}
super.onBackPressed();
}
}
2.动画工具类。
/**
* AnimationHelper
*/
public class AnimationHelper {
/**
* 进入动画的时间
*/
public static final int TIME_IN = 300;
/**
* 进入动画之后的反弹动画时间
*/
public static final int TIME_IN_BACK = 100;
/**
* 退出动画的时间
*/
public static final int TIME_OUT = 300;
/**
* 点击PopupWindow上菜单后退出动画的时间
*/
public static final int TIME_OUT_CLICK = 500;
/**
* PopupWindow上菜单进入动画
*/
public static Animation createPopupAnimIn(Context context, int fromYDelta) {
AnimationSet animationSet = new AnimationSet(context, null);
// animationSet.setInterpolator(new BounceInterpolator()); //结束时弹跳
animationSet.setFillAfter(true);
//移动
TranslateAnimation translateAnim = new TranslateAnimation(0, 0, fromYDelta, 20);
translateAnim.setDuration(TIME_IN);
animationSet.addAnimation(translateAnim);
//回弹效果
TranslateAnimation translateAnim2 = new TranslateAnimation(0, 0, 0, -20);
translateAnim2.setStartOffset(TIME_IN);
translateAnim2.setDuration(TIME_IN_BACK);
animationSet.addAnimation(translateAnim2);
return animationSet;
}
/**
* PopupWindow上菜单离开动画
*/
public static Animation createPopupAnimOut(Context context, int toYDelta) {
AnimationSet animationSet = new AnimationSet(context, null);
animationSet.setFillAfter(true);
TranslateAnimation translateAnim = new TranslateAnimation(0, 0, 0, toYDelta);
translateAnim.setDuration(TIME_OUT);
animationSet.addAnimation(translateAnim);
return animationSet;
}
/**
* PopupWindow背景进入动画(透明度渐变)
*/
public static Animation createPopupBgFadeInAnim() {
AlphaAnimation anim = new AlphaAnimation(0, 1.0f);
anim.setDuration(TIME_IN);
anim.setFillAfter(true);
return anim;
}
/**
* PopupWindow背景离开动画(透明度渐变)
*/
public static Animation createPopupBgFadeOutAnim(int duration) {
AlphaAnimation anim = new AlphaAnimation(1.0f, 0);
anim.setDuration(duration);
anim.setFillAfter(true);
return anim;
}
/**
* PopupWindow按钮点击动画
*/
public static Animation createPopupItemBiggerAnim(Context context) {
AnimationSet animationSet = new AnimationSet(context, null);
animationSet.setFillAfter(true);
//放大(设置缩放的中心点为自己的中心)
ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnim.setDuration(TIME_OUT_CLICK);
animationSet.addAnimation(scaleAnim);
//渐变
AlphaAnimation alphaAnim = new AlphaAnimation(1.0f, 0);
alphaAnim.setInterpolator(new AccelerateInterpolator());
alphaAnim.setDuration(TIME_OUT_CLICK);
animationSet.addAnimation(alphaAnim);
return animationSet;
}
/**
* PopupWindow按钮点击时其它按钮的动画
*/
public static Animation createPopupItemSmallerAnim(Context context) {
//放大(设置缩放的中心点为自己的中心)
ScaleAnimation scaleAnim = new ScaleAnimation(1.0f, 0, 1.0f, 0,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnim.setDuration(TIME_OUT_CLICK);
scaleAnim.setFillAfter(true);
return scaleAnim;
}
}
完整实例代码点击此处本站下载。
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发动画技巧汇总》、《Android编程之activity操作技巧总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》、《Android开发入门与进阶教程》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
# Android
# 弹出框
# Android编程实现仿QQ发表说说
# 上传照片及弹出框效果【附demo源码下载】
# Android仿微信进度弹出框的实现方法
# 微信浏览器弹出框滑动时页面跟着滑动的实现代码(兼容Android和IOS端)
# Android 仿微信朋友圈点赞和评论弹出框功能
# Android 多种简单的弹出框样式设置代码
# 高仿IOS的Android弹出框
# Android中自定义PopupWindow实现弹出框并带有动画效果
# Android使用Dialog风格弹出框的Activity
# Android 自定义弹出框实现代码
# Android AndBase框架内部封装实现进度框、Toast框、弹出框、确认框(二)
# Android实现可输入数据的弹出框
# 弹出
# 结束时
# 自己的
# 进阶
# 点为
# 操作技巧
# 相关内容
# 感兴趣
# 给大家
# 点击此处
# 更多关于
# 所述
# 程序设计
# 讲述了
# initItems
# line2Height
# yixin_more_blank
# getActionBarHeight
# itemViews
# ViewUtils
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
Android使用GridView实现日历的简单功能
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Java遍历集合的三种方式
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
lovemo网页版地址 lovemo官网手机登录
Laravel模型事件有哪些_Laravel Model Event生命周期详解
昵图网官网入口 昵图网素材平台官方入口
Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Laravel如何使用Blade组件和插槽?(Component代码示例)
独立制作一个网站多少钱,建立网站需要花多少钱?
如何用狗爹虚拟主机快速搭建网站?
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何在阿里云虚拟服务器快速搭建网站?
如何获取上海专业网站定制建站电话?
Laravel如何实现数据库事务?(DB Facade示例)
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
使用C语言编写圣诞表白程序
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
香港服务器WordPress建站指南:SEO优化与高效部署策略
网页设计与网站制作内容,怎样注册网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
如何在万网主机上快速搭建网站?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel如何使用模型观察者?(Observer代码示例)
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
无锡营销型网站制作公司,无锡网选车牌流程?
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel distinct去重查询_Laravel Eloquent去重方法
西安专业网站制作公司有哪些,陕西省建行官方网站?
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
微信小程序 input输入框控件详解及实例(多种示例)
怎么用AI帮你为初创公司进行市场定位分析?
如何生成腾讯云建站专用兑换码?
EditPlus中的正则表达式 实战(1)
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】

