【问题标题】:AppCompat v22: Reference new interpolators via XMLAppCompat v22:通过 XML 引用新的插值器
【发布时间】:2015-11-16 09:19:09
【问题描述】:

我一直在尝试利用支持库(FastOutLinearIn 等)的 v22 中现在提供的新插值器。更具体地说,我想通过 XML 引用它们。

我尝试使用 @android:interpolator/fast_out_linear_in 但 LINT 告诉我这是 v21+ 版本。我尝试在其他地方四处挖掘,但没有发现任何看起来有帮助的东西。

我还尝试创建这样的自定义插值器:(在 my_linear_out_slow_in.xml 中)

<?xml version="1.0" encoding="utf-8"?>
<linearOutSlowInInterpolator />

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.animation.LinearOutSlowInInterpolator          
   xmlns:android="http://schemas.android.com/apk/res/android" />

但它们在 Lollipop 或以前的版本中不起作用:活动转换不再出现,使应用程序处于旧活动仍然可见但无响应的状态,因为我认为新活动被认为是活动的但不是'没有被渲染。在升级之前,当 v21+ 样式使用新的(非兼容的)插值器时,它工作得很好。

【问题讨论】:

    标签: android android-appcompat


    【解决方案1】:

    不幸的是,无法在 xml 中使用设计支持库的插值器。这是因为AnimationUtils 处理创建插值器的方式。

    取自 Gingerbread (API 9) 源 http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.3.2_r1/android/view/animation/AnimationUtils.java?av=f

     private static Interpolator createInterpolatorFromXml(Context c, XmlPullParser parser)
            throws XmlPullParserException, IOException {
    
        Interpolator interpolator = null;
    
        // Make sure we are on a start tag.
        int type;
        int depth = parser.getDepth();
    
        while (((type=parser.next()) != XmlPullParser.END_TAG || parser.getDepth() > depth)
               && type != XmlPullParser.END_DOCUMENT) {
    
            if (type != XmlPullParser.START_TAG) {
                continue;
            }
    
            AttributeSet attrs = Xml.asAttributeSet(parser);
    
            String  name = parser.getName();
    
    
            if (name.equals("linearInterpolator")) {
                interpolator = new LinearInterpolator(c, attrs);
            } else if (name.equals("accelerateInterpolator")) {
                interpolator = new AccelerateInterpolator(c, attrs);
            } else if (name.equals("decelerateInterpolator")) {
                interpolator = new DecelerateInterpolator(c, attrs);
            }  else if (name.equals("accelerateDecelerateInterpolator")) {
                interpolator = new AccelerateDecelerateInterpolator(c, attrs);
            }  else if (name.equals("cycleInterpolator")) {
                interpolator = new CycleInterpolator(c, attrs);
            } else if (name.equals("anticipateInterpolator")) {
                interpolator = new AnticipateInterpolator(c, attrs);
            } else if (name.equals("overshootInterpolator")) {
                interpolator = new OvershootInterpolator(c, attrs);
            } else if (name.equals("anticipateOvershootInterpolator")) {
                interpolator = new AnticipateOvershootInterpolator(c, attrs);
            } else if (name.equals("bounceInterpolator")) {
                interpolator = new BounceInterpolator(c, attrs);
            } else {
                throw new RuntimeException("Unknown interpolator name: " + parser.getName());
            }
    
        }
    
        return interpolator;
    
    }
    

    它们遵循相同的代码路径,但在棒棒糖中添加了一个新的插值器 PathInterpolator,它是所有新插值器的“基类”。

    您可以使用新的插值器,但是它们需要位于 xml 的版本化资源目录中。一种解决方法是创建您自己的“AnimationUtils”,但这意味着当您找到一个接受动画 id 的方法时,再添加一个方法 + 您的 R.anim.*。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多