zoukankan      html  css  js  c++  java
  • android Shader 渲染

    引用:http://www.apkbus.com/forum.php?mod=viewthread&tid=1727

     Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用。 
        Shader类的使用,都需要先构建Shader对象,然后通过Paint的setShader方法设置渲染对象,然后设置渲染对象,然后再绘制时使用这个Paint对象即可。当然,用不同的渲染时需要构建不同的对象。  下面是一个简单的示例,其实用起来比较简单了 只是方法参数比较多。但是还比较容易理解。大家可以去翻翻API 这里就不深入讨论了,以后用到再说吧。 

    <ignore_js_op>1.jpg 

    Activity01 
    Java代码

    1. package com.yarin.android.Examples_05_11;
    2. import android.app.Activity;
    3. import android.os.Bundle;
    4. import android.view.KeyEvent;
    5. public class Activity01 extends Activity {
    6.         private GameView mGameView = null;
    7.         @Override
    8.         public void onCreate(Bundle savedInstanceState) {
    9.                 super.onCreate(savedInstanceState);
    10.                 mGameView = new GameView(this);
    11.                 setContentView(mGameView);
    12.         }
    13.         public boolean onKeyUp(int keyCode, KeyEvent event) {
    14.                 super.onKeyUp(keyCode, event);
    15.                 return true;
    16.         }
    17.         public boolean onKeyDown(int keyCode, KeyEvent event) {
    18.                 if (mGameView == null) {
    19.                         return false;
    20.                 }
    21.                 if (keyCode == KeyEvent.KEYCODE_BACK) {
    22.                         this.finish();
    23.                         return true;
    24.                 }
    25.                 return mGameView.onKeyDown(keyCode, event);
    26.         }
    27. }
    复制代码


    GameView 
    Java代码

    1. package com.yarin.android.Examples_05_11;
    2. import android.content.Context;
    3. import android.graphics.Bitmap;
    4. import android.graphics.BitmapShader;
    5. import android.graphics.Canvas;
    6. import android.graphics.Color;
    7. import android.graphics.ComposeShader;
    8. import android.graphics.LinearGradient;
    9. import android.graphics.Paint;
    10. import android.graphics.PorterDuff;
    11. import android.graphics.RadialGradient;
    12. import android.graphics.Shader;
    13. import android.graphics.SweepGradient;
    14. import android.graphics.drawable.BitmapDrawable;
    15. import android.graphics.drawable.ShapeDrawable;
    16. import android.graphics.drawable.shapes.OvalShape;
    17. import android.view.KeyEvent;
    18. import android.view.MotionEvent;
    19. import android.view.View;
    20. public class GameView extends View implements Runnable
    21. {
    22.         /* 声明Bitmap对象 */
    23.         Bitmap        mBitQQ        = null;
    24.         int                BitQQwidth        = 0;
    25.         int                BitQQheight        = 0;
    26.         
    27.         Paint   mPaint = null;
    28.              
    29.         /* Bitmap渲染 */
    30.         Shader mBitmapShader = null;
    31.         
    32.         /* 线性渐变渲染 */
    33.         Shader mLinearGradient = null;
    34.         
    35.         /* 混合渲染 */
    36.         Shader mComposeShader = null;
    37.            
    38.         /* 唤醒渐变渲染 */
    39.         Shader mRadialGradient = null;
    40.         
    41.         /* 梯度渲染 */
    42.         Shader mSweepGradient = null;
    43.           
    44.         
    45.         ShapeDrawable mShapeDrawableQQ = null;
    46.           
    47.         public GameView(Context context)
    48.         {
    49.                 super(context);
    50.                 
    51.                 /* 装载资源 */
    52.                 mBitQQ = ((BitmapDrawable) getResources().getDrawable(R.drawable.qq)).getBitmap();
    53.                 /* 得到图片的宽度和高度 */
    54.                 BitQQwidth = mBitQQ.getWidth();
    55.                 BitQQheight = mBitQQ.getHeight();
    56.                 
    57.                 /* 创建BitmapShader对象 */
    58.                 mBitmapShader = new BitmapShader(mBitQQ,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);
    59.                 
    60.                 /* 创建LinearGradient并设置渐变的颜色数组 说明一下这几天参数 
    61.                  * 第一个 起始的x坐标
    62.                  * 第二个 起始的y坐标
    63.                  * 第三个 结束的x坐标
    64.                  * 第四个 结束的y坐标
    65.                  * 第五个 颜色数组
    66.                  * 第六个 这个也是一个数组用来指定颜色数组的相对位置 如果为null 就沿坡度线均匀分布
    67.                  * 第七个 渲染模式
    68.                  * */
    69.                 mLinearGradient = new LinearGradient(0,0,100,100,
    70.                                                                                          new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.WHITE},
    71.                                                                                          null,Shader.TileMode.REPEAT);
    72.                 /* 这里理解为混合渲染*/
    73.                 mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
    74.                        
    75.                 /* 构建RadialGradient对象,设置半径的属性 */
    76.                 //这里使用了BitmapShader和LinearGradient进行混合
    77.                 //当然也可以使用其他的组合
    78.                 //混合渲染的模式很多,可以根据自己需要来选择
    79.                 mRadialGradient = new RadialGradient(50,200,50,
    80.                                                                                          new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},
    81.                                                                                          null,Shader.TileMode.REPEAT);
    82.                 /* 构建SweepGradient对象 */
    83.                 mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
    84.                 mPaint = new Paint();
    85.                 
    86.                 /* 开启线程 */
    87.                 new Thread(this).start();
    88.         }
    89.         
    90.         public void onDraw(Canvas canvas)
    91.         {
    92.                 super.onDraw(canvas);
    93.                 
    94.                 //将图片裁剪为椭圆形
    95.                 /* 构建ShapeDrawable对象并定义形状为椭圆 */
    96.                 mShapeDrawableQQ = new ShapeDrawable(new OvalShape());
    97.                 /* 设置要绘制的椭圆形的东西为ShapeDrawable图片 */
    98.                 mShapeDrawableQQ.getPaint().setShader(mBitmapShader);
    99.                 
    100.                 /* 设置显示区域 */
    101.                 mShapeDrawableQQ.setBounds(0,0, BitQQwidth, BitQQheight);
    102.                 
    103.                 /* 绘制ShapeDrawableQQ */
    104.                 mShapeDrawableQQ.draw(canvas);                 
    105.                 
    106.                 //绘制渐变的矩形
    107.                 mPaint.setShader(mLinearGradient);
    108.                 canvas.drawRect(BitQQwidth, 0, 320, 156, mPaint);
    109.                 
    110.                 //显示混合渲染效果
    111.                 mPaint.setShader(mComposeShader);
    112.                 canvas.drawRect(0, 300, BitQQwidth, 300+BitQQheight, mPaint);
    113.                 
    114.                 //绘制环形渐变
    115.                 mPaint.setShader(mRadialGradient);
    116.                 canvas.drawCircle(50, 200, 50, mPaint);
    117.                 
    118.                 //绘制梯度渐变
    119.                 mPaint.setShader(mSweepGradient);
    120.                 canvas.drawRect(150, 160, 300, 300, mPaint);
    121.                 
    122.         }
    123.         
    124.         // 触笔事件
    125.         public boolean onTouchEvent(MotionEvent event)
    126.         {
    127.                 return true;
    128.         }
    129.         // 按键按下事件
    130.         public boolean onKeyDown(int keyCode, KeyEvent event)
    131.         {
    132.                 return true;
    133.         }
    134.         // 按键弹起事件
    135.         public boolean onKeyUp(int keyCode, KeyEvent event)
    136.         {
    137.                 return false;
    138.         }
    139.         public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
    140.         {
    141.                 return true;
    142.         }
    143.         
    144.         
    145.         /**
    146.          * 线程处理
    147.          */
    148.         public void run()
    149.         {
    150.                 while (!Thread.currentThread().isInterrupted())
    151.                 {
    152.                         try
    153.                         {
    154.                                 Thread.sleep(100);
    155.                         }
    156.                         catch (InterruptedException e)
    157.                         {
    158.                                 Thread.currentThread().interrupt();
    159.                         }
    160.                         //使用postInvalidate可以直接在线程中更新界面
    161.                         postInvalidate();
    162.                 }
    163.         }
    164. }
    复制代码

    <ignore_js_op> Examples_05_11.rar (121.93 KB, 下载次数: 49) 

    2011-5-5 10:14 上传
    点击文件名下载附件 
    下载积分: 下载豆 -1
     
  • 相关阅读:
    字符集转换
    基础语法
    python print格式化输出。
    错误:SyntaxError: Missing parentheses in call to 'print'
    delphi 线程教学第一节:初识多线程
    delphi 7 信息对话框的按钮屏蔽键盘操作,只允许鼠标点击
    delphi 7 下安装 indy 10.5.8 教程
    delphi 实现vip126发邮件
    delphi 基础书籍推荐
    delphi 编码速度提升技能
  • 原文地址:https://www.cnblogs.com/sode/p/2655441.html
Copyright © 2011-2022 走看看