zoukankan      html  css  js  c++  java
  • 渲染

    知识点

    BitmapShader:位图的渲染

    LinearGradient:线性渲染

    ComposeShader:混合渲染

    RadialGradient: 环形渲染

    SweepGradient:梯形渲染

     

    1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上。

    2.PorterDuff.Mode.SRC 显示上层绘制图片 3

    .PorterDuff.Mode.DST 显示下层绘制图片

    4.PorterDuff.Mode.SRC_OVER 正常绘制显示,上下层绘制叠盖。

    5.PorterDuff.Mode.DST_OVER 上下层都显示。下层居上显示。

    6.PorterDuff.Mode.SRC_IN 取两层绘制交集。显示上层。 7.PorterDuff.Mode.DST_IN 取两层绘制交集。显示下层。 8.PorterDuff.Mode.SRC_OUT 取上层绘制非交集部分。 9.PorterDuff.Mode.DST_OUT 取下层绘制非交集部分。 10.PorterDuff.Mode.SRC_ATOP 取下层非交集部分与上层交集部分 11.PorterDuff.Mode.DST_ATOP 取上层非交集部分与下层交集部分 12.PorterDuff.Mode.XOR 取两层绘制非交集。两层绘制非交集。 13.PorterDuff.Mode.DARKEN 上下层都显示。变暗 14.PorterDuff.Mode.LIGHTEN 上下层都显示。变量

    15.PorterDuff.Mode.MULTIPLY 取两层绘制交集 16.PorterDuff.Mode.SCREEN 上下层都显示。

     

     

    代码示例

    packdage com.example.examples_05_11;

     

    import android.content.Context;

    import android.graphics.Bitmap;

    import android.graphics.BitmapShader;

    import android.graphics.Canvas;

    import android.graphics.Color;

    import android.graphics.ComposeShader;

    import android.graphics.LinearGradient;

    import android.graphics.Paint;

    import android.graphics.PorterDuff;

    import android.graphics.RadialGradient;

    import android.graphics.Shader;

    import android.graphics.Shader.TileMode;

    import android.graphics.SweepGradient;

    import android.graphics.drawable.BitmapDrawable;

    import android.graphics.drawable.ShapeDrawable;

    import android.graphics.drawable.shapes.OvalShape;

    import android.view.View;

     

     

    public class GameView extends View implements Runnable {

     

    //声明位图对象

    Bitmap bitQQ;

    int bitQQWidth;

    int bitQQHeight;

    Paint mPaint;

     

    //声明一个渲染Shader

    Shader mbitmapShader=null;

    //声明一个线性渲染

    Shader mLinearGradient=null;

    //声明一个混合渲染

    Shader mComposeShader=null;

    //唤醒渐变渲染

    Shader mRadialGradient=null;

    //梯度渲染

    Shader mSweepGradient=null;

     

    //绘制基本图形

    ShapeDrawable mShapeDrawable=null;

     

    public GameView(Context context) {

    super(context);

    // TODO Auto-generated constructor stub

    //转载资源

    bitQQ=((BitmapDrawable)getResources().getDrawable(R.drawable.qq)).getBitmap();

    //得到图片的宽度和高度

    bitQQHeight=bitQQ.getHeight();

    bitQQWidth=bitQQ.getWidth();

     

    //创建bitmapShader对象

    /*

     * tileX  在位图上X方向花砖模式

     * tileY  在位图上y方向花砖模式

     * TileMode:(一共有三种)

     

    CLAMP  :如果渲染器超出原始边界范围,会复制范围内边缘染色。

     

    REPEAT :横向和纵向的重复渲染器图片,平铺。

     

    MIRROR :横向和纵向的重复渲染器图片,这个和REPEAT 重复方式不一样,他是以镜像方式平铺。

     

     * */

    mbitmapShader=new BitmapShader(bitQQ, TileMode.REPEAT, TileMode.MIRROR);

    /*创建linearGradient并设置渐变颜色数组*/

    /**

     * float x0: 渐变起始点x坐标

     

    float y0:渐变起始点y坐标

     

     

    float x1:渐变结束点x坐标

     

     

    float y1:渐变结束点y坐标

     

     

    int[] colors:颜色 的int 数组

     

     

    float[] positions: 相对位置的颜色数组,可为null,  若为null,可为null,颜色沿渐变线均匀分布

     

     

    Shader.TileMode tile: 渲染器平铺模式

     

     * */

    mLinearGradient=new LinearGradient(0, 0, 100, 100, 

    new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE}, null, TileMode.REPEAT);

     

    //这里笔者理解为混合渲染,其中PorterDuff.Mode.DARKEN模型是变暗

    mComposeShader=new ComposeShader(mbitmapShadermLinearGradient, PorterDuff.Mode.DARKEN);

     

    /*构建mRadialGradient对象,并设置半径的属性*/

    //new RadialGradient(x, y, radius, colors, positions, tile),圆心(参数1x坐标,参数2:y坐标),参数3:变径,参数6:模型

    mRadialGradient =new RadialGradient(50, 200, 50, 

    new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null, TileMode.REPEAT);

    /*构建mSweepGradient对象,梯度渲染*/

    mSweepGradient =new SweepGradient(30, 30, new int[]{Color.GREEN,Color.RED

    ,Color.BLUE,Color.WHITE}, null);

    mPaint=new Paint();

     

    new Thread(this).start();

     

    }

     

    public void run() {

    // TODO Auto-generated method stub

    while (!Thread.currentThread().isInterrupted()) {

    try {

    Thread.sleep(100);

    catch (Exception e) {

    // TODO: handle exception

    Thread.currentThread().interrupt();

    }

    postInvalidate();

    }

    }

     

    public void onDraw(Canvas canvas) {

    super.onDraw(canvas);

     

    //将图片裁剪为椭圆形

    mShapeDrawable=new ShapeDrawable(new OvalShape());

    //设置要绘制椭圆形为ShapeDrawable的图片

    mShapeDrawable.getPaint().setShader(mbitmapShader);

    //设置显示区域

    mShapeDrawable.setBounds(0, 0, bitQQWidthbitQQHeight);

    //绘制ShapeDrawable

    mShapeDrawable.draw(canvas);

     

    //绘制渐变矩形

    mPaint.setShader(mLinearGradient);

    canvas.drawRect(bitQQWidth,0, 320,  156, mPaint);

     

    //显示混合渲染效果

    mPaint.setShader(mComposeShader);

    canvas.drawRect(0, 300, bitQQWidth, 300+bitQQHeightmPaint);

     

    //绘制环形渐变效果

    mPaint.setShader(mRadialGradient);

    canvas.drawCircle(50, 200, 50, mPaint);

     

    //绘制梯度渐变效果

    mPaint.setShader(mSweepGradient);

    canvas.drawRect(150, 160, 300, 300, mPaint);

    }

     

    }

     

    package com.example.examples_05_11;

     

    import android.os.Bundle;

    import android.app.Activity;

    import android.view.Menu;

     

    public class MainActivity extends Activity {

     

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(new GameView(this));

        }

     

  • 相关阅读:
    用Java开发第一个APP
    去除字符串空格并竖向排列
    并发容器 concurrentHashMap--1.7 更改
    java并发容器CopyOnWriteArrayList 使用场景和内部实现分析
    java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
    并发容器之CopyOnWriteArrayList分析
    单例模式
    [Android]知识总结一:Activity
    阿里巴巴fastjson的使用问题
    java跨域请求的方式
  • 原文地址:https://www.cnblogs.com/danmao/p/3808696.html
Copyright © 2011-2022 走看看