PathPaintCanvasShaderTest

<IMG alt="" src="http://hi.csdn.net/attachment/201112/22/0_1324524713LjvH.gif"><IMG alt="" src="http://hi.csdn.net/attachment/201112/22/0_13245249264F3Z.gif">
package hyz.com.pathpaintcanvasshader;
import android.app.Activity;
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.Path;
import android.graphics.PorterDuff;
import android.graphics.RadialGradient;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;

public class PathPaintCanvasShaderTestActivity extends Activity
{  
	private Paint paint ;
	@Override   
	public void onCreate(Bundle savedInstanceState)
	{ 
		super.onCreate(savedInstanceState);
		/*設置ContentView爲自定義的MyVieW*/  
		MyView myView=new MyView(this);
		setContentView(myView);
	}         
    /* 自定義繼承View 的MyView*/   
    private class MyView extends View
    {
    	public MyView(Context context)
    	{ 
    		super(context) ;  
        }
    	/*重寫onDraw()*/ 
    	@Override   
    	protected void onDraw(Canvas canvas)   
    	{ 
    		super.onDraw(canvas);
    		paint = new Paint();
    		
    		/*設置背景爲白色*/   
            canvas.drawColor(Color.WHITE);
            /*去鋸齒*/
            paint.setAntiAlias(false);
            /*設置paint的顏色*/   
            paint.setColor(Color.RED);    
            /*設置paint的 style 爲STROKE:空心*/   
            paint.setStyle(Paint.Style.STROKE);    
            /*設置paint的外框寬度*/   
            paint.setStrokeWidth(3);             
            /*寫字*/   
            paint.setTextSize(12); 
            //設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰
            paint.setDither(true); 
            /*
             * paint.setFilterBitmap(boolean filter);              
             * 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示
             * 速度,本設置項依賴於dither和xfermode的設置  
             */
 
           
            /*畫一個空心圓形,前3個參數分別表示:圓心距離屏幕最左邊的距離、圓心距離屏幕最上邊的距離、半徑*/   
            canvas.drawCircle(40, 40, 30, paint);    
            /*畫一個空心正方形,前4個參數分別表示:正方形左邊離屏幕最左邊的距離、正方形上邊離屏幕最上邊的距離、
             *正方形右邊離屏幕最左邊的距離、正方形下邊離屏幕最上邊的距離,以下長方形、橢圓同理 。
	  *4個參數還可以理解爲正方形左上角橫座標、左上角縱座標、右下角橫座標、右下角縱座標。
	  *不過要注意,當你設置了邊寬paint.setStrokeWidth(n);後,4參數則分別表示各邊中間線條與屏幕的距離
             */   
            canvas.drawRect(10, 90, 70, 150, paint);    
            /*畫一個空心長方形*/ 
            // 設置繪製的顏色,a代表透明度,r,g,b代表顏色值
            paint.setARGB(150, 150, 100, 50);           
            canvas.drawRect(0, 170, 70,200, paint);    
            /*畫一個空心橢圓形*/ 
            //設置繪製圖形的透明度,和上面setARGB()中的第一個值同一意思
            paint.setAlpha(50);
            canvas.drawOval(new RectF(10,220,70,250), paint);    
            /*畫一個空心三角形*/   
            Path path=new Path();    
            path.moveTo(10, 330);//三角形左底點距離屏幕最左邊和最上邊的距離,也是起始畫點
            path.lineTo(70,330);//從左底點繪畫至右底點    
            path.lineTo(40,270);//從右底點繪畫至頂點  
            path.close();//自動從頂點繪畫至左底點    
            canvas.drawPath(path, paint);    
            /*畫一個空心梯形*/   
            Path path1=new Path();    
            path1.moveTo(10, 410);    
            path1.lineTo(70,410);    
            path1.lineTo(55,350);    
            path1.lineTo(25, 350);    
            path1.close();    
            canvas.drawPath(path1, paint);    
              
            paint.setAntiAlias(true);
            /*設置paint的顏色*/   
            paint.setColor(Color.BLUE);    
            /*設置paint 的style爲 FILL:實心*/   
            paint.setStyle(Paint.Style.FILL);            
            /*畫一個實心圓*/   
            canvas.drawCircle(120,40,30, paint);    
            /*畫一個實心正方形*/   
            canvas.drawRect(90, 90, 150, 150, paint);    
            /*畫一個實心長方形*/   
            canvas.drawRect(90, 170, 150,200, paint);    
            /*畫一個實心橢圓*/   
            RectF re2=new RectF(90,220,150,250);    
            canvas.drawOval(re2, paint);    
            /*畫一個實心三角形*/   
            Path path2=new Path();    
            path2.moveTo(90, 330);    
            path2.lineTo(150,330);    
            path2.lineTo(120,270);    
            path2.close();    
            canvas.drawPath(path2, paint);    
            /*畫一個實心梯形*/ 
 
            Path path3=new Path();    
            path3.moveTo(90, 410);    
            path3.lineTo(150,410);    
            path3.lineTo(135,350);    
            path3.lineTo(105, 350);    
            path3.close();    
            canvas.drawPath(path3, paint);                       
            
            /*Android中提供了Shader類專門用來渲染圖像以及一些幾何圖形,Shader下面包括幾個直接子類,
             *分別是BitmapShader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。
             *BitmapShader主要用來渲染圖像,LinearGradient 用來進行梯度渲染,RadialGradient 用來進行環形渲染,
             *SweepGradient 用來進行梯度渲染,ComposeShader則是一個 混合渲染,可以和其它幾個子類組合起來使用.
             */
            /*創建LinearGradient並設置漸變的顏色數組      	 
			 * 第一個 起始的x座標
			 * 第二個 起始的y座標
	         * 第三個 結束的x座標
	         * 第四個 結束的y座標
			 * 第五個 顏色數組
			 * 第六個 這個也是一個數組用來指定顏色數組的相對位置 如果爲null 就沿坡度線均勻分佈
			 * 第七個 渲染模式(3種)--
			 * REPEAT:沿着漸變方向循環重複 
			 * CLAMP:如果在預先定義的範圍外畫的話,就重複邊界的顏色 
			 * MIRROR:與REPEAT一樣都是循環重複,但這個會對稱重複 
			 */            
             Shader mLinearGradient =new LinearGradient(0,0,100,100,new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.YELLOW},null,Shader.TileMode.REPEAT);    
             // 梯度渲染,,就像圓狀百分比視圖 ,前兩參數爲中心點
             Shader mSweepGradient = new SweepGradient(30,30,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE},null);
             //環形渲染       ,前兩參數爲中心點
             Shader mRadialGradient = new RadialGradient(50,200,50,new int[]{Color.GREEN,Color.RED,Color.BLUE,Color.WHITE}, null,Shader.TileMode.REPEAT);
                         
