先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下。

说一下实现思路:

1、截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片;

2、创建popupwindow,完成布局,这儿要注意:View的移动范围是由parent的大小决定的,就是只能在parent的范围内移动;

3、给买个View添加进入动画,每个比前一个延期50ms播放动画,关闭窗口时相反;

4、为View的动画添加回弹插值器;

MoreWindow.java窗口

package com.jerome.weibo;

import android.animation.Animator;

import android.animation.Animator.AnimatorListener;

import android.animation.ObjectAnimator;

import android.animation.ValueAnimator;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.graphics.Rect;

import android.graphics.drawable.BitmapDrawable;

import android.os.Handler;

import android.util.DisplayMetrics;

import android.util.Log;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.view.animation.Animation;

import android.view.animation.Animation.AnimationListener;

import android.view.animation.AnimationSet;

import android.view.animation.TranslateAnimation;

import android.widget.ImageView;

import android.widget.PopupWindow;

import android.widget.RelativeLayout;

import android.widget.RelativeLayout.LayoutParams;

public class MoreWindow extends PopupWindow implements OnClickListener{

private String TAG = MoreWindow.class.getSimpleName();

Activity mContext;

private int mWidth;

private int mHeight;

private int statusBarHeight ;

private Bitmap mBitmap= null;

private Bitmap overlay = null;

private Handler mHandler = new Handler();

public MoreWindow(Activity context) {

mContext = context;

}

public void init() {

Rect frame = new Rect();

mContext.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);

statusBarHeight = frame.top;

DisplayMetrics metrics = new DisplayMetrics();

mContext.getWindowManager().getDefaultDisplay()

.getMetrics(metrics);

mWidth = metrics.widthPixels;

mHeight = metrics.heightPixels;

setWidth(mWidth);

setHeight(mHeight);

}

private Bitmap blur() {

if (null != overlay) {

return overlay;

}

long startMs = System.currentTimeMillis();

View view = mContext.getWindow().getDecorView();

view.setDrawingCacheEnabled(true);

view.buildDrawingCache(true);

mBitmap = view.getDrawingCache();

float scaleFactor = 8;//图片缩放比例;

float radius = 10;//模糊程度

int width = mBitmap.getWidth();

int height = mBitmap.getHeight();

overlay = Bitmap.createBitmap((int) (width / scaleFactor),(int) (height / scaleFactor),Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(overlay);

canvas.scale(1 / scaleFactor, 1 / scaleFactor);

Paint paint = new Paint();

paint.setFlags(Paint.FILTER_BITMAP_FLAG);

canvas.drawBitmap(mBitmap, 0, 0, paint);

overlay = FastBlur.doBlur(overlay, (int) radius, true);

Log.i(TAG, "blur time is:"+(System.currentTimeMillis() - startMs));

return overlay;

}

private Animation showAnimation1(final View view,int fromY ,int toY) {

AnimationSet set = new AnimationSet(true);

TranslateAnimation go = new TranslateAnimation(0, 0, fromY, toY);

go.setDuration(300);

TranslateAnimation go1 = new TranslateAnimation(0, 0, -10, 2);

go1.setDuration(100);

go1.setStartOffset(250);

set.addAnimation(go1);

set.addAnimation(go);

set.setAnimationListener(new AnimationListener() {

@Override

public void onAnimationEnd(Animation animation) {

}

@Override

public void onAnimationRepeat(Animation animation) {

}

@Override

public void onAnimationStart(Animation animation) {

}

});

return set;

}

public void showMoreWindow(View anchor,int bottomMargin) {

final RelativeLayout layout = (RelativeLayout)LayoutInflater.from(mContext).inflate(R.layout.center_music_more_window, null);

setContentView(layout);

ImageView close= (ImageView)layout.findViewById(R.id.center_music_window_close);

android.widget.RelativeLayout.LayoutParams params =new android.widget.RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

params.bottomMargin = bottomMargin;

params.addRule(RelativeLayout.BELOW, R.id.more_window_auto);

params.addRule(RelativeLayout.RIGHT_OF, R.id.more_window_collect);

params.topMargin = 200;

params.leftMargin = 18;

close.setLayoutParams(params);

close.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (isShowing()) {

closeAnimation(layout);

}

}

});

showAnimation(layout);

setBackgroundDrawable(new BitmapDrawable(mContext.getResources(), blur()));

setOutsideTouchable(true);

setFocusable(true);

showAtLocation(anchor, Gravity.BOTTOM, 0, statusBarHeight);

}

private void showAnimation(ViewGroup layout){

for(int i=0;i

final View child = layout.getChildAt(i);

if(child.getId() == R.id.center_music_window_close){

continue;

}

child.setOnClickListener(this);

child.setVisibility(View.INVISIBLE);

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

child.setVisibility(View.VISIBLE);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 600, 0);

fadeAnim.setDuration(300);

KickBackAnimator kickAnimator = new KickBackAnimator();

kickAnimator.setDuration(150);

fadeAnim.setEvaluator(kickAnimator);

fadeAnim.start();

}

}, i * 50);

}

}

private void closeAnimation(ViewGroup layout){

for(int i=0;i

final View child = layout.getChildAt(i);

if(child.getId() == R.id.center_music_window_close){

continue;

}

child.setOnClickListener(this);

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

child.setVisibility(View.VISIBLE);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(child, "translationY", 0, 600);

fadeAnim.setDuration(200);

KickBackAnimator kickAnimator = new KickBackAnimator();

kickAnimator.setDuration(100);

fadeAnim.setEvaluator(kickAnimator);

fadeAnim.start();

fadeAnim.addListener(new AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

// TODO Auto-generated method stub

}

@Override

public void onAnimationRepeat(Animator animation) {

// TODO Auto-generated method stub

}

@Override

public void onAnimationEnd(Animator animation) {

child.setVisibility(View.INVISIBLE);

}

@Override

public void onAnimationCancel(Animator animation) {

// TODO Auto-generated method stub

}

});

}

}, (layout.getChildCount()-i-1) * 30);

