博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android圆形扩展动画
阅读量:7231 次
发布时间:2019-06-29

本文共 7609 字,大约阅读时间需要 25 分钟。

今天学习了一个实现圆形扩展Activity切换动画效果

img_c14d091d690a86e21fc7689e2c352ae0.gif

工具类代码

public class CircularAnimUtil {    public static final long PERFECT_MILLS = 618;    public static final int MINI_RADIUS = 0;    /**     * 向四周伸张,直到完成显示。     */    @SuppressLint("NewApi")    public static void show(View myView, float startRadius, long durationMills) {        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {            myView.setVisibility(View.VISIBLE);            return;        }        int cx = (myView.getLeft() + myView.getRight()) / 2;        int cy = (myView.getTop() + myView.getBottom()) / 2;        int w = myView.getWidth();        int h = myView.getHeight();        // 勾股定理 & 进一法        int finalRadius = (int) Math.sqrt(w * w + h * h) + 1;        Animator anim =            ViewAnimationUtils.createCircularReveal(myView, cx, cy, startRadius, finalRadius);        myView.setVisibility(View.VISIBLE);        anim.setDuration(durationMills);        anim.start();    }    /**     * 由满向中间收缩,直到隐藏。     */    @SuppressLint("NewApi")    public static void hide(final View myView, float endRadius, long durationMills) {        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {            myView.setVisibility(View.INVISIBLE);            return;        }        int cx = (myView.getLeft() + myView.getRight()) / 2;        int cy = (myView.getTop() + myView.getBottom()) / 2;        int w = myView.getWidth();        int h = myView.getHeight();        // 勾股定理 & 进一法        int initialRadius = (int) Math.sqrt(w * w + h * h) + 1;        Animator anim =            ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, endRadius);        anim.setDuration(durationMills);        anim.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);                myView.setVisibility(View.INVISIBLE);            }        });        anim.start();    }    /**     * 从指定View开始向四周伸张(伸张颜色或图片为colorOrImageRes), 然后进入另一个Activity,     * 返回至 @thisActivity 后显示收缩动画。     */    @SuppressLint("NewApi")    public static void startActivityForResult(            final Activity thisActivity, final Intent intent, final Integer requestCode, final Bundle bundle,            final View triggerView, int colorOrImageRes, final long durationMills) {        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {            thisActivity.startActivity(intent);            return;        }        int[] location = new int[2];        triggerView.getLocationInWindow(location);        final int cx = location[0] + triggerView.getWidth() / 2;        final int cy = location[1] + triggerView.getHeight() / 2;        final ImageView view = new ImageView(thisActivity);        view.setScaleType(ImageView.ScaleType.CENTER_CROP);        view.setImageResource(colorOrImageRes);        final ViewGroup decorView = (ViewGroup) thisActivity.getWindow().getDecorView();        int w = decorView.getWidth();        int h = decorView.getHeight();        decorView.addView(view, w, h);        final int finalRadius = (int) Math.sqrt(w * w + h * h) + 1;        Animator            anim = ViewAnimationUtils.createCircularReveal(view, cx, cy, 0, finalRadius);        anim.setDuration(durationMills);        anim.addListener(new AnimatorListenerAdapter() {            @Override            public void onAnimationEnd(Animator animation) {                super.onAnimationEnd(animation);                if (requestCode == null) {                    thisActivity.startActivity(intent);                } else if (bundle == null) {                    thisActivity.startActivityForResult(intent, requestCode);                } else {                    thisActivity.startActivityForResult(intent, requestCode, bundle);                }                // 默认渐隐过渡动画.                thisActivity.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);                // 默认显示返回至当前Activity的动画.                triggerView.postDelayed(new Runnable() {                    @Override                    public void run() {                        Animator anim =                            ViewAnimationUtils.createCircularReveal(view, cx, cy, finalRadius, 0);                        anim.setDuration(durationMills);                        anim.addListener(new AnimatorListenerAdapter() {                            @Override                            public void onAnimationEnd(Animator animation) {                                super.onAnimationEnd(animation);                                try {                                    decorView.removeView(view);                                } catch (Exception e) {                                    e.printStackTrace();                                }                            }                        });                        anim.start();                    }                }, 1000);            }        });        anim.start();    }    /*下面的方法全是重载,用简化上面方法的构建*/    public static void startActivityForResult(            Activity thisActivity, Intent intent, Integer requestCode, View triggerView, int colorOrImageRes) {        startActivityForResult(thisActivity, intent, requestCode, null, triggerView, colorOrImageRes, PERFECT_MILLS);    }    public static void startActivity(            Activity thisActivity, Intent intent, View triggerView, int colorOrImageRes, long durationMills) {        startActivityForResult(thisActivity, intent, null, null, triggerView, colorOrImageRes, durationMills);    }    public static void startActivity(            Activity thisActivity, Intent intent, View triggerView, int colorOrImageRes) {        startActivity(thisActivity, intent, triggerView, colorOrImageRes, PERFECT_MILLS);    }    public static void startActivity(Activity thisActivity, Class
targetClass, View triggerView, int colorOrImageRes) { startActivity(thisActivity, new Intent(thisActivity, targetClass), triggerView, colorOrImageRes, PERFECT_MILLS); } public static void show(View myView) { show(myView, MINI_RADIUS, PERFECT_MILLS); } public static void hide(View myView) { hide(myView, MINI_RADIUS, PERFECT_MILLS); }}

使用方法

Activity切换
//启动Activity,(MainActivity)floatingActionButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Intent intent = new Intent(MainActivity.this, TestOne.class);                CircularAnimUtil.startActivity(MainActivity.this, intent, floatingActionButton, R.color.colorAnim);            }});
//销毁Activity(TestOne) @Override public void onBackPressed() {        finish();        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);}
View显示隐藏
public class ViewAnimTest extends AppCompatActivity {    FloatingActionButton floatingActionButton;    ImageView imageView;    private boolean isShow=true;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.viewanimtest);        floatingActionButton=findViewById(R.id.fab);        imageView=findViewById(R.id.image);        floatingActionButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                if(isShow){                    CircularAnimUtil.hide(imageView);                }else {                    CircularAnimUtil.show(imageView);                }                isShow=!isShow;            }        });    }}
img_5b88149bfa814b54c494f9fbd59d374e.gif

转载地址:http://efvfm.baihongyu.com/

你可能感兴趣的文章
[洛谷P3168][CQOI2015]任务查询系统
查看>>
鼠标放上去图片切换效果
查看>>
String Method的字符串变换的一个例子
查看>>
浅谈for...in与for....of
查看>>
无效报表文件路径
查看>>
MySQL使用存储过程,光标的使用的简单示例
查看>>
php.ini在php脚本文件中的配置
查看>>
C语言 电梯函数
查看>>
html 做的简历
查看>>
neural_transfer风格迁移
查看>>
测试ip
查看>>
ex1.1
查看>>
day10_friest_自动化
查看>>
Entity Framework直接执行SQL语句
查看>>
NodeJS Socket Broadcast
查看>>
BZOJ5168:[HAOI2014]贴海报(线段树)
查看>>
<%@Page%>中的Codebehind AytoEventWireup.inherits有何作用?
查看>>
64. Minimum Path Sum
查看>>
SQL Server 导入bak备份出错
查看>>
JavaScript中的私有/静态属性
查看>>