matrix与canvas、shader

本文深入探讨了Android中Canvas、Paint与Shader类的功能及使用方法,包括如何通过Matrix进行画布和着色器的变换,以及如何创建颜色渐变效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Canvas与Matrix(matrix操作画布)

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值