最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下。

效果如下

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private ImageView imgPublish;

private TextView textView1;

private TextView textView2;

private boolean isMenuOpen = false;

private List textViews = new ArrayList<>();

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imgPublish = (ImageView) findViewById(R.id.img_publish);

textView1 = (TextView) findViewById(R.id.tv_1);

textView2 = (TextView) findViewById(R.id.tv_2);

textViews.add(textView1);

textViews.add(textView2);

imgPublish.setOnClickListener(this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.img_publish:

if (!isMenuOpen) {

showOpenAnim(80);

imgPublish.setImageResource(R.mipmap.publish_select);

}else {

showCloseAnim(80);

imgPublish.setImageResource(R.mipmap.fabu);

}

break;

}

}

//打开扇形菜单的属性动画, dp为半径长度

private void showOpenAnim(int dp) {

textView1.setVisibility(View.VISIBLE);

textView2.setVisibility(View.VISIBLE);

//for循环来开始小图标的出现动画

for (int i = 0; i < textViews.size(); i++) {

AnimatorSet set = new AnimatorSet();

//标题1与x轴负方向角度为20°,标题2为100°,转换为弧度

double a = -Math.cos(20 * Math.PI / 180 * (i * 2 + 1));

double b = -Math.sin(20 * Math.PI / 180 * (i * 2 + 1));

double x = a * dip2px(dp);

double y = b * dip2px(dp);

set.playTogether(

ObjectAnimator.ofFloat(textViews.get(i), "translationX", (float) (x * 0.25), (float) x),

ObjectAnimator.ofFloat(textViews.get(i), "translationY", (float) (y * 0.25), (float) y)

, ObjectAnimator.ofFloat(textViews.get(i), "alpha", 0, 1).setDuration(2000)

);

set.setInterpolator(new BounceInterpolator());

set.setDuration(500).setStartDelay(100);

set.start();

set.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

//菜单状态置打开

isMenuOpen = true;

}

@Override

public void onAnimationCancel(Animator animation) {

}

@Override

public void onAnimationRepeat(Animator animation) {

}

});

}

//转动加号大图标本身45°

ObjectAnimator rotate = ObjectAnimator.ofFloat(imgPublish, "rotation", 0, 90).setDuration(300);

rotate.setInterpolator(new BounceInterpolator());

rotate.start();

}

//关闭扇形菜单的属性动画,参数与打开时相反

private void showCloseAnim(int dp) {

//for循环来开始小图标的出现动画

for (int i = 0; i < textViews.size(); i++) {

AnimatorSet set = new AnimatorSet();

double a = -Math.cos(20 * Math.PI / 180 * (i * 2 + 1));

double b = -Math.sin(20 * Math.PI / 180 * (i * 2 + 1));

double x = a * dip2px(dp);

double y = b * dip2px(dp);

set.playTogether(

ObjectAnimator.ofFloat(textViews.get(i), "translationX", (float) x, (float) (x * 0.25)),

ObjectAnimator.ofFloat(textViews.get(i), "translationY", (float) y, (float) (y * 0.25)),

ObjectAnimator.ofFloat(textViews.get(i), "alpha", 1, 0).setDuration(2000)

);

// set.setInterpolator(new AccelerateInterpolator());

set.setDuration(500);

set.start();

set.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animation) {

}

@Override

public void onAnimationEnd(Animator animation) {

textView1.setVisibility(View.GONE);

textView2.setVisibility(View.GONE);

//菜单状态置关闭

isMenuOpen = false;

}

@Override

public void onAnimationCancel(Animator animation) {

}

@Override

public void onAnimationRepeat(Animator animation) {

}

});

}

//转动加号大图标本身45°

ObjectAnimator rotate = ObjectAnimator.ofFloat(imgPublish, "rotation", 0, 90).setDuration(300);

rotate.setInterpolator(new BounceInterpolator());

rotate.start();

}

private int dip2px(int value) {

float density = getResources()

.getDisplayMetrics().density;

return (int) (density * value + 0.5f);

}

}

布局文件

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.lina.animationapplication.MainActivity">

android:id="@+id/tv_1"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_gravity="bottom|end"

android:layout_marginBottom="40dp"

android:layout_marginRight="40dp"

android:gravity="center"

android:text="标题1"

android:textColor="#ffffff"

android:visibility="gone"

android:background="@drawable/circle_purple"

/>

android:id="@+id/tv_2"

android:layout_width="40dp"

android:layout_height="40dp"

android:layout_gravity="bottom|end"

android:layout_marginBottom="40dp"

android:layout_marginRight="40dp"

android:gravity="center"

android:text="标题2"

android:textColor="#ffffff"

android:visibility="gone"

android:background="@drawable/circle_orange"/>

android:id="@+id/img_publish"

android:layout_width="60dp"

android:layout_height="60dp"

