我正在为Android开发一款应用程序,它具有美观但难以实现的设计,并带有大量自定义动画。现在我需要为按钮实现动画,它必须是影响按钮边框及其文本的动态扫视动画,并且必须从左向右移动。以下是iOS应用程序中此类动画的示例。
所以我希望你能抓住主要想法。我试图使用Property Animation,但它并不是我真正需要的。我还发现了许多自定义库,并尝试了很多SDK的例子,但没有类似的东西。
所以如果你知道怎么做,请回答我。
答案 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)
我完成了我的自定义实现。
到目前为止的结果:
这是通过在静态TextView上传输动画渐变着色器获得的 您可以在以下要点上获取源代码:ShinnyTextView
当前版本不支持XML自定义,但您可以调整代码中的值。
如果您正在使用此功能,您可能希望更精确地控制何时暂停/重新启动动画以避免动画