由于默认情况下,动画只针对当前父布局范围中有效,有的时候我们需要在全屏范围中做做飘的效果;实际做法我想应该有两个:
1. 用绝对坐标的方式执行动画
设置动画时设置类型为绝对位置执行。
2. 使用中间控件模拟,此中间控件为与setContenView中view同级,然后计算出移动位置进行动画
通过view.getParent()得到ViewGroup,然后给ViewGroup.addView(中间控件),再给中间控件做动画。
提示:
getLocalVisibleRect , 返回一个填充的Rect对象,Android获取view在屏幕中的位置, 感觉是这个View的Rect大小,left,y值,//获取在整个窗口内的绝对坐标getLeft , getTop, getBottom, getRight, 这一组是获取相对在
getLocalVisibleRect , 返回一个填充的Rect对象, 感觉是这个View的Rect大小,left,top取到的都是0
getGlobalVisibleRect , 获取全局坐标系的一个视图区域, 返回一个填充的Rect对象;该Rect是基于总整个屏幕的
getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标
getLeft , getTop, getBottom, getRight, 这一组是获取相对在它父亲里的坐标
本文中两者结合着使用,代码如下:
private void beginAnimationAndRefresh(final View fromView, final boolean isBack) {
final ViewGroup parent = (ViewGroup) view.getParent();//view为当前setContentview中的参数
final DailyDateView newView = new DailyDateView(Activity.this);//可以用自己定义的View,创建一个新的view作为中间view去执行动画
newView.setLayoutParams(fromView.getLayoutParams());
final AnimationListener listener = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
fromView.setVisibility(View.INVISIBLE);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
newView.setVisibility(View.GONE);//动画结束后做某些操作
handler.post(new Runnable() {
@Override
public void run() {
parent.removeView(newView);
if (isBack) {
dateWeekView.setDailyViewShow();
setShowSiderView(false);
}
}
});
}
};
handler.post(new Runnable() {
private AnimationSet animation = new AnimationSet(true);
private DailyViewAnimation translateAnim;
private AlphaAnimation alphaAnim;
private Rect fromRect;
private Rect toRect;
private Rect stateR;
private int startX;
private int startY;
private int endX;
private int endY;
private float startAlpha;
private float endAlpha;
@Override
public void run() {
parent.addView(newView, fromView.getWidth(), fromView.getHeight());
if (isBack) {
View toView = dateWeekView.getDailyView();
fromRect = JingoalDisplayUtil.getGlobalRect(fromView);
toRect = JingoalDisplayUtil.getGlobalRect(toView);
stateR = JingoalDisplayUtil.getStateBarRect(toView);
startX = fromRect.left;
startY = fromRect.top - stateR.top;
endX = toRect.left;
endY = toRect.top - stateR.top;
startAlpha = 1f;
endAlpha = 0.5f;
} else {
View toItemView = gridView.getChildAt(2);
fromRect = JingoalDisplayUtil.getGlobalRect(fromView);
toRect = JingoalDisplayUtil.getGlobalRect(toItemView);
stateR = JingoalDisplayUtil.getStateBarRect(toItemView);
startX = fromRect.left;
startY = fromRect.top;
endX = toRect.left;
endY = toRect.top - stateR.top;
startAlpha = 0.6f;
endAlpha = 1f;
}
translateAnim = new DailyViewAnimation(Animation.ABSOLUTE, Animation.ABSOLUTE, startX, endX, startY, endY);
alphaAnim = new AlphaAnimation(startAlpha, endAlpha);
animation.addAnimation(translateAnim);
animation.addAnimation(alphaAnim);
newView.setAnimation(animation);
animation.setDuration(300);
animation.setAnimationListener(listener);
animation.start();
}
});
public class DisplayUtil {
static Rect rect;
/*
* 状态栏高度 View的getWindowVisibleDisplayFrame(Rect outRect)附值outRect后,outRect.top()即是状态栏高度
* 标题高度 View的getWindowVisibleDisplayFrame(Rect outRect1)附值outRect后,outRect.height()-view.getheight()即是标题高度。
*/
public static Rect getStateBarRect(View v) {
rect = new Rect();
v.getWindowVisibleDisplayFrame(rect);
return rect;
}
public static Rect getGlobalRect(View v) {
rect = new Rect();
v.getGlobalVisibleRect(rect);//取出view在全屏中显示的坐标
return rect;
}
}
public class DailyViewAnimation extends TranslateAnimation {
public DailyViewAnimation(int fromType, int toType, float fromXValue, float toXValue, float fromYValue, float toYValue) {
super(fromType, fromXValue, toType, toXValue, fromType, fromYValue, toType, toYValue);
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
// int newHeight;
// if (this.initiallyCollapsed) {
// newHeight = (int) (this.deltaY * interpolatedTime);
// } else {
// newHeight = (int) (this.deltaY * (1 - interpolatedTime));
// }
// view.getLayoutParams().height = newHeight;
// view.requestLayout();
super.applyTransformation(interpolatedTime, t);
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
}
}
分享到:
相关推荐
版权声明:本文为博主原创文章,码字不易,转载请注明原文地址,谢谢。 https://blog.csdn.net/qq_16131393/article/
全屏动画,可以把资源图替换成表情包~
Android动画隐藏标题栏全屏
android点击相机和图片选择用到自定义Dialog
很简单的3秒全屏倒计时,动画效果。
ViewPager实现点击放大到全屏
可以实现一些稍微复杂的安卓动画 比较简便,后续想要加动画也很简单
点击图片,根据图片所在位置开始全屏的动画效果+手势缩放图片
我们知道在Android动画里,子类的动画很难飞出父类的范围,然而项目中又会经常需要各种大范围动画特效,比如购物车特效,拖拽特效等等,攻城狮们给出的解决方案也是多种多样,今天我给大家带来的就是一种常见的方法,即在...
Android PopupWindow全屏 很多应用中经常可以看到弹出这种PopupWindow的效果,做了一个小demo分享一下。demo的思路是通过遍历文件,找到图片以及图片文件夹放置在PopupWindow上面。点击按钮可以弹出这个PopupWindow...
关于android 动画技术的课件PPT,内容概要: 1)Tween动画 2)Frame帧动画 3)全屏与横屏技术 4)获取屏幕属性
仿漂流瓶全屏与非全屏切换.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
5.3 动画实现 5.3.1 Tween动画 5.3.2 Frame动画 5.3.3 GIF动画播放 5.4 小结 第6章 Android数据存储 6.1 Android数据存储初探 6.2 数据存储之Shared Preferences 6.3 数据存储之Files 6.4 数据存储之Network 6.5 ...
全屏滑动Slide动画(SlideAnimation),支持上下左右四个方向移入与移出 5.自身控件范围内滑动动画(SlideUnderneathAnimation),支持上下左右四个方向移入与移出 6.抖动Shake动画(ShakeAnimation),支持垂直与...
自定义卡片移除动画 支持加载更多 使用方式 gradle dependency // 1. Add it in your root build.gradle at the end of repositories: allprojects { repositories { ... maven { url 'https://jitpack.io' } }...
一个图像在屏幕上往右飘动,飘到右边时反弹,往左飘动,一次类推,循环往复实现。是学习Scroller的极好的入门例子。
或者其他可操作的悬浮的窗口时,你不能影响该activity的正常运行(比如播放器界面的播放画面不停止,动画不停止等),所以就需要考虑到Dialog风格的activity了,关键点就是设置dialog全屏显示,因为根据系统的theme....
因为我想在ViewPager实现图片放大缩小的动画,但是ViewPager几个页面的动画会一起动,而且放大全屏图片的话会相互覆盖,很诡异。于是上网搜demo,一无所获。迫于无奈。。。 废话不多说,直接贴代码。 1.配置文件...
5.3 动画实现 5.3.1 Tween动画 5.3.2 Frame动画 5.3.3 GIF动画播放 5.4 小结 第6章 Android数据存储 6.1 Android数据存储初探 6.2 数据存储之Shared Preferences 6.3 数据存储之Files 6.4 数据...
图片变换广告,显示图片渐变的一个过程,动画效果。点击图片能使图片放大.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。