Android 实现字体颜色渐变(滚动),包括表情:AnimatorSet、LinearGradient
2016-09-06 16:41
495 查看
动画效果及实现:可以参考 https://github.com/facebook/shimmer-android
2、用ObjectAnimator给这两个imageView添加动画;
3、利用AnimatorSet先后顺序组合这两个动画;
4、为AnimatorSet添加一个AnimatorListener监听器,当动画结束时,立刻再次启动该动画;
5、在结束动画时,记者要销毁ObjectAnimator、AnimatorSet对象;
6、在监听器中利用weakReference(弱引用)来保存animatorSet,达到及时释放内存的效果。
缺点:由于动画是无限循环的,则animator.start()方法就会无限地被调用,这样就会造成stackOverFlow,即方法栈溢出。
解决方法:在监听器中利用handler把animator.start()的消息放到消息队列中,等待执行,如下:
备注:如果想控制两个ImageView的始末位置,可以在他们的外层加一层RelativeLayout,通过定位RelativeLayout来控制imageview滚动的范围。
2、继承TextView ,重写其onDraw方法
代码如下:
缺点:如果textView中显示表情,就无法实现颜色条滚动的效果了,这个也许能实现,我暂时还没找到方法。
完整代码点我
实现思路一:AnimatorSet
1 、需要两个ImageView,用来滚动,可以自由控制颜色;2、用ObjectAnimator给这两个imageView添加动画;
3、利用AnimatorSet先后顺序组合这两个动画;
4、为AnimatorSet添加一个AnimatorListener监听器,当动画结束时,立刻再次启动该动画;
5、在结束动画时,记者要销毁ObjectAnimator、AnimatorSet对象;
6、在监听器中利用weakReference(弱引用)来保存animatorSet,达到及时释放内存的效果。
缺点:由于动画是无限循环的,则animator.start()方法就会无限地被调用,这样就会造成stackOverFlow,即方法栈溢出。
解决方法:在监听器中利用handler把animator.start()的消息放到消息队列中,等待执行,如下:
private static class InternalAnimatorSetListener implements Animator.AnimatorListener { //用于保存该动画的AnimatorSet对象,用于当该动画结束时,再次启动该动画 private WeakReference<AnimatorSet> weakReference; //处理animator.start()的消息 private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: { try { if (weakReference != null && weakReference.get() != null) { AnimatorSet animatorSet = weakReference.get(); if (animatorSet != null) { animatorSet.start(); } } } catch (Throwable e) { e.printStackTrace(); } break; } } } }; public InternalAnimatorSetListener(AnimatorSet animatorSet) { weakReference = new WeakReference<>(animatorSet); } @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { //发送消息,obtainMessage是从消息池中拿message,不会new handler.obtainMessage(1).sendToTarget(); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }
备注:如果想控制两个ImageView的始末位置,可以在他们的外层加一层RelativeLayout,通过定位RelativeLayout来控制imageview滚动的范围。
实现思路二:LinearGradient
1、线性渲染:LinearGradient2、继承TextView ,重写其onDraw方法
代码如下:
public class CustomTextView extends TextView { protected WeakReference<Context> contextWeakReference; private LinearGradient mLinearGradient; private Matrix mGradientMatrix; private Paint mPaint; private int mViewWidth = 0; private int mTranslate = 0; private boolean mAnimating = true; public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); this.contextWeakReference = new WeakReference<>(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mViewWidth = getMeasuredWidth(); if (mViewWidth > 0) { mPaint = getPaint(); mLinearGradient = new LinearGradient(-80, 0, 0, 0, new int[]{0xffffffff, 0xff000000, 0xffffffff}, new float[]{0, 0.5f, 1f}, Shader.TileMode.CLAMP); mPaint.setShader(mLinearGradient); mGradientMatrix = new Matrix(); } if (mAnimating && mGradientMatrix != null) { mTranslate += mViewWidth/10; if (mTranslate > mViewWidth+80) { mTranslate = 0; } mGradientMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(40); } } }
缺点:如果textView中显示表情,就无法实现颜色条滚动的效果了,这个也许能实现,我暂时还没找到方法。
完整代码点我
相关文章推荐
- LinearGradient在android开发中实现字体渐变效果实例
- Android-LinearGradient实现TextView字体渐变的效果
- Android-LinearGradient实现TextView字体渐变的效果
- android标题栏颜色渐变效果的实现(标题栏随着scrollview的滚动而变化)
- android 使用LinearGradient进行字体渐变的效果
- Android Textview实现颜色渐变滚动效果
- Android 微信6.1 tab栏图标和字体颜色渐变的实现
- android 使用LinearGradient进行字体渐变的效果
- android 使用LinearGradient进行字体渐变的效果
- Android 颜色渐变(gradient)的实现总结
- Android 微信6.1 tab栏图标和字体颜色渐变的实现
- Android 颜色渐变(gradient)的实现总结
- Android中的自绘View的那些事儿(三)之 颜色渐变渲染器:LinearGradient、RadialGradient 和 SweepGradient的简介
- android标题栏颜色渐变效果的实现(标题栏随着scrollview的滚动而变化)
- Tab栏图标和字体颜色渐变的实现
- 渐变颜色LinearGradientBrush
- 渐变颜色LinearGradientBrush
- Android组件TextView实现字体水平滚动
- Android 颜色渲染(五) LinearGradient线性渲染
- Android基础-简单的动画实现 *补间动画 *透明度渐变 *旋转动画 *位移动画 *如果需要几个效果整合到一起,需要将所有效果全部放到set里