动画Android窗口和视图

时间:2015-11-09 20:57:11

标签: android animation

我正在做一个自定义的Android构建,我的服务在每个应用程序的顶部添加一个View。使用以下代码:

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

我看到视图有效,但不是窗口。以前视图所在的透明窗口不是动画。这与Android Property Animation

中描述的行为相同
  

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

如何使窗口与视图一起设置动画?

由于

3 个答案:

答案 0 :(得分:2)

您有两种方法可以实现这一目标(保持用户的触摸反馈与View的位置一致):

  1. 创建一个透明的容器(如FrameLayout),其大小足以包含您的View及其动画偏移量(在您的情况下,其高度为 366 + 300 px )。通过这种方式,您可以将容器添加到Window,而View保留在容器内,并且可以进行动画/转换。

  2. 在屏幕上移动视图的绝对位置,创建一种自定义动画;您只需要使用mParams.x动态设置ValueAnimator值,或者如果您想要更多的弹性,可以通过Rebound库使用弹簧效果。我建议你最后一个,它真的很花哨!

  3. 这是一个使用反弹的(未经测试的)示例:

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

    请记住,您需要首先在依赖项中添加Rebound的compile语句:

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

答案 1 :(得分:1)

您可以通过从窗口参数中移除高度和宽度来使窗口填满整个屏幕。如果要控制视图大小,请将其设置在布局中。

否则,您可以使用ValueAnimator并反复拨打WindowManager的{​​{1}}:

updateViewLayout

答案 2 :(得分:1)

请试试这个:

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