_渲染图像示例


阴影制作:包括各种形状(矩形,圆形等等),以及文字等等都能设置阴影。

阴影制作是什么原理呢?

其实很简单,你需要设置阴影的东西被看作一个主层。然后在主层下面画一个阴影层。

阴影制作涉及到一个重要函数:

public   void   setShadowLayer (float radius, float dx, float dy, int color)
radius:阴影半径
dx:X轴方向的偏移量
dy:Y轴方向的偏移量
color:阴影颜色

注意:如果半径被设置为0,意思就是去掉阴影。

具体实现:


  1. package xiaosi.textShadow; 
  2.  
  3. import android.app.Activity; 
  4. import android.content.Context; 
  5. import android.graphics.Bitmap; 
  6. import android.graphics.BitmapFactory; 
  7. import android.graphics.Canvas; 
  8. import android.graphics.Color; 
  9. import android.graphics.Paint; 
  10. import android.os.Bundle; 
  11. import android.view.View; 
  12.  
  13. public class TextShadowActivity extends Activity 
  14.     @Override 
  15.     public void onCreate(Bundle savedInstanceState) 
  16.     { 
  17.         super.onCreate(savedInstanceState); 
  18.         setContentView(new drawCanvas(this)); 
  19.     } 
  20.  
  21.     class drawCanvas extends View 
  22.     { 
  23.         private Bitmap  bitmap = null
  24.         public drawCanvas(Context context) 
  25.         { 
  26.             super(context); 
  27.             bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.i_skinprocess); 
  28.         } 
  29.  
  30.         @Override 
  31.         protected void onDraw(Canvas canvas) 
  32.         { 
  33.             super.onDraw(canvas); 
  34.             // 建立Paint 物件 
  35.             Paint paint1 = new Paint(); 
  36.             // 设定颜色 
  37.             paint1.setColor(0xFFFFFF00); 
  38.             // 设定阴影(柔边, X 轴位移, Y 轴位移, 阴影颜色) 
  39.             paint1.setShadowLayer(5, 3, 3, 0xFFFF00FF); 
  40.             // 实心矩形& 其阴影 
  41.             canvas.drawText("我很爱你", 20,40,paint1); 
  42.             Paint paint2 = new Paint(); 
  43.             paint2.setColor(Color.GREEN); 
  44.             paint2.setShadowLayer(10, 5, 2, Color.YELLOW); 
  45.             canvas.drawText("你真傻", 20,60,paint2); 
  46.              
  47.             Paint paint3 = new Paint(); 
  48.             paint3.setColor(Color.RED); 
  49.             paint3.setShadowLayer(30, 5, 2, Color.GREEN); 
  50.             canvas.drawCircle(50, 130,30, paint3); 
  51.              
  52.             Paint paint4 = new Paint(); 
  53.             paint4.setShadowLayer(5, 8, 7, Color.DKGRAY); 
  54.             canvas.drawBitmap(bitmap, 50, 200, paint4); 
  55.         } 
  56.     } 

 

 

 

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



Activity01

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

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

public class Activity01 extends Activity {
	private GameView mGameView = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		mGameView = new GameView(this);

		setContentView(mGameView);
	}

	public boolean onKeyUp(int keyCode, KeyEvent event) {
		super.onKeyUp(keyCode, event);
		return true;
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (mGameView == null) {
			return false;
		}
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			this.finish();
			return true;
		}
		return mGameView.onKeyDown(keyCode, event);
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值