自定义view实战笔记--视差特效
2017-02-07 11:02
239 查看
视差特效
先要设置imageview的scaleType属性为centerCrop
动态的改变一个控件的宽高可以在属性动画中不断修改布局参数的值,然后调用该控件的iv_header.requestLayout();方法
注意点:可以用以下代码在activity的onCreate()方法中获取控件的宽高,但要注意,在在获取完毕之后要移除监听,否则会被反复调用赋值
先要设置imageview的scaleType属性为centerCrop
动态的改变一个控件的宽高可以在属性动画中不断修改布局参数的值,然后调用该控件的iv_header.requestLayout();方法
// 把当前的头布局的高度currentHeight恢复到初始高度orignalHeight final int currentHeight = iv_header.getHeight(); // 300 -> 160 ValueAnimator animator = ValueAnimator.ofInt(currentHeight, orignalHeight); // 动画更新的监听 animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { // 0.0 -> 1.0 // 获取动画执行过程中的分度值 float fraction = animation.getAnimatedFraction(); // Integer evaluate = evaluate(fraction, currentHeight, orignalHeight); // 获取中间的值 Integer animatedValue = (Integer) animation.getAnimatedValue(); System.out.println("fraction: " + fraction + " animatedValue: " + animatedValue); // evaluate == animatedValue // 让新的高度值生效 iv_header.getLayoutParams().height = animatedValue; iv_header.requestLayout(); } }); animator.setInterpolator(new OvershootInterpolator(2)); animator.setDuration(500); animator.start();
/** * 滑动到ListView两端才会被调用 */ @Override protected boolean overScrollBy(int deltaX, int deltaY, int scrollX, int scrollY, int scrollRangeX, int scrollRangeY, int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) { // deltaY 竖直方向滑动的瞬时变化量, 顶部下拉为- , 底部上拉为+ // scrollY 竖直方向的滑动超出的距离, 顶部为-, 底部为+ // scrollRangeY 竖直方向滑动的范围 // maxOverScrollY 竖直方向最大的滑动位置 // isTouchEvent 是否是用户触摸拉动 , true表示用户手指触摸拉动, false 是惯性 System.out.println("deltaY: " + deltaY + " scrollY: " + scrollY + " scrollRangeY: " + scrollRangeY + " maxOverScrollY: " + maxOverScrollY + " isTouchEvent: " + isTouchEvent); // 顶部下拉, 用户触摸操作 if(deltaY < 0 && isTouchEvent){ // deltaY的绝对值, 累加给Header int newHeight = iv_header.getHeight() + Math.abs(deltaY / 3); if(newHeight <= drawableHeight){ System.out.println("newHeight: " + newHeight); // 让新的值生效 iv_header.getLayoutParams().height = newHeight; iv_header.requestLayout(); } } return super.overScrollBy(deltaX, deltaY, scrollX, scrollY, scrollRangeX, scrollRangeY, maxOverScrollX, maxOverScrollY, isTouchEvent); }
注意点:可以用以下代码在activity的onCreate()方法中获取控件的宽高,但要注意,在在获取完毕之后要移除监听,否则会被反复调用赋值
ivHeader.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 8edd @Override public void onGlobalLayout() { // 图片的原始高度 drawableHeight = ivHeader.getDrawable().getIntrinsicHeight(); //Imageview的初始高度,用来做动画 originalHeight = ivHeader.getHeight(); ivHeader.getViewTreeObserver().removeGlobalOnLayoutListener(this); } });
相关文章推荐
- Android开发使用自定义view实现ListView下拉的视差特效功能
- 自定义View之视差特效
- 自定义view实战笔记--侧滑菜单
- Android 自定义view:实现ListView下拉的视差特效
- 自定义view实战笔记--饼图demo
- 自定义view实战笔记--快速索引
- 尚硅谷自定义View学习笔记-小白到实战
- 自定义View实现视差特效
- 【安卓笔记】自定义view之组合控件
- ((ios开发学习笔记 十一))自定义TableViewCell 的方式实现自定义TableView(带源码)
- Android特效第三篇:自定义Gallery实战(仿网易) .
- Android 自定义ViewGroup 实战篇 -> 实现FlowLayout
- ios学习笔记----实现一个带滑动手势的tabBarViewController,并可自定义tabBar
- Android 自定义ViewGroup 实战篇 -> 实现FlowLayout
- 笔记8-27(自定义UIScrollView,添加手势识别,UIPageControl使用)
- android--笔记--自定义View绘制圆环
- Android 自定义ViewGroup 实战篇 -> 实现FlowLayout
- 笔记6--TextView特效
- iOS开发笔记-ios7 UIAlertView自定义
- Android酱油笔记之自定义View的宽高