• Android中一个视图弹出动画的简单实现


    动画实现的功能描述:类似于画廊的功能,点击其中一个图片的缩略图,然后全屏打开这个图片,中间的过程用动画实现,给操作者一个从缩略图放大到全屏的感觉。

    由上述的描述可以看出,用户点击缩略图的位置是不固定的,所以动画的起始位置是不固定的,而且有的特殊情况下可能动画起始是视图的大小也是不固定的,所以用anim的xml定义实现是不可能的,所以这里我用将用手写AnimationSet的方式实现这个动画。

    示例程序描述:

    本示例是通过点击不同位置上的button,然后通过动画弹出一个LinearLayout,点击这个LinearLayout,然后又通过动画的方式隐藏这个LinearLayout。

    第一步,创建一个工程,在初始的main.xml中添加多个button

    本例是添加了6个button,具体代码就不再贴出了。样子就是这样的:

     

    第二步,给每个button添加上点击事件

    可以通过xml上的android:onClick="btnOnClick"属性声明点击事件,然后在相应的Activity上实现这个方法就可以了,代码如下:

    btnOnClick(View btn)
    1     public void btnOnClick(View btn) {
    2         showView(btn);
    3     }

    第三步,实现弹出动画和隐藏动画

    显示动画如下:

    显示动画
     1 AnimationSet animSet = new AnimationSet(true);
     2         ScaleAnimation sa = new ScaleAnimation((float) v.getWidth()
     3                 / ((View) v.getParent()).getWidth(), 1.0f,
     4                 (float) v.getHeight() / ((View) v.getParent()).getHeight(),
     5                 1.0f, v.getX() + v.getWidth() / 2, v.getY() + v.getHeight() / 2);
     6         sa.setDuration(2000);
     7         AlphaAnimation aa = new AlphaAnimation(0.2f, 1);
     8         aa.setDuration(2000);
     9         animSet.addAnimation(sa);
    10         animSet.addAnimation(aa);

    隐藏动画如下:

    隐藏动画
     1 AnimationSet animSet = new AnimationSet(true);
     2         ScaleAnimation sa = new ScaleAnimation(1, (float) v.getWidth()
     3                 / ((View) v.getParent()).getWidth(), 1, (float) v.getHeight()
     4                 / ((View) v.getParent()).getHeight(), v.getX() + v.getWidth()
     5                 / 2, v.getY() + v.getHeight() / 2);
     6         sa.setDuration(2000);
     7         AlphaAnimation aa = new AlphaAnimation(1f, 0f);
     8         aa.setDuration(2000);
     9         animSet.addAnimation(sa);
    10         animSet.addAnimation(aa);

    综上所述,整个示例的核心代码就是Activity的2个方法,Activity的源代码如下:

    Activity
     1 public class AnimTestActivity extends Activity {
     2     private LinearLayout mView = null;
     3 
     4     /** Called when the activity is first created. */
     5     @Override
     6     public void onCreate(Bundle savedInstanceState) {
     7         super.onCreate(savedInstanceState);
     8         setContentView(R.layout.main);
     9     }
    10 
    11     public void btnOnClick(View btn) {
    12         showView(btn);
    13     }
    14 
    15     private void showView(final View v) {
    16         if (mView == null) {
    17             mView = new LinearLayout(this);
    18             mView.setBackgroundColor(Color.BLUE);
    19             addContentView(mView, new ViewGroup.LayoutParams(
    20                     LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    21         }
    22         mView.setOnClickListener(new View.OnClickListener() {
    23             @Override
    24             public void onClick(View view) {
    25                 hideView(v);
    26             }
    27         });
    28 
    29         AnimationSet animSet = new AnimationSet(true);
    30         ScaleAnimation sa = new ScaleAnimation((float) v.getWidth()
    31                 / ((View) v.getParent()).getWidth(), 1.0f,
    32                 (float) v.getHeight() / ((View) v.getParent()).getHeight(),
    33                 1.0f, v.getX() + v.getWidth() / 2, v.getY() + v.getHeight() / 2);
    34         sa.setDuration(2000);
    35         AlphaAnimation aa = new AlphaAnimation(0.2f, 1);
    36         aa.setDuration(2000);
    37         animSet.addAnimation(sa);
    38         animSet.addAnimation(aa);
    39         mView.startAnimation(animSet);
    40         mView.setVisibility(View.VISIBLE);
    41     }
    42 
    43     private void hideView(View v) {
    44         AnimationSet animSet = new AnimationSet(true);
    45         ScaleAnimation sa = new ScaleAnimation(1, (float) v.getWidth()
    46                 / ((View) v.getParent()).getWidth(), 1, (float) v.getHeight()
    47                 / ((View) v.getParent()).getHeight(), v.getX() + v.getWidth()
    48                 / 2, v.getY() + v.getHeight() / 2);
    49         sa.setDuration(2000);
    50         AlphaAnimation aa = new AlphaAnimation(1f, 0f);
    51         aa.setDuration(2000);
    52         animSet.addAnimation(sa);
    53         animSet.addAnimation(aa);
    54         mView.startAnimation(animSet);
    55         mView.setVisibility(View.GONE);
    56     }
    57 }

     有一点需要说明一下:(float) v.getWidth()    / ((View) v.getParent()).getWidth()

    • v.getWidth()  和 ((View) v.getParent()).getWidth()都是int类型,为了不让得到的结果为0,这里用float转换了一下分子
    • v.getWidth() 在弹出动画中代表的是动画起始时视图的大小,在隐藏动画中代表的是动画结束时视图的大小
    • ((View) v.getParent()).getWidth()在弹出动画中代表的是动画结束时的视图的大小,在隐藏动画中代表的是动画开始时视图的大小
    • 这个比值的结果是动画变化前后的宽度的比值
  • 相关阅读:
    php抽象类,接口,特性的比较
    服务器和客户端缓存控制
    git平时用到的仓库
    PHP版DES算法加密数据
    Linux连接Windows服务器以及文件传输方法
    php连接MySQL数据库的三种方式(mysql/mysqli/pdo)
    PHP实现网站访客来访显示访客IP&浏览器&操作系统
    ESXI的使用
    vue
    Laravel学习笔记
  • 原文地址:https://www.cnblogs.com/janken/p/2601188.html
Copyright © 2020-2023  润新知