public class Canvas {
//用指定的矩阵【连接】当前矩阵。如果指定的矩阵为空,则此方法不执行任何操作。
//concat:合并数组,合并多个字符串
public void concat(@Nullable Matrix matrix) {
if (matrix != null) native_concat(mNativeCanvasWrapper, matrix.native_instance);
}
//用指定的矩阵完全【替换】当前矩阵。如果矩阵参数为空,则当前矩阵重置为标识。
public void setMatrix(@Nullable Matrix matrix) {
native_setMatrix(mNativeCanvasWrapper,
matrix == null ? 0 : matrix.native_instance);
}
//在CTM中,返回当前转换矩阵。这不会改变画布中的矩阵,但只返回其副本。
@Deprecated
public void getMatrix(@NonNull Matrix ctm) {
native_getCTM(mNativeCanvasWrapper, ctm.native_instance);
}
//返回一个新矩阵:画布当前转换矩阵的副本。
@Deprecated
public final @NonNull Matrix getMatrix() {
Matrix m = new Matrix();
//noinspection deprecation
getMatrix(m);
return m;
}
}
Paint与Shader(shader修饰paint)
public class Paint {
//获取绘制的着色对象
public Shader getShader() {
return mShader;
}
//设置或清除着色对象
public Shader setShader(Shader shader) {
// If mShader changes, cached value of native shader aren't valid, since
// old shader's pointer may be reused by another shader allocation later
if (mShader != shader) {
mNativeShader = -1;
}
// Defer setting the shader natively until getNativeInstance() is called
mShader = shader;
return shader;
}
}
Shader与Matrix(matrix操作shader)
public class Shader {
private Matrix mLocalMatrix;
//如果shader具有非标识局部矩阵,则返回true
public boolean getLocalMatrix(Matrix localM) {
if (mLocalMatrix != null) {
localM.set(mLocalMatrix);
return !mLocalMatrix.isIdentity();
}
return false;
}
//设置shader的局部矩阵。传递空值会将shader的矩阵重置为标识
public void setLocalMatrix(Matrix localM) {
mLocalMatrix = localM;
native_instance = nativeSetLocalMatrix(native_instance,
localM == null ? 0 : localM.native_instance);
}
}
示例:
public class FlickTextView extends TextView {
private int mViewWidth;
private Paint mPaint;
/**
* 颜色渐变
*/
private LinearGradient mLinearGradient;
private Matrix mGradientMatrix;
private float mTranslate;
public FlickTextView(Context context) {
super(context, null);
}
public FlickTextView(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();
mLinearGradient = new LinearGradient(0, 0, mViewWidth, 0,
new int[]{Color.parseColor("#000000"),Color.parseColor("#ff7612"), Color.parseColor("#000000")},
null,
Shader.TileMode.CLAMP
);
mPaint.setShader(mLinearGradient);
mGradientMatrix = new Matrix();
}
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mGradientMatrix != null) {
mTranslate += mViewWidth / 5;
//当该控件渲染器的颜色变化正好移除屏幕时,从左侧进入
if (mTranslate > 2 * mViewWidth) {
mTranslate = -mViewWidth;
}
mGradientMatrix.setTranslate(mTranslate, 0);
mLinearGradient.setLocalMatrix(mGradientMatrix);
//100ms 后继续刷新试图,即调用onDraw()方法。
postInvalidateDelayed(50);
}
}
}