随视图一起设置Android窗口的动画

随视图一起设置Android窗口的动画,android,animation,Android,Animation,我正在做一个定制的android构建,我的服务在每个应用程序的顶部添加一个视图。使用以下代码: WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.L

我正在做一个定制的android构建,我的服务在每个应用程序的顶部添加一个视图。使用以下代码:

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
mParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_PHONE, 
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
                PixelFormat.TRANSLUCENT);
mParams.height = 117;
mParams.width = 366;
View myView = inflater.inflate(R.layout.myView,null);
mWM.addView(myView, mParams);
我能够成功添加视图。我正在使用

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300);
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start();
我看到的是视图动画,但不是窗口。视图以前所在的透明窗口未设置动画。这与中描述的行为相同

视图动画系统的另一个缺点是,它仅修改绘制视图的位置,而不是实际视图本身。例如,如果设置按钮在屏幕上移动的动画,则按钮绘制正确,但可以单击按钮的实际位置不会更改,因此您必须实现自己的逻辑来处理此问题

如何设置窗口与视图的动画


谢谢

通过删除窗口参数中的高度和宽度,您可以使窗口充满整个屏幕。如果要控制视图大小,请改为在布局中设置它


否则,您可以使用
ValueAnimator
并重复调用
WindowManager
updateViewLayout

ValueAnimator va = ValueAnimator.ofInt(mParams.x, 300);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    public void onAnimationUpdate(ValueAnimator animation) {
        Integer value = (Integer) animation.getAnimatedValue();
        mParams.x = value.intValue();
        mWM.updateViewLayout(myView, mParams);
    }
});

您有两个选项可以实现这一点(保持用户的触摸反馈与
视图的位置一致):

  • 创建一个透明容器(如
    框架布局
    ),其大小足以包含
    视图
    及其动画偏移量(在您的情况下,高度为366+300 px)。通过这种方式,您将容器添加到
    窗口
    ,而
    视图
    将保留在容器内,并且可以设置动画/平移

  • 移动视图在屏幕上的绝对位置,创建一种自定义动画;您只需使用
    ValueAnimator
    动态设置
    mParams.x
    值,或者,如果您想要更大的弹性,可以通过库使用弹簧效果。我向你推荐最后一个,真是太棒了

  • 下面是一个使用回弹的(未经测试)示例:

    SpringSystem springSystem = SpringSystem.create();
    Spring spring = springSystem.createSpring();
    final int originalPos = mParams.x;
    final int offset = 300;
    spring.addListener(new SimpleSpringListener() {
    
      @Override
      public void onSpringUpdate(Spring spring) {
        float value = (float) spring.getCurrentValue(); 
        mParams.x = originalPos + ((int) value*offset)
        mWM.updateViewLayout(myView, mParams);
      }
    });
    spring.setEndValue(1);
    
    请记住,首先需要在依赖项中添加回弹的compile语句:

    // Gradle dependency on Rebound
    dependencies {
      compile 'com.facebook.rebound:rebound:0.3.8'
    }
    
    请试试这个:

    WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
    LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
    mParams = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.MATCH_PARENT,
                    WindowManager.LayoutParams.TYPE_PHONE, 
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
                    PixelFormat.TRANSLUCENT);
    mParams.gravity = Gravity.TOP | Gravity.LEFT;
    mParams.x = 0;
    mParams.y = 0;
    
    View myView = inflater.inflate(R.layout.myView,null);
    LinearLayout parent = new LinearLayout(context);
    parent.addView(myView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    mWM.addView(parent, mParams);
    
    并继续设置myView的动画

    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300);
    ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start();
    
    通知
    在XML文件-R.layout.myView中设置视图的宽度和高度

    您的
    myView
    布局是什么样子的?