android:layout_gravity="bottom|end"

android:layout_marginBottom="35dp"

android:layout_marginRight="35dp"

android:src="@mipmap/fabu"

/>

circle_purple.xml

android:shape="oval">

参考

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

android 上下收缩动画,Android 带有弹出收缩动画的扇形菜单实例相关推荐

  1. android 浮层菜单弹出,Android PopupWindow实现微信右上角的弹出菜单

    日常开发过程中对于PopupWindown的使用也是比较多的.这里给大家展示一下PopupWindow的使用. 修改activity_main.xml布局: xmlns:tools="htt ...

  2. Android Dialog弹出方式动画

    //自定义Dialogclass myDialog extends Dialog{private Window window = null;public myDialog(Context contex ...

  3. Android实践-自定义dialog从屏幕底部弹出并且充满屏幕宽度

    转载出处http://blog.csdn.net/nugongahou110 通常我们使用dialog的时候会遇到一些问题,比如我想用自己定义的布局来替代系统那个黑乎乎的布局时我要怎么做?我想要指定d ...

  4. android一天一次弹窗,Android自定义Toast,多次弹出时取消上次弹出,最后一次弹出为准...

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. Android的Toast用队列管理弹出的消息,这个自定义的Toast用于频繁弹出Toas ...

  5. Android监听系统输入法键盘弹出显示与隐藏事件

    Android监听系统输入法键盘弹出显示与隐藏事件 有时候需要监听Android系统输入法的弹出显示事件,比如:微信聊天时,不管你当前在聊天中的什么位置(上滑查看消息历史),每当你点击输入框时,都会自 ...

  6. android EditText 屏蔽长按弹出剪切 复制 全选菜单 的解决办法

    最近自定义一个密码输入框,正方形的那种,遇到了长按会弹出系统的剪切 复制 和全选的菜单的问题,下面说一下解决办法: 只要设置 edittext.setCustomSelectionActionMode ...

  7. 对话框的动画弹出和动画消隐

    最近看到一篇文章<谈对话框的动画弹出和动画消隐>,文章提到了利用定时器实现对话框动画的效果,比葫芦化瓢,却发现不但没有动画,而且连窗口也没有了,经过简单的修改,终于实现了文中的效果,发现是 ...

  8. 点击页面弹出文字动画效果

    点击页面弹出文字动画效果 introduce 在博客园查询资料的时候,经常会有一些小的惊喜,比如点击页面,会弹出一些文字,向上浮动,然后消失,显得无聊,我就做了一个demo tool 首推vscode ...

  9. html遮罩提示框代码,基于jQuery实现弹出可关闭遮罩提示框实例代码

    jquery CSS3遮罩弹出层动画效果,使用非常简单,就两个标签,里面自定义内容和样式,四种常见效果,懂的朋友还可以修改源代码修改成自己想要的效果 先给大家展示下效果图,如果大家感觉还不错,请参考实 ...

最新文章

  1. 关于递归三要素的理解
  2. Android:使用Activity制作中间弹窗
  3. thinkphp mysql save_新增Save · ThinkPHP5+数据库和模型 · 看云
  4. 91期:2016阿里安全峰会重点资料新鲜开放,不能错过
  5. 分享,用sql快速创建MODEL,快速提高工作效率哦
  6. word文档如何设置多级标题
  7. SQL注入语句(详细)
  8. d3.js 旋转图形_PROE、Creo绘制手轮图形案例,二维草图绘制练习项目
  9. google 浏览器 常用插件
  10. 根据条件对Excel表中数据进行计数
  11. 【安卓源码】简单分析smaps节点
  12. programData
  13. python中反差分操作
  14. 删除Chrome浏览器网站地址栏以前的搜索记录
  15. jsp显示中文文件名的图片 详细出处参考:http://www.jb51.net/article/37149.htm
  16. 工程师思维是什么?芯片工程师要有哪些思维习惯?
  17. 公司技术分享-全文技术分享Lucene VS ElasticSearch VS Solr
  18. 椭圆型变分问题理论及数值方法
  19. PDF 转换成JPG图
  20. 更改快速启动栏右键后的最近访问数量

热门文章

  1. 021合并两个链表并排序
  2. 2016值得关注的5大IT趋势
  3. Action+Service +Dao三层的功能划分
  4. Unix下C程序内存泄露检测工具:valgrind的安装使用
  5. Linq 中的Aggregate一些用法
  6. TurboMail邮件服务器帮你应付电子邮件归档危机
  7. 惊爆漏洞ShopEX4.8.5隐患漏洞,最终解决方法ShopEX4.8.5安装完成后打开显示:Access denied by install.lock...
  8. Transfer: 99款高质量免费(X)HTML/CSS模板
  9. 今天你写控件了吗?----ASP.net控件开发系列(八)
  10. Docker学习2-虚拟化