热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

androidShader渲染

引用:http:www.apkbus.comforum.php?modviewthread&tid1727Android中提供了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 这里就不深入讨论了,以后用到再说吧。 

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. }

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

2011-5-5 10:14 上传
点击文件名下载附件 
下载积分: 下载豆 -1

转:https://www.cnblogs.com/sode/archive/2012/08/24/2655441.html



推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
author-avatar
ha遗忘的密
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有