用属性动画模仿展开菜单

页面布局文件

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="5dp"
    android:paddingTop="5dp">

    <ImageView
        android:id="@+id/imageView_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:src="@drawable/composer_camera"/>

    <ImageView
        android:id="@+id/imageView_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:src="@drawable/composer_music"/>

    <ImageView
        android:id="@+id/imageView_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:src="@drawable/composer_place"/>

    <ImageView
        android:id="@+id/imageView_d"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:src="@drawable/composer_thought"/>

    <ImageView
        android:id="@+id/imageView_e"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:src="@drawable/composer_with"/>

    <ImageView
        android:id="@+id/imageView_f"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="1dp"
        android:src="@drawable/composer_button"/>

    <ImageView
        android:id="@+id/imageView_g"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="22dp"
        android:paddingTop="22dp"
        android:src="@drawable/composer_icn_plus"/>

</FrameLayout>

  代码:

private  int[] res={R.id.imageView_a,R.id.imageView_b,R.id.imageView_c,
            R.id.imageView_d,R.id.imageView_e,R.id.imageView_f,R.id.imageView_g};
    private List<ImageView> imageViewList = new ArrayList<ImageView>();
    private Boolean flag = false;
    private PropertyValuesHolder p1,p2;

    @Override
    public void onClick(View v) {
        switch (v.getId())
        {
            case R.id.imageView_g:
                if(!flag)
                    startAnimation();
                else
                    closeAnimation();
                break;
            default:
                Toast.makeText(PlusActivity.this, " " + v.getId(), Toast.LENGTH_SHORT).show();
                break;
        }
    }

    private void closeAnimation()
    {
        ObjectAnimator.ofFloat(imageViewList.get(6),"rotation",20f,360f).setDuration(1000).start();
        for (int i=0;i<res.length-2;i++)
        {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViewList.get(i),"translationY",i*60f,0f);
            animator.setDuration(1000);
            animator.setInterpolator(new BounceInterpolator());
            animator.setStartDelay(i*300);
            animator.start();
        }
        flag = false;
    }

    /*
    开始动画
     */
    private void startAnimation()
    {
        ObjectAnimator.ofFloat(imageViewList.get(6),"rotation",20f,360f).setDuration(1000).start();
        for (int i=0;i<res.length-2;i++)
        {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViewList.get(i),"translationY",0f,i*60f);
            animator.setDuration(1000);
            animator.setInterpolator(new BounceInterpolator());
            animator.setStartDelay(i*300);
            animator.start();
        }
        flag = true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        for(int i=0;i<res.length;i++)
        {
            ImageView imageView = (ImageView)findViewById(res[i]);
            imageView.setOnClickListener(this);
            imageViewList.add(imageView);
        }
    }

  附上效果:

一个简单的小例子,属性动画比之前的动画在使用方面要方便很多。但是在下也是刚刚起步,还有很多不完善的地方,希望同道中人指正。

有两点没有琢磨明白怎么实现:

1、如果我想扇形的展开菜单改怎么写呢?

2、我想让rotation 以自身中心为轴,怎么赋值参数呢?

时间: 2024-12-21 05:40:44

用属性动画模仿展开菜单的相关文章

属性动画实现卫星菜单效果

原来学过用自定义控件以及视图动画来达到这个效果.后来根据慕课网的视频,接触到了属性动画,发现其精髓之处不是一点两点. 相信大家都知道,当我们在使用视图(View)动画的时候,改变轨迹时,所触发的点击事件却没有相对应的随之轨迹而改变.确切的说,Animation改变显示的位置,不可以实现交互的效果,只是实现了显示效果. 先看下Animator的介绍 This is the superclass for classes which provide basic support for animatio

浅谈属性动画简单使用之实现卫星菜单(二)

大家对于卫星菜单应该都不陌生了,其实这个菜单如果能合适运用到我们的APP项目中,确实是一个不错的选择,交互性非常好.在写Demo之前我也上网搜了一些关于卫星菜单的实现,感觉好多人实现卫星菜单这种动画,采用的是补间动画,并且代码还不少,通过上一讲我们知道,补间动画不具备与用户交互的特点,就比如卫星菜单展开后,产生很多子菜单有很多的点击事件,会发现产生点击事件的位置不会随着补间动画而产生位置改变而改变,反而点击事件一直保存在初始的位置.当然补间动画也能做,那就需要产生动画后发生位置的改变,并且也需要

android学习(属性动画扇形菜单栏)

1 public class TestActivity extends Activity implements OnClickListener{ 2 private int[] res={R.id.imageView1,R.id.imageView2,R.id.imageView3,R.id.imageView4,R.id.imageView5,R.id.imageView6}; 3 private List<ImageView> list=new ArrayList<ImageView

Android攻城狮属性动画赏析

1 import android.support.v7.app.ActionBarActivity; 2 import android.support.v7.app.ActionBar; 3 import android.support.v4.app.Fragment; 4 import android.animation.AnimatorSet; 5 import android.animation.ObjectAnimator; 6 import android.animation.Prop

Android中动画与属性动画

1.动画(Animation) 传统动画中,有位移.旋转.缩放.透明度变化等动画,如以下代码移动一个图片控件 TranslateAnimation animation = new TranslateAnimation(0, 200, 0, 0);animation.setDuration(1000);animation.setFillAfter(true);//使控件停留到动画结束的位置,若不设置则返回原来位置iv.startAnimation(animation); 但iv的属性却留在了原地.

Android13_fragment_view动画_属性动画

1,fragment:片段,碎片 应用场景:微信,微博的导航栏 1.1从3.0之后的系统引进的控件,代表的是屏幕的一部分,因为以往在手机上的绘制控件问题不大,但是如果是平板界面,每次绘制大量的控件对资源消耗很大,会引起卡顿 fragment允许屏幕先更新界面的一部分,是界面的一部分 点击声音才显示声音的ui界面,点击存储才显示出存储的界面,但是并不是在页面跳转,而是布局文件的切换,点击切换布局文件,通过模块化来使用 FrameLayout布局和fragment最相配,因为它渲染速度最快,效率最高

用Canvas和属性动画造一只萌蠢的“小鬼”

最近没事的时候想自己写一个支持下拉刷新,上拉加载的自定义View.写着写着,就觉得最常见的"一个圈转啊转"的进度条太普通了. 于是,就想看看有没有更有趣的一点的加载效果.在GitHub上以"android loading"为关键字一搜索,就发现有作者开源了这么一个库: 库的地址是:https://github.com/ldoublem/LoadingView.里面提供了很多有趣的加载动画(非常棒),个人对其中如下一个效果产生了兴趣: 那么,开源的好处就来了,立刻打开

属性动画与图片三级缓存

属性动画 动画: UI渐变, 变量值的变化 ObjectAnimator : ofInt("backgroundColor",start,end); ValueAnimator: for(int i = start; i< end; i++) { a = i; } ValueAnimator animation=ValueAnimator.ofInt(start,end); animation.setDuration(DURATION); animation.addUpdateL

Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)

在上一篇中我们学习了属性动画的ObjectAnimator使用,不了解的可以看看 Android属性动画Property Animation系列一之ObjectAnimator.这一篇我们来学点新的东西.做项目的时候应该碰到这种问题:根据不同条件显示或者隐藏一个控件或者布局,我们能想到的第一个方法就是 调用View.setVisibility()方法.虽然实现了显示隐藏效果,但是总感觉这样的显示隐藏过程很僵硬,让人不是很舒服,那么有没有办法能让这种显示隐藏有个过渡的动画效果呢?答案是肯定的,不言