由于默认情况下,动画只针对当前父布局范围中有效,有的时候我们需要在全屏范围中做做飘的效果;实际做法我想应该有两个:
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);
}
}
分享到:
相关推荐
本教程将详细讲解如何创建一个全屏显示且带有动画效果的自定义Dialog,并结合相机和图片选择的使用场景进行演示。 首先,我们需要了解Android Dialog的基础知识。Dialog是Android系统提供的一种轻量级窗口,通常...
- 创建两个不同的布局,一个为原始界面,另一个为全屏动画界面。 - 应用`ChangeTransform`和`ChangeBounds` Transition,调整视图的大小和位置,同时结合`Fade` Transition实现透明度变化。 - 在点击事件中,通过...
总的来说,隐藏标题栏并实现全屏在Android中是一项基本操作,通过XML布局设置或Java代码控制,结合动画效果,可以轻松实现。而具体的选择应根据项目需求和个人偏好来确定。在实际开发中,还可以考虑适配不同Android...
总的来说,实现Android全屏图片显示需要考虑图片加载库的选择、布局设计、图片加载与显示、缩放处理以及性能优化等多个环节。通过合理的设计和实现,我们可以提供一个流畅、美观的全屏图片显示效果。
全屏动画,可以把资源图替换成表情包~
在Android开发中,实现“Android 图片点击动画全屏手势缩放”的功能是常见的需求,尤其是在设计用户界面和交互体验时。这个功能涉及到多个技术点,包括图片加载、动画处理、手势识别以及视图的布局管理。下面我们将...
在Android开发中,实现一个3秒的全屏倒计时动画是常见的需求,这通常用于启动页、游戏加载或者用户操作前的准备阶段。本文将详细介绍如何创建这样一个倒计时功能,并结合`TimerDemo`这个示例项目进行解析。 首先,...
布局文件应设计为全屏尺寸,可以通过设置`android:layout_width="match_parent"`和`android:layout_height="match_parent"`来实现。 2. 创建Dialog类:接下来,我们需要继承自`DialogFragment`或`AlertDialog....
总的来说,实现Android ImageView图片放大到全屏显示并支持局部拉伸放大,需要理解Android的触摸事件处理机制,以及ImageView的缩放属性。通过自定义ImageView和手势检测,我们可以实现丰富的图片查看交互。同时,...
在Android开发中,有时我们需要创建一个可全屏拖动并能响应点击事件的自定义View。这个场景在很多应用中都很常见,例如在设计交互式的界面或者游戏时。本篇文章将详细讲解如何实现这样一个功能,主要涉及的知识点...
下面我们将深入探讨SVGA在安卓动画实现中的具体知识点。 1. **SVG矢量图形**:SVG是一种基于XML的二维矢量图像格式,可以在不同分辨率下保持清晰,不损失质量。SVGA就是利用SVG的这一特性,确保动画在各种设备上都...
下面我们将深入探讨Android全屏欢迎界面的实现原理和关键知识点。 1. **布局设计** - 全屏欢迎界面通常由一个全屏背景图和可能的Logo或应用名称组成。在`res/layout`目录下创建一个新的XML布局文件,例如`splash_...
ViewPager实现点击放大到全屏
在Android开发中,自定义View是一种常见的需求,用于实现独特的用户界面或动画效果。本案例中的"Android-BreatheView呼吸灯闪烁效果的自定义View"是一个专门设计用来模拟呼吸灯闪烁效果的自定义组件。这种效果常常...
本文将深入探讨如何在Android中实现全屏模式,并基于"Android全屏demo"进行详细解析。 全屏模式在Android中主要分为以下几种: 1. **SYSTEM_UI_FLAG_HIDE_NAVIGATION**: 这个标志隐藏底部的导航栏(包括返回、...
在本文中,我们将深入探讨如何实现一个全屏的`AlertDialog`,以及与其相关的Android开发技术。 首先,`AlertDialog`是Android系统提供的一种对话框组件,它通常用于显示警告、确认或者询问用户的信息。`AlertDialog...
2. **代码实现全屏**: 在Activity的`onCreate()`方法中,可以使用以下代码隐藏状态栏和导航栏: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { View decorView = getWindow()....
本文将详细介绍如何修改Android系统关机动画,并提供一个简单的实现示例。 首先,了解关机动画在Android系统中的工作原理是必要的。关机动画通常是在系统执行关机序列时展示的一系列图形界面。它们是通过在Android...
我们知道在Android动画里,子类的动画很难飞出父类的范围,然而项目中又会经常需要各种大范围动画特效,比如购物车特效,拖拽特效等等,攻城狮们给出的解决方案也是多种多样,今天我给大家带来的就是一种常见的方法,即在...
这个压缩包“安卓动画效果相关-仿漂流瓶全屏与非全屏切换.rar”显然包含了关于如何在安卓应用中实现漂流瓶从全屏到非全屏状态切换的示例代码。漂流瓶的全屏与非全屏切换通常涉及到屏幕尺寸的改变、布局调整以及动画...