Android 自定义TextView实现文字渐变动画
来源:互联网 发布:c语言从入门到放弃图片 编辑:程序博客网 时间:2024/05/17 20:25
先来看效果
第一种效果的代码如下,主要是结合Shader实现的
import android.content.Context;import android.graphics.Canvas;import android.graphics.LinearGradient;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.Shader;import android.util.AttributeSet;import android.util.Log;import android.widget.TextView;public class GradientShaderTextView extends TextView { private LinearGradient mLinearGradient; private Matrix mGradientMatrix; private Paint mPaint; private int mViewWidth = 0; private int mTranslate = 0; private boolean mAnimating = true; private int delta = 15; public GradientShaderTextView(Context ctx) { this(ctx,null); } public GradientShaderTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); if (mViewWidth == 0) { mViewWidth = getMeasuredWidth(); if (mViewWidth > 0) { mPaint = getPaint(); String text = getText().toString(); // float textWidth = mPaint.measureText(text); int size; if(text.length()>0) { size = mViewWidth*2/text.length(); }else{ size = mViewWidth; } mLinearGradient = new LinearGradient(-size, 0, 0, 0, new int[] { 0x33ffffff, 0xffffffff, 0x33ffffff }, new float[] { 0, 0.5f, 1 }, Shader.TileMode.CLAMP); //边缘融合 mPaint.setShader(mLinearGradient); mGradientMatrix = new Matrix(); } } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int length = Math.max(length(), 1); if (mAnimating && mGradientMatrix != null) { float mTextWidth = getPaint().measureText(getText().toString()); mTranslate += delta; if (mTranslate > mTextWidth+1 || mTranslate<1) { delta = -delta; } mGradientMatrix.setTranslate(mTranslate, 0); mLinearGradient.setLocalMatrix(mGradientMatrix); postInvalidateDelayed(30); } }}
第二种效果
import android.animation.ObjectAnimator;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.LinearGradient;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.drawable.BitmapDrawable;import android.util.AttributeSet;import android.view.ActionMode;import android.view.View;import android.widget.TextView;public class KTVTextView extends View { private Paint mPaint; private int delta = 15; private float mTextHeight; private float mTextWidth; private PorterDuffXfermode xformode; private String mText = "你是我生命里的一首歌"; public KTVTextView(Context ctx) { this(ctx,null); } public KTVTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public KTVTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); xformode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); initViewAndDatas(); setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { postIndex = 0; postInvalidate(); } }); } public void initViewAndDatas() { mPaint.setColor(Color.CYAN); mPaint.setTextSize(40.0f); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setXfermode(null); mPaint.setTextAlign(Paint.Align.LEFT); Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); mTextHeight = fontMetrics.bottom-fontMetrics.descent-fontMetrics.ascent; mTextWidth = mPaint.measureText(mText); //文字精确高度 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //super.onMeasure(widthMeasureSpec, heightMeasureSpec); int mWidth; int mHeight; /** * 设置宽度 */ int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { mWidth = specSize; } else { // 由图片决定的宽 int desireByImg = getPaddingLeft() + getPaddingRight() + 380; if (specMode == MeasureSpec.AT_MOST)// wrap_content { mWidth = Math.min(desireByImg, specSize); } else mWidth = desireByImg; } /*** * 设置高度 */ specMode = MeasureSpec.getMode(heightMeasureSpec); specSize = MeasureSpec.getSize(heightMeasureSpec); if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate { mHeight = specSize; } else { int desire = getPaddingTop() + getPaddingBottom() + 80; if (specMode == MeasureSpec.AT_MOST)// wrap_content { mHeight = Math.min(desire, specSize); } else { mHeight = desire; } } setMeasuredDimension((int) mWidth, (int) mHeight); } private int postIndex; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int contentWidth = getWidth() - getPaddingLeft() - getPaddingRight(); int contentHeight = getHeight() - getPaddingTop() - getPaddingBottom(); Bitmap srcBitmap = Bitmap.createBitmap(getWidth(),getHeight(), Bitmap.Config.ARGB_8888); Canvas srcCanvas = new Canvas(srcBitmap); srcCanvas.drawText(mText, 0, getPaddingTop(), mPaint); mPaint.setXfermode(xformode); mPaint.setColor(Color.RED); RectF rectF = new RectF(0,0,postIndex,mTextHeight); srcCanvas.drawRect(rectF, mPaint); canvas.drawBitmap(srcBitmap,getPaddingLeft(),getPaddingTop(), null); initViewAndDatas(); if(postIndex<mTextWidth) { postIndex+=10; postInvalidateDelayed(30); } }}
注意:
文本绘制时必须和当前View保持同样的长宽尺寸,否则会出现文字变形问题
文本绘制的drawText(string,int x,int y,Paint paint);中的y值是基线位置
mTextHeight = fontMetrics.bottom-fontMetrics.descent-fontMetrics.ascent;//获得文本的高度
注意内容去的尺寸大小以及图片合成模式
注意LinearGradient的最后一个参数
自己去试试吧,我这些代码不够完善。
来自: http://my.oschina.net/ososchina/blog/603274
0 0
- Android 自定义TextView实现文字渐变动画
- Android 自定义TextView实现文字渐变动画
- Android进阶——自定义View之扩展系统控件的另一种思路实现渐变文字动画的TextView
- 自定义TextView 实现文字渐变效果
- Android Textview实现文字颜色渐变效果
- android自定义TextView实现安卓手机开机android文字Log的动画效果
- 自定义TextView实现渐变色边框,渐变色文字并绘制drawable
- android TextView 实现自定义文字点击效果
- CSS3 实现文字流光渐变动画
- 【Android UI】自定义TextView实现动态的文字闪动效果
- Android自定义TextView实现文字图片居中显示
- 自定义listVIew 实现条目文字渐变效果
- Android-实现背景渐变动画
- Android自定义控件View(实现控件的动画效果,自定义类画简略时钟,TextView中文字逐一显示,动态设置progress的圆环/扇形ProgressBar等)
- android--textview实现文字自适应
- Android自定义view渐变圆形动画
- 自定义textview控件实现文字滚动效果
- 自定义TextView实现文字伞动效果
- matplotlib画图坐标轴设置
- 如何才能让你的房子成为Airbnb杭州Top20?
- Java计算器实现(逆波兰式)
- linux 使用usb转串口模块并读串口数据
- CAS实现SSO单点登录原理
- Android 自定义TextView实现文字渐变动画
- 多态与虚函数
- 搭建WebRtc环境
- EditText限制输入
- Linux中如何查看显卡硬件信息
- [LeetCode]476. Number Complement
- RxSwift(3.4.1)- Connectable Observable
- LNMP平台的部署
- JQuery如何实现定时刷新?