- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已经尝试了很多不同的方法来解决这个问题,但都没有奏效。我乐于接受建议。
我正在制作一个自定义“按钮”。它不是 Button
类型,但可以作为多状态按钮使用。每个按钮都有 3 个不同颜色的字形,代表不同的状态(蓝色、白色和橙色)。无论哪个字形处于主要状态,都比其他字形大得多,如下所示:
目前,每个“按钮”都是一个带有 3 个 ImageView 的 LinearLayout,每个 ImageView 由一个权重为 0.2 + 0.6 + 0.2 = 1.0 的 PathShape 可绘制对象填充。那部分工作得很好。 0.6是初级状态权重。
我在屏幕上有一个简单的按钮来触发动画。动画会将当前主要权重从 0.6 降低到 0.2,并将新主要权重从 0.2 降低到 0.6。一个缩小,另一个长大。
问题:动画不会同时运行,即使我已经明确告诉它们同时运行。第一个从 0.6 缩小到 0.2,然后有一个轻微的停顿,然后第二个从 0.2 增长到 0.6。
Button button = (Button)this.findViewById(R.id.shift);
button.setOnClickListener(new View.OnClickListener() {
public Animator makeWeightAnimator(final View v, float startingWeight, float endingWeight) {
long duration = 2000;
ValueAnimator va = ValueAnimator.ofFloat(startingWeight, endingWeight);
va.setDuration(duration);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
LinearLayout.LayoutParams paramsanim = (LinearLayout.LayoutParams)v.getLayoutParams();
paramsanim.weight = value.floatValue();
v.requestLayout();
}
});
return va;
}
@Override
public void onClick(View v) {
float newBlueWeight = 0.2f;
float newWhiteWeight = 0.2f;
float newOrangeWeight = 0.2f;
if (state == 0) {
// Make blue larger
newBlueWeight = 0.6f;
} else if (state == 1) {
// Make white larger
newWhiteWeight = 0.6f;
} else {
// Make orange larger
newOrangeWeight = 0.6f;
}
// Total will be 0.2 + 0.6 + 0.2 = 1.0
List<Animator> animators = new LinkedList<Animator>();
LinearLayout.LayoutParams blueParams = (LinearLayout.LayoutParams)blueImage.getLayoutParams();
Log.d("TA", String.format("blue %f -> %f", blueParams.weight, newBlueWeight));
if (Math.abs(blueParams.weight - newBlueWeight) > 0.001) {
// new weight is different from existing weight
Animator va = makeWeightAnimator(blueImage, blueParams.weight, newBlueWeight);
animators.add(va);
}
LinearLayout.LayoutParams whiteParams = (LinearLayout.LayoutParams)whiteImage.getLayoutParams();
Log.d("TA", String.format("white %f -> %f", whiteParams.weight, newWhiteWeight));
if (Math.abs(whiteParams.weight - newWhiteWeight) > 0.001) {
// new weight is different from existing weight
Animator va = makeWeightAnimator(whiteImage, whiteParams.weight, newWhiteWeight);
animators.add(va);
}
LinearLayout.LayoutParams orangeParams = (LinearLayout.LayoutParams)orangeImage.getLayoutParams();
Log.d("TA", String.format("orange %f -> %f", orangeParams.weight, newOrangeWeight));
if (Math.abs(orangeParams.weight - newOrangeWeight) > 0.001) {
// new weight is different from existing weight
Animator va = makeWeightAnimator(orangeImage, orangeParams.weight, newOrangeWeight);
animators.add(va);
}
if (animators.size() > 0) {
AnimatorSet s = new AnimatorSet();
s.playTogether(animators);
s.start();
}
state++;
if (state > 2) {
state = 0;
}
}
});
这是我制作的一个视频,展示了按顺序而不是并行运行的动画:
http://inadaydevelopment.com/stackoverflow/AndroidLinearLayoutAnimation.html
我什至尝试将所有更改组合到一个动画师中,而不是尝试让多个动画师并行运行,但动画仍然按顺序发生。我觉得我失去了理智:
public Animator makeSimultaneousAnimator(final ViewGroup parentViewGroup, final View growingView, final View shrinkingView, final View otherView, float startingWeight, float endingWeight) {
long duration = 2000;
ValueAnimator va = ValueAnimator.ofFloat(startingWeight, endingWeight);
va.setDuration(duration);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Float value = (Float) animation.getAnimatedValue();
float growingWeight = value.floatValue();
LinearLayout.LayoutParams growingParams = (LinearLayout.LayoutParams)growingView.getLayoutParams();
LinearLayout.LayoutParams shrinkingParams = (LinearLayout.LayoutParams)shrinkingView.getLayoutParams();
LinearLayout.LayoutParams otherParams = (LinearLayout.LayoutParams)otherView.getLayoutParams();
float otherWeight = otherParams.weight;
float shrinkingWeight = 1.0f - growingWeight - otherWeight;
growingParams.weight = growingWeight;
shrinkingParams.weight = shrinkingWeight;
parentViewGroup.requestLayout();
//growingView.requestLayout();
//shrinkingView.requestLayout();
}
});
return va;
}
最佳答案
我会保留对大型 ImageView
的引用,以便轻松地遵循它。然后每次触发事件时,减少大的并增加另一个。
我在 LinearLayout
中的每个 ImageView
上做了一个点击监听器的例子。
大的最初是中间的ImageView
,它的权重预设为0.6
,而其他的则为0.2
。
private static final float FROM_WEIGHT = 0.2f;
private static final float TO_WEIGHT = 0.6f;
private static final int DURATION = 500;
private View v1, v2, v3, big;
private View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v == big) {
return;
} else if (v1 == big) {
animate(v1, TO_WEIGHT, FROM_WEIGHT);
} else if (v2 == big) {
animate(v2, TO_WEIGHT, FROM_WEIGHT);
} else if (v3 == big) {
animate(v3, TO_WEIGHT, FROM_WEIGHT);
}
big = v;
animate(v, FROM_WEIGHT, TO_WEIGHT);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v1 = findViewById(R.id.tv1);
big = v2 = findViewById(R.id.tv2);
v3 = findViewById(R.id.tv3);
v1.setOnClickListener(clickListener);
v2.setOnClickListener(clickListener);
v3.setOnClickListener(clickListener);
}
private void animate(final View v, float from, float to) {
ValueAnimator va = ValueAnimator.ofFloat(from, to);
va.setDuration(DURATION);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
float growingWeight = (Float) animation.getAnimatedValue();
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
params.weight = growingWeight;
v.setLayoutParams(params);
}
});
va.start();
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:background="#00FFFF"
android:layout_weight="0.2"
android:id="@+id/tv1"
android:layout_width="100dp"
android:layout_height="0dp"/>
<ImageView
android:background="#FFFF00"
android:layout_weight="0.6"
android:id="@+id/tv2"
android:layout_width="100dp"
android:layout_height="0dp"/>
<ImageView
android:background="#FF00FF"
android:layout_weight="0.2"
android:id="@+id/tv3"
android:layout_width="100dp"
android:layout_height="0dp"/>
</LinearLayout>
关于android - 使用 ValueAnimator 在 LinearLayout 权重上同时运行动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29453543/
我需要通过 ValueAnimator 创建一个转换动画到某些特定的 x 和 y 值,所以我编写了以下代码,但它不是按我的预期工作,并在 valueAnimator.getAnimatedValue(
我有一个 Custom ViewGroup 类和我添加到其中的图像。当点击屏幕时,我想为添加的图像设置动画,使其以波浪状模式在屏幕上移动。我现在所拥有的在下面,但是尽管图像以波浪状模式移动,但它跳得太
我正在尝试制作一个动画,其中我有 4 个以不同方式玩杂耍的圆圈。 我正在使用 ValueAnimator 来执行此操作,但是当我第二次重复 AnimatorSet 时,一个元素消失并重新出现.....
我想创建一个背景色不断从红色变为蓝色的屏幕。出于某种原因,当我尝试实例化 ValueAnimator 时它总是崩溃。我不知道我的代码有什么问题 谢谢 动画类 public BackgroundAnim
我的 AsyncTasks 类中有这段工作代码。 protected void onProgressUpdate(Object... values) { View view = (Vi
因此,我正在使用 ValueAnimator 以无限循环或至少直到动画停止为止,为简笔画的四肢从一个位置设置动画到另一个位置。我的问题是,当动画师重复时,我有轻微的停顿,好像动画滞后了,但它只发生在动
我正在使用浮点值的 ValueAnimator。 ValueAnimator anim = ValueAnimator.ofFloat(-1, 1); anim.addUpdateListener(n
我正在尝试让 ValueAnimator 在结束后重复。我将它与 ListView 中的 SeekBar 一起使用。由于某种原因,ValueAnimator 将完成,再次触发 onAnimationE
我有以下方法来配置我的 ValueAnimator 以在两种颜色之间交叉淡入淡出。但它不起作用。它总是给出结束颜色值。 Integer colorFrom; Integer colorTo; publ
我想用下面这个做一个翻译动画 public static void move(TextView view){ ValueAnimator va = ValueAnimator.ofFloat(
我想要一些能够模仿 Android 中 ValueAnimator 在 iOS 中的行为的东西。在正常情况下,我会使用 UIView 动画,但不幸的是,我尝试随时间插值的对象值不适用于普通动画。 在我
是否可以在不启动动画的情况下从ValueAnimator获取动画值?我确实有开始颜色和目标颜色。 我有一个 PageTransformer,我想根据页面位置设置背景颜色。所以我想随着页面滑动改变背景颜
我尝试制作ImageView 的扩展布局动画和平移 动画,但我同时启动它们时它们看起来有点滞后。我在真实设备 Moto X(2013) 上对其进行了测试。不确定更强大的设备,因为默认情况下我所有的模拟
我正在尝试为从 0 到 100 然后再回到 0 的值设置动画。所以我认为 ValueAnimator 是最好的。我是这样做的 ValueAnimato animator = ValueAnimator
我正在尝试重现 this iOS-like Bounce Effect来自this library . 当我从触摸 RelativeLayout 中释放时,它会立即返回到顶部,而它应该以 n 毫秒的持
我有以下代码(Scala 中的 Android 项目): val animator = new ValueAnimator animator.setFloatValues(0f, 100f) anim
我对 ValueAnimator 在 Android 中的工作方式感到很困惑。这是一个代码 fragment (伪): Log("animating: ", start, end); ValueAni
我正在尝试一个简单的示例,例如使用 TextView 并将其从屏幕宽度的 0% 转换为 100% 代码是: anim0 = ObjectAnimator.ofFloat(textViewId
现在我通过检查进度何时达到 100 来检测我的 ValueAnimator 的结束... //Setup the animation ValueAnimator anim = ValueAnimato
我正在尝试在 TextView 中为这样的 double 值制作 cout-up 效果: ValueAnimator animator = new ValueAnimator(); animator
我是一名优秀的程序员,十分优秀!