if(child.getId() == R.id.more_window_local){

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

dismiss();

}

}, (layout.getChildCount()-i) * 30 + 80);

}

}

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.more_window_local:

break;

case R.id.more_window_online:

break;

case R.id.more_window_delete:

break;

case R.id.more_window_collect:

break;

case R.id.more_window_auto:

break;

case R.id.more_window_external:

break;

default:

break;

}

}

public void destroy() {

if (null != overlay) {

overlay.recycle();

overlay = null;

System.gc();

}

if (null != mBitmap) {

mBitmap.recycle();

mBitmap = null;

System.gc();

}

}

}

KickBackAnimator.Java回弹效果:

package com.jerome.weibo;

import android.animation.TypeEvaluator;

public class KickBackAnimator implements TypeEvaluator {

private final float s = 1.70158f;

float mDuration = 0f;

public void setDuration(float duration) {

mDuration = duration;

}

public Float evaluate(float fraction, Float startValue, Float endValue) {

float t = mDuration * fraction;

float b = startValue.floatValue();

float c = endValue.floatValue() - startValue.floatValue();

float d = mDuration;

float result = calculate(t, b, c, d);

return result;

}

public Float calculate(float t, float b, float c, float d) {

return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;

}

}

请大家star一下,我后面会持续更新;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

android studio菜单自动弹出,Android实现微博菜单弹出效果相关推荐

  1. android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单

    怎么在android studio中使用Spinner实现一个下拉菜单 发布时间:2021-03-23 14:56:15 来源:亿速云 阅读:92 作者:Leah 这期内容当中小编将会给大家带来有关怎 ...

  2. 1.Android简介,Android Studio安装,创建运行Android程序

    文章目录 1.了解通信技术 2.Android简介   2.1 Android起源   2.2 Android历史版本 3.Android Studio开发环境的搭建 3.1 Android Stud ...

  3. Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调

    Android Studio 是谷歌基于IntelliJ IDEA开发的安卓开发工具,有点类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调 ...

  4. android studio控件使用方法,android studio使用教程

    android studio使用教程 Android Studio是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studi ...

  5. 如何在没有 USB 数据线的情况下使用 Android Studio 在手机中安装 Android

    背景 如何在没有 USB 数据线的情况下使用 Android Studio 在手机中安装 Android 应用程序? 运行调式一个Android项目,写下必要的代码后,接下来的任务是在模拟器或手机上运 ...

  6. 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )

    文章目录 一. Android 工程打包 二. Android Studio 打开 Unity 导出的 Android 工程 一. Android 工程打包 Android 工程打包 就是将 Unit ...

  7. Android Studio电脑上怎么下载-Android Studio下载和安装图文教程[超详细]

    安装 Android Studio 只需轻松点击几下,即可完成 Android Studio 的设置. 首先,请务必下载最新版本的 Android Studio. Windows 如需在 Window ...

  8. android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

    解决Android studio 2.3升级到Android studio 3.0 后apt报错问题 发布时间:2020-09-16 19:59:42 来源:脚本之家 阅读:62 作者:哈特中尉 1. ...

  9. Android studio通过荣耀20调试Android程序

    Android studio通过荣耀20调试Android程序 通过Android studio通过荣耀20调试Android程序,要考虑三方面的因素: ·····手机····· ·····windo ...

  10. android studio 看不到 manifest,Android Studio: Android Manifest doesn't exist

    可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I got this error on Android Studio (AS): How I ...

最新文章

  1. UE商城资源 Motion Symphony 运动匹配插件
  2. python windows编程_在Windows下配置Python编程学习环境
  3. Android标题栏,状态栏
  4. android Too many open files 解决
  5. U3D sorting layer, sort order, order in layer, layer深入辨析
  6. OpenGL ktxview (KTX查看器)的实例
  7. 怀卡托大学硕士计算机科学,2020年怀卡托大学研究生一般几年毕业
  8. java定时任务详解
  9. structs2 get方式传参中文乱码解决方法
  10. 【spring】spring源码搭建
  11. python opencv二值化阈值图像分割
  12. Himall商城枚举帮助类EnumHelper(3)
  13. win10系统怎么删除远程桌面连接记录
  14. 免费在线pdf转word
  15. androidjni开发!应聘高级Android工程师历程感言,快来收藏!
  16. vue引入阿里妈妈的图标
  17. C# winForm 定时拷贝覆盖文件小工具
  18. python argument是什么_Python argument
  19. ios拉伸图片某部分,九点图
  20. HDU-2112 HDU Today (字符串转数字,最短路)

热门文章

  1. MMSegmention系列之一(准备数据集)
  2. 毒APP newSign算法分析 得物逆向分析
  3. ContentResolver监听
  4. 通过分析希拉里邮件简单熟悉使用lda模型提取语料库主题
  5. iOS4 and wireless application deploy
  6. 阿里云数字化转型方案再升级,移动研发平台EMAS助力海底捞超级App“云上捞”...
  7. 开始学习使用phpcms
  8. 计算机应用样式指什么,Word 2013中样式的认识与内置样式的使用方法——想象力电脑应用...
  9. 膝盖中了一箭之康复篇-第十个月暨4月份目标总结
  10. web课程设计——仿小米商城(10个页面)HTML+CSS+JavaScript web前端课程设计 web前端课程设计代码 web课程设计 HTML网页制作代码...