         	 /* Bitmap渲染 */
             Bitmap	mBit= ((BitmapDrawable) getResources().getDrawable(R.drawable.zm)).getBitmap();
         	 Shader mBitmapShader = new BitmapShader(mBit,Shader.TileMode.REPEAT,Shader.TileMode.MIRROR);          
         	    		 
     		 /*混合渲染,這裏使用了BitmapShader和LinearGradient進行混合*/
         	 Shader mComposeShader = new ComposeShader(mBitmapShader,mLinearGradient,PorterDuff.Mode.DARKEN);
     		 
             paint.setShader(mLinearGradient);  
             canvas.drawText("線性漸變渲染", 240, 50, paint);
             /*畫一個漸變色圓*/
             canvas.drawCircle(200,40,30, paint); 
             
             paint.setShader(mSweepGradient); 
             canvas.drawText("梯度渲染", 240, 120, paint);
             /*畫一個漸變色正方形*/              
             canvas.drawRect(170, 90, 230, 150, paint);
             
             paint.setShader(mRadialGradient); 
             canvas.drawText("環形漸變", 240, 190, paint); 
             /*畫一個漸變色長方形*/   
             canvas.drawRect(170, 170, 230,200, paint);
             
             paint.setShader(mBitmapShader);
             canvas.drawText("Bitmap渲染", 240, 250, paint);              
             /*畫一個漸變色橢圓*/   
             RectF re3=new RectF(170,220,230,250);    
             canvas.drawOval(re3, paint);
             
             
             /*畫一個漸變色三角形*/   
             Path path4=new Path();    
             path4.moveTo(170,330);    
             path4.lineTo(230,330);    
             path4.lineTo(200,270);    
             path4.close(); 
//           canvas.drawText("三角形", 240, 320, paint); 
             canvas.drawPath(path4, paint);
             
