txtSize.setText("This is my Text"); txtSize.setAnimation(AnimationUtils.loadAnimation(myContext,android.R.anim.slide_in_left));
现在我想问一下是否有可能让这个slide_in_left动画像wave一样进入?
我在这里找到了这个例子,但我不知道如何在我的情况下使用它(从左到右滑动,在TextView上不在GridView上):http://www.edumobile.org/android/android-development/wave-layout-animationexample/
谢谢你的帮助
解决方法
>覆盖onDraw的自定义视图
>在测量后或之后创建的路径,在屏幕上生成类似波形的形状(docs)
>使用Canvas的drawTextOnPath(String text,Path path,float hOffset,float vOffset,Paint paint)(docs)在切换到动画模式时在每个绘制过程中递增hOffset.
对于不熟悉Android中的自定义视图的未来读者,here is the developer resource.
我们的观点的API可能包括:
> setText(…)当然
> resetTextPosition()重置传入的动画
> animateToRight(双毫秒持续时间)以一段时间开始动画.
我们的类使用LayoutParams非常重要,例如像素高度,WRAP_CONTENT和MATCH_PARENT.现在这很棘手,因为完全以一种非常糟糕的方式完成继承实践通常意味着重写很多东西.所以,(顶部提示),我们继续让Layout Params为开发人员指定文本的所需宽度和高度,然后我们在视图上为topPadding和setPadding的bottomPadding引入一个新含义:
> setPadding(int …):参数topPadding和bottomPadding设置将为wave添加的空间.
这是一些可编译的可用代码:
public class WaveyTextView extends TextView { private int leftOffset = 0; private enum TransitionState{TRANSITION_STARTING,TRANSITION_RUNNING,TRANSITION_NONE}; private TransitionState transitionState; private double animDuration = 0; private double startTimeMillis; private Path wavePath = null; private final int pxWLength = 175; public WaveyTextView(final Context ctx) { super(ctx); } public final void resetTextPosition() { leftOffset = 0; transitionState = TransitionState.TRANSITION_NONE; invalidate(); } public final void animateToRight(final double animDuration) { this.animDuration = animDuration; transitionState = TransitionState.TRANSITION_STARTING; invalidate(); } @Override public void onDraw(final Canvas canvas) { if(wavePath==null) { generateWavePath(); } boolean done = true; switch(transitionState) { case TRANSITION_STARTING: done = false; transitionState = TransitionState.TRANSITION_RUNNING; startTimeMillis = SystemClock.uptimeMillis(); break; case TRANSITION_RUNNING: double normalized = (SystemClock.uptimeMillis() - startTimeMillis) / animDuration; done = normalized >= 1.0; normalized = Math.min(normalized,1.0); leftOffset = (int) (getWidth() * normalized); break; default: break; } canvas.drawTextOnPath(getText().toString(),wavePath,leftOffset,(getHeight()-(getPaddingTop()+getPaddingBottom()))/4,getPaint()); if(!done) { invalidate(); } } private void generateWavePath() { wavePath = new Path(); int lOffset = 0; int ct = 0; wavePath.moveTo(0,getHeight()/2); while(lOffset < getWidth()) { wavePath.quadTo(lOffset+pxWLength/4,getHeight() * (ct++ % 2),lOffset+pxWLength/2,getHeight()/2); lOffset += pxWLength/2; } }
说明
>我们使用枚举将视图置于三种状态.
TRANSITION_STARTING设置初始变量并告诉视图
进入TRANSITION_RUNNING状态.这种状态不断
invalidates()(通过UI消息队列重新调用onDraw)
视图的状态,因此将使用新参数再次绘制.您将在Android的内部视图和窗口小部件代码库中不断看到此模式.
> pxWLength是一个可调整的参数,表示波的波长.
> canvas.drawTextOnPath(getText().toString(),(getHeight() – (getPaddingTop()getPaddingBottom()))/ 4,getPaint());我们需要修改路径的水平偏移量,因为(另一个顶尖提示)Android绘制在路径上方对齐的文本 – 否则文本将被压缩在波形的波谷中.
final WaveyTextView wTV = new WaveyTextView(getActivity()); wTV.setPadding(0,75,75); wTV.setText("Some wavey text here..."); wTV.animateToRight(10000);
然后将它的高度WRAP_CONTENT宽度添加到你的活动中(或使用xml).
这需要一些调整!我希望这个有用,或者至少有一些想法会激励你创建自己的时髦文本动画类!