Paint API de Android - Shader (representación de imágenes)

1. Método de construcción detallado


1) BitmapShader (representación de imágenes)

BitmapShader (mapa de bits de mapa de bits, Shader.TileMode tileX, Shader.TileMode tileY)

Use un mapa de bits como textura para llenar un área determinada, y los parámetros son los siguientes:

  • mapa de bits : el mapa de bits utilizado como relleno;
  • tileX : la forma de conexión del mapa de bits en la dirección del eje X;
  • tileY : la forma de conexión del mapa de bits en la dirección del eje Y;

Y este Shader.TileMode tiene tres tipos:

  • CLAMP significa que si el renderizador excede el rango del límite original, el color del borde se copiará para colorear el área fuera del rango
  • REPETIR es renderizado repetido en forma de mosaico
  • MIRROR consiste en representar repetidamente el mapa de bits de manera reflejada tanto horizontal como verticalmente.

2) ComposeShader (representación mixta)

ComposeShader (Shader shaderA, Shader shaderB, modo PorterDuff.Mode)

La superposición de efectos de renderizado, ¿sabes lo que ves cuando ves PorterDuff? Por ejemplo, el efecto de renderizado mixto de BitmapShader y LinearGradient. Los parámetros están en orden:

  • shaderA : el primer efecto de renderizado
  • shaderB : el segundo efecto de renderizado
  • mode : modo de superposición de los dos efectos de renderizado

3) LinearGradient (representación lineal)

LinearGradient(float x0, float y0, float x1, float y1, int[] colores, float[] posiciones, Shader.TileMode mosaico);

Realice el efecto de degradado lineal del color en un área determinada, los parámetros son los siguientes:

  • x0 : La coordenada x del punto inicial del gradiente
  • y0 : La coordenada y del punto inicial del gradiente
  • x1 : la coordenada x del punto final del gradiente
  • y1 : la coordenada y del punto final del gradiente
  • colors : una matriz de colores para el degradado
  • posiciones : la posición relativa de la matriz de colores
  • mosaico : método de mosaico

4) RadialGradient (representación circular)

RadialGradient público (x flotante, y flotante, radio flotante, colores int[], posiciones flotantes[], mosaico Shader.TileMode);

Para lograr el efecto de gradiente circular del color en un área determinada, los parámetros son los siguientes:

  • x : la coordenada x del centro del círculo
  • y : la coordenada y del centro del anillo
  • radio : el radio del anillo
  • colors : una matriz de colores para el degradado circular
  • posiciones : especifique la posición relativa de la matriz de colores
  • mosaico : método de mosaico

5) SweepGradient (representación de degradado)

SweepGradient público (float cx, float cy, int[] colores, float[] posiciones)

¡El renderizado de escaneo es el efecto de rotar un círculo alrededor de un punto determinado! Los parámetros son, en orden:

  • cx : la coordenada x del centro del escaneo
  • cy : el centro de la coordenada y del escaneo
  • colors : una matriz de colores para el degradado degradado
  • posiciones : especifique la posición relativa de la matriz de colores

Tal vez del texto, podemos simplemente conocer sus funciones generales correspondientes, pero aún escribimos un código para verificar sus funciones. Después de todo, hay códigos (imágenes) y verdad ~


2. Utilice el ejemplo de código:

Diagrama de efecto de carrera :

Código de implementación :

BitmapShaderView.java :

/** 
 * Creado por Jay el 2015/11/4 0030. 
 */ 
clase pública BitmapShaderView extends View { 


    mapa de bits privado mBitmap = nulo; 
    ShapeDrawable privado sDrawable = nulo; 
    pintura privada mPaint = nulo; 
    int privado bitW = 0, bitH = 0 ; //Ancho y alto de mapa de bits 

    private Shader mBitmapShader = null; //Representación de mapa de bits private Shader 
    mLinearGradient = null; //Representación de gradiente lineal 
    private Shader mComposeShader = null; //Representación mixta 
    private Shader mRadialGradient = null; //Representación de gradiente circular 
    private Shader mSweepGradient = null; //gradient rendering 


    public BitmapShaderView(Context context) { 
        this(context, null); 
    }

    BitmapShaderView público (contexto contexto, AttributeSet attrs) { 
        super (contexto, attrs); 
        en eso(); 
    } 

    public BitmapShaderView(Context context, AttributeSet attrs, int defStyleAttr) { 
        super(context, attrs, defStyleAttr); 
    } 


    private void init() { 

        mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.img_cat); 
        bitW = mBitmap.getWidth(); 
        bitH = mBitmap.getHeight(); 
        mPaint = nueva pintura (); 

        //创建BitmapShader 
        mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR); 
 
        //Crea un LinearGradient y establece la matriz de colores del degradado
        mLinearGradient = new LinearGradient(0, 0, 100, 100,
                new int[]{Color.RED, Color.GREEN, Color.BLUE, Color.WHITE}, 
                null, Shader.TileMode.REPEAT); 

        //Renderizado mixto, aquí usa BitmapShader y LinearGradient para mezclar, puede probar otros~ 
        mComposeShader = new ComposeShader(mBitmapShader, mLinearGradient, PorterDuff.Mode.DARKEN); 

        //Representación de gradiente circular 
        mRadialGradient = new RadialGradient(50, 200, 50, 
                new int[]{Color.GREEN, Color.RED, Color.BLUE, Color . WHITE}, 
                null, Shader.TileMode.REPEAT); 

        // Representación de degradado 
        mSweepGradient = new SweepGradient(30, 30, new int[]{Color.GREEN, Color.RED, 
                Color.BLUE, Color.WHITE}, null); 
    @Anular

    } 

    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 

        //Recorta la imagen en una elipse 
        sDrawable = new ShapeDrawable(new OvalShape()); 
        sDrawable.getPaint().setShader(mBitmapShader); 
        sDrawable.setBounds( 0, 0, bitW, bitH); 
        sDrawable.draw(canvas); 

        //Dibuja un rectángulo con degradado lineal 
        mPaint.setShader(mLinearGradient); 
        canvas.drawRect(bitW, 0, bitW * 2, bitH, mPaint); 

        // Dibujar efecto de renderizado mixto 
        mPaint.setShader(mComposeShader); 
        canvas.drawRect(0, bitH, bitW , bitH * 2, mPaint); 

        //Dibujar un degradado circular 
        mPaint.setShader(mRadialGradient);
        canvas.drawCircle(bitW * 2.8f, bitH/2, bitH/2, mPaint); 
 
        // dibujar el degradado degradado
        mPaint.setShader(mSweepGradient); 
        canvas.drawRect(bitW, bitH, bitW * 2, bitH * 2, mPaint); 


    } 

Supongo que te gusta

Origin blog.csdn.net/leyang0910/article/details/131775435
Recomendado
Clasificación