博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个滑动特效
阅读量:6429 次
发布时间:2019-06-23

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

平时见过这个效果,今天实现了下。这个效果要实现随着想上滚动,actionbar位置透明度的变化,图片的缩放及平移。后面小图片的旋转是自己加的。

滑动控件用的是NestedScrollView,可以监听滚动的过程。滚动的这个过程中,进度percent从0到1,完成整个效果。

  • 透明度从0-1
  • 宽高:从大图片到小图片变化,用的是view.setScaleX,view.setScaleY方法
  • 位置:从小图片到小图片变化,用的是view.setTranslationX方法
  • 进度完成旋转动画

布局:

复制代码

代码:

public class AnimIconActivity extends AppCompatActivity {    private static final String TAG = "AnimIconActivity";    private float diatance;    private float translationY;    private float translationX;    private int[] bigLocation;    private FrameLayout fl;    private float widthBig;    private float heightBig;    private float widthSmall;    private float heightSmall;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_anim_icon);        final ImageView ivSmall = (ImageView) findViewById(R.id.iv_small);//大图片        final ImageView ivBig = (ImageView) findViewById(R.id.iv_big);//小图片        final NestedScrollView nestScrollView = (NestedScrollView) findViewById(R.id.nest_scroll_view);        //获取大图片和小图片的位置信息和宽高        ivBig.post(new Runnable() {            @Override            public void run() {                widthBig = ivBig.getWidth();                heightBig = ivBig.getHeight();                widthSmall = ivSmall.getWidth();                heightSmall = ivSmall.getHeight();                int[] smallLocaion = new int[2];                ivSmall.getLocationInWindow(smallLocaion);                bigLocation = new int[2];                ivBig.getLocationInWindow(bigLocation);                diatance = Math.abs(smallLocaion[1]- bigLocation[1]);//y方向需滚动的距离                translationX = smallLocaion[0] - bigLocation[0];                translationY = smallLocaion[1] - bigLocation[1];            }        });        ivSmall.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                ivBig.setTranslationX(translationX);                ivBig.setTranslationY(translationY);            }        });        ivBig.setPivotX(0);        ivBig.setPivotY(0);        //头像栏        fl = (FrameLayout) findViewById(R.id.fl_bar);        fl.setAlpha(0);        nestScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {            @Override            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {                View child = nestScrollView.getChildAt(0);                int height = child.getHeight();                int height1 = nestScrollView.getHeight();                int top = Math.abs(nestScrollView.getScrollY());                if (height - height1 >= diatance) {                    if (top <= diatance) {                        Log.i(TAG, "onScrollChange: " + scrollY);                        //滚动的进度                        float percent = top / diatance;                                                //计算设置缩放比例                        ivBig.setScaleX(percent * (widthSmall / widthBig - 1) + 1);                        ivBig.setScaleY(percent * (heightSmall / heightBig - 1) + 1);                        //设置透明度                        fl.setAlpha(percent);                        ivBig.setAlpha(1-percent+0.2f);                                                                        //x方向朝小图片平移,y方向不用管NestedScrollView会带着它飞                        float x = (translationX) * percent;                        ivBig.setTranslationX(x);                        //滚动未完成隐藏小图片                        ivSmall.setVisibility(View.INVISIBLE);                                                                    }else {//滚动已完成                        if(ivSmall.getVisibility()!=View.VISIBLE){                            fl.setAlpha(1);                            ivSmall.setVisibility(View.VISIBLE);                                                        ObjectAnimator rotation = ObjectAnimator.ofFloat(ivSmall, "rotation", -60, 60, 0)                                    .setDuration(400);                            rotation.setInterpolator(new OvershootInterpolator());                            rotation.start();                        }                    }                }            }        });    }}复制代码

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

你可能感兴趣的文章
webpack window 使用sass来编译css样式
查看>>
D3 & Data Visualization in Ext JS
查看>>
java通过UUID生成16位唯一订单号
查看>>
001-web基本程序搭建
查看>>
函数指针和指针函数
查看>>
Intel 揭秘:如何在公有云、混合云和私有云间合理放置工作负载
查看>>
借力AI 极验如何构建下一代业务安全?
查看>>
用Python制作迷宫GIF
查看>>
支付宝推出基于区块链跨境支付,巨头入场小企业将面临灭顶之灾
查看>>
从事互联网行业,怎样才能快速掌握一门编程语言呢?
查看>>
谈谈fail-fast与fail-safe是什么以及工作机制
查看>>
深入浅出换肤相关技术以及如何实现
查看>>
Redis 基础、高级特性与性能调优
查看>>
React native 第三方组件 React native swiper
查看>>
接口幂等设计
查看>>
编程入门指南
查看>>
移动端的自适应方案—REM
查看>>
你真的懂volatile吗
查看>>
Android 编译时注解-提升
查看>>
说说 Spring AOP 中 @Aspect 的高级用法
查看>>