Android中的高级视图动画

时间:2014-12-30 15:33:59

标签: android animation

我正在为Android开发一款应用程序,它具有美观但难以实现的设计,并带有大量自定义动画。现在我需要为按钮实现动画,它必须是影响按钮边框及其文本的动态扫视动画,并且必须从左向右移动。以下是iOS应用程序中此类动画的示例。

from left

to right

所以我希望你能抓住主要想法。我试图使用Property Animation,但它并不是我真正需要的。我还发现了许多自定义库,并尝试了很多SDK的例子,但没有类似的东西。

所以如果你知道怎么做,请回答我。

3 个答案:

答案 0 :(得分:3)

我使用一系列PNG文件获取预渲染动画,然后使用AnimationDrawable显示它。

答案 1 :(得分:2)

试试这个包装类:

class FL extends FrameLayout implements ValueAnimator.AnimatorUpdateListener {
    private static final int W = 200;
    private final LinearGradient gradient;
    private final Paint paint;
    private float x;

    public FL(View child) {
        super(child.getContext());
        addView(child);
        int[] colors = {0, 0xaaffffff, 0};
        gradient = new LinearGradient(0, 0, W, 0, colors, null, Shader.TileMode.CLAMP);
        paint = new Paint();
        paint.setShader(gradient);
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
        x = -W;
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        canvas.saveLayer(null, null, 0);
        super.dispatchDraw(canvas);
        canvas.translate(x, 0);
        float h = getHeight();
        canvas.rotate(20, W / 2, h / 2);
        canvas.drawRect(0, -h, W, 2 * h, paint);
        canvas.restore();
    }

    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        x = (int) animation.getAnimatedValue();
        invalidate();
    }

    public void startMagic() {
        ValueAnimator a = ValueAnimator.ofInt(-W, getWidth());
        a.addUpdateListener(this);
        a.setDuration(1000).setInterpolator(new AccelerateDecelerateInterpolator());
        a.start();
    }
}

round_frame.xml是:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="20dp" />
    <stroke android:color="#a00" android:width="4dp" />
</shape>

并在onCreate中使用以下内容进行测试:

    Button b = new Button(this);
    final FL fl = new FL(b);
    b.setTextSize(28);
    b.setTextColor(0xffaa0000);
    b.setText("click me to see the magic");
    b.setBackgroundResource(R.drawable.round_frame);
    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fl.startMagic();
        }
    };
    b.setOnClickListener(listener);
    addContentView(fl, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));

注意:如果你想让它只在Button中使用它,你没有FL包装器:你可以像我在FL包装器类中那样扩展Button类并覆盖绘图方法/ p>

答案 2 :(得分:1)

我完成了我的自定义实现。

到目前为止的结果:

enter image description here

这是通过在静态TextView上传输动画渐变着色器获得的 您可以在以下要点上获取源代码:ShinnyTextView

当前版本不支持XML自定义,但您可以调整代码中的值。

如果您正在使用此功能,您可能希望更精确地控制何时暂停/重新启动动画以避免动画