Android編程實現(xiàn)仿易信精美彈出框效果【附demo源碼下載】
本文實例講述了Android編程實現(xiàn)仿易信精美彈出框效果。分享給大家供大家參考,具體如下:
截圖:
動畫效果介紹:
1.點擊ActionBar上“+”按鈕,菜單從上方彈出(帶反彈效果);
2.再次點擊“+”、點擊空白區(qū)域或者點擊返回鍵,菜單向上方收起;
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); //點擊空白區(qū)域關(guān)閉 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)); //隨便設(shè)置一個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)); } } //動畫結(jié)束時隱藏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)); //動畫結(jié)束時隱藏popupWindow v.postDelayed(new Runnable() { @Override public void run() { popupWindow.dismiss(); //動畫結(jié)束時響應點擊事件 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是顯示狀態(tài),則關(guān)閉它 @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()); //結(jié)束時彈跳 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); //放大(設(shè)置縮放的中心點為自己的中心) 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) { //放大(設(shè)置縮放的中心點為自己的中心) 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; } }
完整實例代碼點擊此處本站下載。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android開發(fā)動畫技巧匯總》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android編程實現(xiàn)仿QQ發(fā)表說說,上傳照片及彈出框效果【附demo源碼下載】
- Android仿微信進度彈出框的實現(xiàn)方法
- 微信瀏覽器彈出框滑動時頁面跟著滑動的實現(xiàn)代碼(兼容Android和IOS端)
- Android 仿微信朋友圈點贊和評論彈出框功能
- Android 多種簡單的彈出框樣式設(shè)置代碼
- 高仿IOS的Android彈出框
- Android中自定義PopupWindow實現(xiàn)彈出框并帶有動畫效果
- Android使用Dialog風格彈出框的Activity
- Android 自定義彈出框?qū)崿F(xiàn)代碼
- Android AndBase框架內(nèi)部封裝實現(xiàn)進度框、Toast框、彈出框、確認框(二)
- Android實現(xiàn)可輸入數(shù)據(jù)的彈出框
相關(guān)文章
Android table布局開發(fā)實現(xiàn)簡單計算器
這篇文章主要為大家詳細介紹了Android table布局開發(fā)實現(xiàn)簡單計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-05-05android ItemTouchHelper實現(xiàn)可拖拽和側(cè)滑的列表的示例代碼
本篇文章主要介紹了ItemTouchHelper實現(xiàn)可拖拽和側(cè)滑的列表的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02android配合viewpager實現(xiàn)可滑動的標簽欄示例分享
本文主要介紹了android實現(xiàn)可滑動的標簽欄示例,配合viewpager作為標簽欄,且可以設(shè)置每頁顯示的標簽個數(shù),超出可滑動顯示,需要的朋友可以參考下2014-02-02使用ViewPager實現(xiàn)左右循環(huán)滑動及滑動跳轉(zhuǎn)
今天實現(xiàn)了左右滑動,至于在最后一頁滑動跳轉(zhuǎn),這個也做了但是效果不是太好,也希望有實現(xiàn)的朋友能夠分享下2013-01-01Android自定義view仿QQ的Tab按鈕動畫效果(示例代碼)
這篇文章主要介紹了Android自定義view仿QQ的Tab按鈕動畫效果(示例代碼),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下2021-01-01android系統(tǒng)在靜音模式下關(guān)閉camera拍照聲音的方法
本文為大家詳細介紹下android系統(tǒng)如何在靜音模式下關(guān)閉camera拍照聲音,具體的實現(xiàn)方法如下,感興趣的朋友可以參考下哈2013-07-07