【问题标题】:Animating Android Window along with the View动画 Android 窗口连同视图
【发布时间】:2015-11-16 04:58:50
【问题描述】:

我正在做一个自定义的 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();

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

中描述的行为相同

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

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

谢谢

【问题讨论】:

  • 你的myView 布局是什么样的?

标签: android animation


【解决方案1】:

您有两种选择来实现这一点(使用户的触摸反馈与View 的位置保持一致):

  1. 创建一个透明容器(如FrameLayout)大到足以包含您的View 加上它的动画偏移量(在您的情况下高度为366+300 px)。这样,您会将容器添加到Window,而View 则留在容器内并可以进行动画/平移。

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

这是一个使用 Rebound 的(未经测试的)示例:

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 的编译语句:

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

【讨论】:

    【解决方案2】:

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


    否则,您可以使用ValueAnimator 并反复调用WindowManagerupdateViewLayout

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

    【讨论】:

      【解决方案3】:

      请试试这个:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-14
        • 2012-03-05
        • 1970-01-01
        相关资源
        最近更新 更多