gpt4 book ai didi

android - AppCompat v22 : Reference new interpolators via XML

转载 作者:太空狗 更新时间:2023-10-29 13:20:12 25 4
gpt4 key购买 nike

我一直在尝试利用现在在支持库的 v22 中可用的新插值器(FastOutLinearIn 等)。更具体地说,我想通过 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 或之前的版本中不起作用: Activity 转换不再出现,使应用程序处于旧 Activity 仍然可见但无响应的状态,因为我认为新 Activity 被认为是 Activity 的但不是'被渲染。在升级之前,当 v21+ 样式使用新的(非兼容的)插值器时,它工作正常。

最佳答案

不幸的是,无法在 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;

}

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

您可以使用新的插值器,但是它们需要位于 xml 的版本化资源目录中。一种变通方法是创建您自己的“AnimationUtils”,但这意味着只要您找到接受动画 id 的方法,就包含另外一种方法 + 您的 R.anim.*。

关于android - AppCompat v22 : Reference new interpolators via XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29931918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com