正确设置具有高程/投影设置的按钮

时间:2016-07-02 18:10:14

标签: java android xml android-studio android-animation

我目前正在为Android编写一个简单的记忆游戏并遇到了这个问题:

我想动画我的卡(这是一个图像按钮)来翻转。这有效。然而,无法工作的是通过提升属性分配给按钮的投影。它没有按预期显示,并引入了图形故障和小的性能问题。

你可以看看这里的故障: graphical glitches on the drop shadow

按钮在我的 activity_memory.xml 文件中定义,如下所示:

<!-- ... -->
<ImageButton
  android:layout_width="70dp"
  android:layout_height="70dp"
  android:id="@+id/btn_1_1"
  android:layout_column="0"
  android:background="@drawable/zelda0"
  android:layout_margin="2dp"
  android:gravity="center"
  android:onClick="button11clicked"
  android:elevation="5dp" />
<!-- ... -->

动画在我的drawable / animator flipcardtoback.xml 文件中指定,如下所示:

<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Rotate. -->
<objectAnimator
  android:valueFrom="0"
  android:valueTo="180"
  android:propertyName="rotationY"
  android:interpolator="@android:interpolator/accelerate_decelerate"
  android:duration="1000" />
</set>

代码触发动画功能,它会翻转卡片并在动画持续时间的中途将按钮的背景图像从正面图像切换到卡片的背面图像。

我想我翻转卡片的方式并不是问题所在。它只是毛刺的阴影。我真的不知道如何解决这个问题,因为我试图让一个新的可绘制资源形成一个投影并将其分配给按钮的背景属性。然而,这导致图像显然不显示。

有没有什么方法可以解决这个问题,这样可以正确地或者以更令人赏心悦目的方式设置投影效果?

1 个答案:

答案 0 :(得分:0)

缩小一个按钮,然后向上缩放。通过这种方式,按钮保持平坦,Android可以显示阴影。

public static final AccelerateInterpolator 
    ACCELERATE_INTERPOLATOR = new AccelerateInterpolator();
public static final DecelerateInterpolator
    DECELERATE_INTERPOLATOR = new DecelerateInterpolator();

...

private void animateFromTo(final Button buttonLeave, final Button buttonArrive) {
    buttonArrive.setVisibility(View.INVISIBLE);
    buttonLeave.animate()
            .setDuration(250)
            .scaleY(0)
            .setInterpolator(ACCELERATE_INTERPOLATOR)
            .setListener(new AnimatorListenerAdapter() {
                public void onAnimationEnd(Animator animation) {
                    buttonLeave.setVisibility(View.INVISIBLE);
                    buttonArrive.setScaleY(0);
                    buttonArrive.setVisibility(View.VISIBLE);
                    buttonArrive.animate()
                            .setDuration(250)
                            .scaleY(1)
                            .setInterpolator(DECELERATE_INTERPOLATOR)
                            .setListener(null)
                            .start();
                }
            }).start();
}