java 带动画的 WindowManager(有可能吗?)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17745282/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WindowManager with Animation (is it possible?)
提问by LeandroPortnoy
Is there any way to inflate a view with WindowManager using Animation (at android's project)? I just can't do it even using the examples in sites! I used many examples but none worked!
有没有办法使用动画(在 android 的项目中)使用 WindowManager 来膨胀视图?即使使用站点中的示例,我也无法做到!我用了很多例子,但没有一个奏效!
public BannerLayout(Activity activity, final Context context) {
super(context);
this.context = context;
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSLUCENT);
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.popupLayout = (RelativeLayout) inflater.inflate(R.layout.popup_activity, null);
this.popupLayout.setVisibility(GONE);
this.setActive(false);
wm.addView(this.popupLayout, params);
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private void show(){
Animation in = AnimationUtils.loadAnimation(this.context, android.R.anim.fade_in);
this.popupLayout.setAnimation(in);
this.setActive(true);
this.popupLayout.setVisibility(VISIBLE);
}
回答by sandrstar
I'm not sure about exact requirements for Your task, but there's two ways to provide animation to window:
我不确定您的任务的确切要求,但有两种方法可以为窗口提供动画:
Use
WindowManager.LayoutParams.windowAnimations
like the following:params.windowAnimations = android.R.style.Animation_Translucent;
Add additonal 'container' view, because
WindowManager
is not a realViewGroup
and so normal animation for adding views is not working with it. This question has been asked already, however it lacks the code. I would apply it the following way:public class BannerLayout extends View { private final Context mContext; private final ViewGroup mPopupLayout; private final ViewGroup mParentView; public BannerLayout(Activity activity, final Context context) { super(context); mContext = context; final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); final WindowManager mWinManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mPopupLayout = (RelativeLayout) inflater.inflate(R.layout.popup_activity, null); mPopupLayout.setVisibility(GONE); params.width = ActionBar.LayoutParams.WRAP_CONTENT; params.height = ActionBar.LayoutParams.WRAP_CONTENT; // Default variant // params.windowAnimations = android.R.style.Animation_Translucent; mParentView = new FrameLayout(mContext); mWinManager.addView(mParentView, params); mParentView.addView(mPopupLayout); mPopupLayout.setVisibility(GONE); } /** * Shows view */ public void show(){ final Animation in = AnimationUtils.loadAnimation(this.mContext, android.R.anim.fade_in); in.setDuration(2000); mPopupLayout.setVisibility(VISIBLE); mPopupLayout.startAnimation(in); } /** * Hides view */ public void hide() { mPopupLayout.setVisibility(GONE); } }
使用
WindowManager.LayoutParams.windowAnimations
如下:params.windowAnimations = android.R.style.Animation_Translucent;
添加附加的“容器”视图,因为
WindowManager
它不是真实的ViewGroup
,因此用于添加视图的普通动画无法使用它。这个问题已经被问过了,但是它缺少代码。我会通过以下方式应用它:public class BannerLayout extends View { private final Context mContext; private final ViewGroup mPopupLayout; private final ViewGroup mParentView; public BannerLayout(Activity activity, final Context context) { super(context); mContext = context; final WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, PixelFormat.TRANSLUCENT); final WindowManager mWinManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mPopupLayout = (RelativeLayout) inflater.inflate(R.layout.popup_activity, null); mPopupLayout.setVisibility(GONE); params.width = ActionBar.LayoutParams.WRAP_CONTENT; params.height = ActionBar.LayoutParams.WRAP_CONTENT; // Default variant // params.windowAnimations = android.R.style.Animation_Translucent; mParentView = new FrameLayout(mContext); mWinManager.addView(mParentView, params); mParentView.addView(mPopupLayout); mPopupLayout.setVisibility(GONE); } /** * Shows view */ public void show(){ final Animation in = AnimationUtils.loadAnimation(this.mContext, android.R.anim.fade_in); in.setDuration(2000); mPopupLayout.setVisibility(VISIBLE); mPopupLayout.startAnimation(in); } /** * Hides view */ public void hide() { mPopupLayout.setVisibility(GONE); } }
回答by xXJJJasonMokXx
Yes it is indeed possible. As long as the view you want to animate is inside a container, by container I mean for instance a LinearLayout or any other layout will do. Conclusively the view to be animated should not be the root view of a window and so you should be able to animate the view :)
Hope it helps
是的,这确实是可能的。只要您想要动画的视图在容器内,容器我的意思是例如 LinearLayout 或任何其他布局都可以。最后,要动画的视图不应该是窗口的根视图,因此您应该能够动画视图:)
希望它有所帮助