             paint.setShader(mComposeShader);
             canvas.drawText("混合渲染", 240, 390, paint);
             /*畫一個漸變色梯形*/   
             Path path5=new Path();    
             path5.moveTo(170, 410);    
             path5.lineTo(230,410);    
             path5.lineTo(215,350);    
             path5.lineTo(185, 350);    
             path5.close();    
             canvas.drawPath(path5, paint);                 
            
         }  
    }
}  
    /*Paint類介紹  
     * Paint即畫筆,在繪圖過程中起到了極其重要的作用,畫筆主要保存了顏色,  
     * 樣式等繪製信息,指定了如何繪製文本和圖形,畫筆對象有很多設置方法,  
     * 大體上可以分爲兩類,一類與圖形繪製相關,一類與文本繪製相關。         
     * 1.圖形繪製  
     * setARGB(int a,int r,int g,int b);  
     * 設置繪製的顏色,a代表透明度,r,g,b代表顏色值。  
     * setAlpha(int a);  
     * 設置繪製圖形的透明度。  
     * setColor(int color);  
     * 設置繪製的顏色,使用顏色值來表示,該顏色值包括透明度和RGB顏色。  
     * setAntiAlias(boolean aa);  
     * 設置是否使用抗鋸齒功能,會消耗較大資源,繪製圖形速度會變慢。  
     * setDither(boolean dither);  
     * 設定是否使用圖像抖動處理,會使繪製出來的圖片顏色更加平滑和飽滿,圖像更加清晰  
     * setFilterBitmap(boolean filter);  
     * 如果該項設置爲true,則圖像在動畫進行中會濾掉對Bitmap圖像的優化操作,加快顯示  
     * 速度,本設置項依賴於dither和xfermode的設置  
     * setMaskFilter(MaskFilter maskfilter);  
     * 設置MaskFilter,可以用不同的MaskFilter實現濾鏡的效果,如濾化,立體等       *   
     * setColorFilter(ColorFilter colorfilter);  
     * 設置顏色過濾器,可以在繪製顏色時實現不用顏色的變換效果* 
     * setPathEffect(PathEffect effect);  
     * 設置繪製路徑的效果,如點畫線等  *   
     * setShader(Shader shader);  
     * 設置圖像效果,使用Shader可以繪製出各種漸變效果  
     * setShadowLayer(float radius ,float dx,float dy,int color);  
     * 在圖形下面設置陰影層,產生陰影效果,radius爲陰影的角度,dx和dy爲陰影在x軸和y軸上的距離,color爲陰影的顏色  
     * setStyle(Paint.Style style);  
     * 設置畫筆的樣式,爲FILL,FILL_OR_STROKE,或STROKE  
     * setStrokeCap(Paint.Cap cap);  
     * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的圖形樣式,如圓形樣式  
     * Cap.ROUND,或方形樣式Cap.SQUARE  
     * setSrokeJoin(Paint.Join join);  
     * 設置繪製時各圖形的結合方式,如平滑效果等  
     * setStrokeWidth(float width);  
     * 當畫筆樣式爲STROKE或FILL_OR_STROKE時,設置筆刷的粗細度  
     * setXfermode(Xfermode xfermode);  
     * 設置圖形重疊時的處理方式,如合併,取交集或並集,經常用來製作橡皮的擦除效果  
     * 2.文本繪製  
     * setFakeBoldText(boolean fakeBoldText);  
     * 模擬實現粗體文字,設置在小字體上效果會非常差  
     * setSubpixelText(boolean subpixelText);  
     * 設置該項爲true,將有助於文本在LCD屏幕上的顯示效果  
     * setTextAlign(Paint.Align align);  
     * 設置繪製文字的對齊方向  
     * setTextScaleX(float scaleX);  
     * 設置繪製文字x軸的縮放比例,可以實現文字的拉伸的效果  
     * setTextSize(float textSize);  
     * 設置繪製文字的字號大小  
     * setTextSkewX(float skewX);  
     * 設置斜體文字,skewX爲傾斜弧度  
     * setTypeface(Typeface typeface);  
     * 設置Typeface對象,即字體風格,包括粗體,斜體以及襯線體,非襯線體等  
     * setUnderlineText(boolean underlineText);  
     * 設置帶有下劃線的文字效果  
     * setStrikeThruText(boolean strikeThruText);  
     * 設置帶有刪除線的效果  
     */
/*Canvas類介紹
 *<STRONG><SPAN style="BACKGROUND-COLOR: #ffff66">Canvas</SPAN></STRONG>(): 創建一個空的畫布,可以使用setBitmap()方法來設置繪製具體的畫布。
       <STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>(Bitmap bitmap): 以bitmap對象創建一個畫布,則將內容都繪製在bitmap上,因此bitmap不得爲null。
       <STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>(GL gl): 在繪製3D效果時使用,與OpenGL相關。
       drawColor: 設置<STRONG style="COLOR: black; BACKGROUND-COLOR: #ffff66">Canvas</STRONG>的背景顏色。
       setBitmap:  設置具體畫布。
       clipRect: 設置顯示區域,即設置裁剪區。
       isOpaque:檢測是否支持透明。
       rotate:  旋轉畫布
       setViewport:  設置畫布中顯示窗口。
       skew:  設置偏移量。/
       save():旋轉畫布時會旋轉畫布上的所有對象,而我們只是需要旋轉其中的一個,這時就需要用到save 方法來鎖定需要操作的對象,在操作之後通過 restore 方法來解除鎖定

invalidate():方法表示重新繪製,重新調用onDraw(),比如在onTouch()下可以考慮用一下這個方法,如果在onDraw()下用了此方法,會不停的循環調用onDraw();

<PRE class=java name="code">    畫曲線:canvas.drawPath(path,pathPaint);
在onTouchEvent(),在剛按下時(MotionEvent.ACTION_DOWN)設置path.moveTo(event.getX(),event.getY());
在onTouchEvent(),在移動時(MotionEvent.ACTION_MOVE)設置path.quadTo(lastx,lasty,event.getX(),event.getY());
在onTouchEvent(),在鬆開時(MotionEvent.ACTION_UN)設置path.reset();</PRE><PRE class=java name="code">在onTouchEvent()中結尾設置lastx=event.getX(),lasty=event.getY();invalidate();
</PRE><BR>
<PRE></PRE>
<PRE class=java name="code"></PRE><PRE class=java name="code"></PRE>
<PRE></PRE>











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章