Android实现微博菜单弹出效果

发布时间:2020-08-23 07:48:12

来源:脚本之家

阅读:89

作者:gqdy365

先上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;

}

}

代码见github: https://github.com/gqdy365/WeiboPopupWindow

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

下面是apk下载地址:WeiboPopupWindow

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

android 微博底部弹出,Android实现微博菜单弹出效果相关推荐

  1. android仿微博底部键盘,keyboard dialog 仿微博键盘

    功能描述:弹出键盘,右边有最大化按钮,没有最大化的时候最大行数为3,默认1行,随着文字输入增加自动增加高度,到达3行时不会在增加,点击最大化输入框,行数无限制,输入框下方图片点击删除 此处为了简便,键 ...

  2. android scrollview 底部控件,Android ScrollView和屏幕底部的按钮

    刚刚创建并测试了它.看起来像你想要的 android:layout_width="fill_parent" android:layout_height="fill_par ...

  3. android开发底部虚拟键,android手机底部的虚拟按键怎么弄,像android平板那样。

    前言: 现在很多安卓手机都取消了实体键或者触摸键,那么,代替这些按键的就是手机的虚拟按键了,比如GN.N4等手机都有虚拟按键,你是不是觉得这些虚拟按键很有趣呢?其实,谷歌在发布安卓4.0的时候,就为系 ...

  4. android 图片底部波浪线,Android实现波浪线效果(xml bitmap)

    我们要实现的效果如下: 在这之前先带大家了解一下xml bitmap,何为xml bitmap? xml bitmap是一个用xml定义的文件放在资源目录,定义的对象是图片,为bitmap定义别名,这 ...

  5. android qq底部图片选择器,Android 高仿QQ图片选择器

    当做一款APP,需要选择本地图片时,首先考虑的无疑是系统相册,但是Android手机五花八门,再者手机像素的提升,大图无法返回等异常因数,导致适配机型比较困难,微信.QQ都相继的在自己的APP里集成了 ...

  6. android图片底部居中对齐,android开发图片居中的小技巧

    释放双眼,带上耳机,听听看~! 制作UI布局的时候都会出现复杂的LinearLayout嵌套,并且常常会被一些问题混淆,警惕在android中图片居中的小技巧大家都知道吗?别着急,下文是技术狗小编为大 ...

  7. android自定义漂亮按钮样式,Android开发之漂亮Button样式

    开发中各种样式的Button,其实这些样式所有的View都可以共用的,可能对于你改变的只有颜色 所有的都是用代码实现 150CC48D90067F05BFAC966F4EE3E21D.jpg 边框样式 ...

  8. android studio菜单自动弹出,Android实现微博菜单弹出效果

    先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下. 说一下实现思路: 1.截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片: 2 ...

  9. android实现底部弹出菜单,Android实现底部缓慢弹出菜单

    项目要求要做一个从底部缓慢弹出一个Button Menu 开始编码: MyselfFragment package io.dcloud.H5B79C397.fragment; import andro ...

最新文章

  1. 持续集成之“依赖管理”
  2. javascript === 和==的区别
  3. 跨境电商erp有哪些功能?跨境erp是跨境电商卖家必备么?
  4. 拼手速!兄弟连高洛峰细说php全套教学视频教程云盘下载
  5. Verilog测试:TestBench结构
  6. 远程服务器学习总结篇1:ssh
  7. 今天,我 22 岁了 ...
  8. 不仅仅是自动化,DevOps 测试工具推荐
  9. 短信发送显示服务器失败,手机短信发不出去怎么办 手机故障解决方法【方法步骤】...
  10. [树的直径 树形DP] UOJ #11【UTR #1】ydc的大树
  11. Balsamiq Mockups registration code
  12. win10系统无法打开计算器等应用解决办法
  13. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 3
  14. 【读书笔记】Python编程:从入门到实践-埃里克·马瑟斯,python基础体系巩固和常见场景练习
  15. 或许你就是那个背锅侠【多图】
  16. linux-tomcat下载安装(最新)
  17. 教你如何查看linux版本
  18. ubuntu 18.04 Linux 安装OpenCV 教程
  19. 野火STM32资源免费下载(视频,资料、手册、书籍等免费下载),知识传递
  20. 阿里研究院发布《2020中国区块链发展报告》,毛球科技助力数字经济加速发展

热门文章

  1. C语言中使用布尔变量注意事项
  2. 真香!阿里性能优化不传之秘终于开源了
  3. matlab电路元件二极管,电子电路元件基础知识(3)三极管与 MOS管篇2019-02-07
  4. Python逻辑控制
  5. node.js及vue下使用chosen插件
  6. win7 x32 x64 x86的区别
  7. 中国软件:10个人 20年坎坷路(转贴)
  8. 时间序列之间的相关性检测
  9. java文件下载时如何解决中文名称不显示的问题
  10. input、textarea设置placeholder的颜色不起作用