android 全屏动画,Android实现全屏动画

由于默认情况下,动画只针对当前父布局范围中有效,有的时候我们需要在全屏范围中做做飘的效果;实际做法我想应该有两个:

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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android播放器切换全屏是一种常见的操作,能够提供更好的观看体验。在Android开发中,要实现播放器的全屏切换,可以通过以下步骤进行: 1. 首先,需要在播放器的布局文件中添加一个用于全屏显示的组件,例如一个FrameLayout,并设置其宽度和高度为match_parent。 2. 在播放器的Activity或Fragment中,监听并处理全屏切换的事件。一般可以通过点击一个全屏按钮或者设备屏幕旋转来触发全屏切换。 3. 当触发全屏切换时,需要进行一些操作,首先是隐藏系统状态栏和导航栏,可以通过设置Activity的Window属性来实现。例如,在Activity的onCreate()方法中可以添加如下代码: ``` getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); ``` 4. 接下来,需要调整播放器的宽度和高度,以充满整个屏幕。可以通过设置播放器容器的LayoutParams来实现,例如: ``` FrameLayout frameLayout = findViewById(R.id.player_container); frameLayout.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); ``` 5. 调整完播放器的尺寸后,还需要调整播放器的布局,使其能够适应全屏显示。这可能涉及到改变视频的缩放模式、调整控制面板的位置等等,具体操作可以根据需求进行调整。 通过上述步骤,就可以实现Android播放器的全屏切换。当切换到全屏时,用户能够更好地享受视频内容,提供了更好的观看体验。同时,在退出全屏时,需要还原回原始的布局和尺寸设置,以保持应用的稳定性和一致性。 ### 回答2: Android 播放器切换全屏是指在播放视频时,将播放器界面自动切换到全屏模式,以便用户可全屏观看视频。在Android开发中,实现播放器切换全屏通常需要以下步骤: 1. 首先,需要在布局文件中创建一个用于播放视频的VideoView组件,并设置其宽高为match_parent以占满整个屏幕。 2. 在Activity或Fragment中,需要实现全屏切换的逻辑。一种常见的方式是监听屏幕方向变化,并在全屏与非全屏之间进行切换。 3. 在监听屏幕方向变化时,可以通过重载Activity或Fragment的onConfigurationChanged方法来响应屏幕方向变化事件。当屏幕方向变为横屏时,将播放器的布局参数设置为全屏,同时隐藏其他UI元素(例如标题栏、导航栏等)。当屏幕方向变为竖屏时,恢复播放器的原始布局参数,并显示其他UI元素。 4. 在切换全屏时,还需要调用Activity或Fragment的setRequestedOrientation方法来设置屏幕方向,以保证播放器可以正确显示。 5. 在全屏切换过程中,还可以添加一些动画效果,使切换过程平滑。 6. 最后,为了确保播放器能够正常播放全屏视频,还需要注意一些细节,例如在全屏切换时暂停播放、切换屏幕方向时重新加载视频等。 综上所述,Android 播放器切换全屏可以通过监听屏幕方向变化,调整播放器布局参数以及设置屏幕方向等步骤来实现。通过合理的逻辑和界面设计,可以让用户在Android设备上享受到更好的全屏视频观看体验。 ### 回答3: Android播放器切换全屏需要以下步骤: 1. 首先,确保在播放器布局中有一个用于视频显示的容器,比如一个SurfaceView或TextureView。 2. 在播放器的Activity或Fragment中,设置一个标志变量来记录当前的屏幕状态,比如fullscreenFlag,默认为false。 3. 在播放器的布局文件中,添加一个全屏按钮,使用一个ImageView来表示。当用户点击全屏按钮时,触发一个点击事件。 4. 在点击事件中,先检查当前屏幕状态。如果fullscreenFlag为false,即当前非全屏状态,则进行全屏切换操作。 5. 在全屏切换操作中,首先修改fullscreenFlag为true,然后获取到当前的Activity对象,并设置其显示方式为全屏模式,同时隐藏状态栏和导航栏。 6. 接下来,获取到当前Activity的窗口对象,调用setFlags方法并传入FLAG_FULLSCREEN标志,以全屏显示视频。 7. 修改播放器布局中的容器,将其宽度和高度设置为MATCH_PARENT,使视频充满整个屏幕。 8. 最后,调用横屏切换方法setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),将Activity设置为横屏显示。 通过以上步骤,可以实现Android播放器的全屏切换功能。当用户点击全屏按钮时,播放器会切换到全屏模式,视频会充满整个屏幕,同时隐藏状态栏和导航栏。用户可以在全屏模式下享受更好的观影体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值