Androidはcanvasを利用して各種の図形(点、直線、弧、円、楕円、文字、矩形、多角形、曲線、円角矩形)を描く


転自:http://blog.csdn.net/rhljiayou/article/details/7212620
1、まずcanvasクラスについてお話しします.
Class Overview
The Canvas class holds the "draw"calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. Rect, Path, text, Bitmap), and a paint (to describe the colors and styles for the drawing). 
この類はキャンバスに相当し、中にたくさんのものを描くことができます.
このCanvasは、システムが私たちに提供するメモリ領域として理解することができます(しかし、実際には絵のAPIにすぎません.本当のメモリは次のBitmapです).また、このメモリ領域を操作する方法も提供されています.これらの操作はすべて絵図APIです.つまり、このような方法では、私たちが必要なものを描くためにGraphicを使ったり、何を描くかを表示するには、私たちが自分でコントロールすることができます.
 
この方式は環境によって2つに分けられる:1つは普通のViewのcanvasを使って図を描くことであり、もう1つは専門のSurface Viewのcanvasを使って図を描くことである.2つの主な違いは、Surface Viewで専用のスレッドを定義して図面作業を完了することであり、アプリケーションはViewのブラシを待つ必要がなく、パフォーマンスを向上させることです.前の処理量が小さく、フレームレートが小さいアニメーション、例えば将棋ゲームなどに適しています.そして、主にゲームや高品質のアニメーションに使われる絵です.
次に、Canvasクラスでよく使用される方法を示します.
 
drawRect(RectF rect,Paint paint)/描画領域、パラメータ1はRectF 1領域 
drawPath(Path path,Paint paint)/パスを描画します.パラメータはPathパスオブジェクトです.
drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) //マップ、パラメータの1つは私たちの従来のBitmapオブジェクトで、パラメータの2つはソース領域(ここではbitmap)、パラメータの3つはターゲット領域(canvasの位置と大きさであるべき)、パラメータの4つはPaintブラシオブジェクトで、スケールとストレッチの可能性があるため、元のRectがターゲットRectに等しくない場合、性能が大幅に損なわれます.
drawLine(float startX,float startY,float stopX,float stopY,Paintpaint)/線引き、パラメータ共始点のx軸位置、パラメータ二始点のy軸位置、パラメータ三終点のx軸水平位置、パラメータ四y軸垂直位置、最後のパラメータはPaintブラシオブジェクトです.
drawPoint(float x,float y,Paint paint)/画点、パラメータは水平x軸、パラメータは2垂直y軸、3番目のパラメータはPaintオブジェクトです.
drawText(String text, float x, floaty, Paint paint) //レンダリングテキスト、Canvasクラスは上のほかに文字を描くことができます.パラメータの1つはStringタイプのテキスト、パラメータの2 x軸、パラメータの3 y軸、パラメータの4はPaintオブジェクトです.
drawOval ( RectF  oval,  Paint  paint//楕円を描き、パラメータは1つはスキャン領域で、パラメータは2つはpaintオブジェクトです.
drawCircle (float cx, float cy, float radius, Paint  paint//円を描く.パラメータ1は中心点のx軸、パラメータ2は中心点のy軸、パラメータ3は半径、パラメータ4はpaintオブジェクト.
drawArc ( RectF  oval, float startAngle, float sweepAngle, boolean useCenter,  Paint  //弧を描く
パラメータ1はRectFオブジェクトであり、矩形領域の楕円形の境界は形状、大きさ、アークで定義され、パラメータ2はアークの開始角(度)である.
パラメータ3の走査角(度)は時計回りに測定され始め、パラメータ4はこれが本当であれば楕円中心のアークを含めて閉じ、偽であれば弧であり、パラメータ5はPaintオブジェクトである.
paintクラスも理解します.
 
Class Overview
The Paint class holds the style and color information about how to draw geometries, text and bitmaps. 
paintクラスはスタイルと色情報を持って幾何学、テキスト、ビットマップをどのように描画しますか.
 
 
ペイントはCanvasのブラシ、ブラシ、絵の具などを表しています.
 
Paintクラスの一般的な方法:
setarg(int a,int r,int g,int b)/ペイントオブジェクトの色を設定し、パラメータはalpha透明値とする
setAlpha(int a)/alpha不透明度を0~255の範囲で設定
setAntiAlias(boolean aa)/アンチエイリアシング
setColor(int color) //色を設定します.ここでAndroid内部で定義されているColorクラスには一般的な色定義が含まれています.
setTextScaleX(float scaleX) //テキストのズーム倍率を設定し、1.0 fを元にします.
setTextSize(float textSize) //フォントサイズの設定
setUnderlineText(booleanunderlineText) //下線の設定2、ケースを直接見る
効果図を見てみましょう.
Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)转  
この例では、カスタムviewクラスを使用します.
CustomActivity.java
public class CustomActivity extends Activity {  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        init();  
    }  
  
    private void init() {  
        LinearLayout layout=(LinearLayout) findViewById(R.id.root);  
        final DrawView view=new DrawView(this);  
        view.setMinimumHeight(500);  
        view.setMinimumWidth(300);  
        //  view        
        view.invalidate();  
        layout.addView(view);  
          
    }  
}  

 
重要なクラスカスタムビューコンポーネントビューコンポーネントビューコンポーネントを書き換えるonDraw(Canvase)メソッドです.次に、このCanvasに大量のジオメトリ、点、直線、弧、円、楕円、文字、矩形、多角形、曲線、角丸長方形など、さまざまな形状を描きます.
DrawView.java
public class DrawView extends View {  
  
    public DrawView(Context context) {  
        super(context);  
    }  
  
    @Override  
    protected void onDraw(Canvas canvas) {  
        super.onDraw(canvas);  
        /* 
         *       drawRect      drawCircle      drawOval      drawPath         
         * drawLine      drawPoin     
         */  
        //       
        Paint p = new Paint();  
        p.setColor(Color.RED);//       
  
        canvas.drawText("  :", 10, 20, p);//      
        canvas.drawCircle(60, 20, 10, p);//     
        p.setAntiAlias(true);//          。 true   ,            
        canvas.drawCircle(120, 20, 20, p);//     
  
        canvas.drawText("     :", 10, 60, p);  
        p.setColor(Color.GREEN);//       
        canvas.drawLine(60, 40, 100, 40, p);//     
        canvas.drawLine(110, 40, 190, 80, p);//     
        //       
        p.setStyle(Paint.Style.STROKE);//      
        RectF oval1=new RectF(150,20,180,40);  
        canvas.drawArc(oval1, 180, 180, false, p);//     
        oval1.set(190, 20, 220, 40);  
        canvas.drawArc(oval1, 180, 180, false, p);//     
        oval1.set(160, 30, 210, 60);  
        canvas.drawArc(oval1, 0, 180, false, p);//     
  
        canvas.drawText("   :", 10, 80, p);  
        p.setColor(Color.GRAY);//       
        p.setStyle(Paint.Style.FILL);//      
        canvas.drawRect(60, 60, 80, 80, p);//      
        canvas.drawRect(60, 90, 160, 100, p);//      
  
        canvas.drawText("      :", 10, 120, p);  
        /*                    */  
        Shader mShader = new LinearGradient(0, 0, 100, 100,  
                new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW,  
                        Color.LTGRAY }, null, Shader.TileMode.REPEAT); //     ,              。  
        p.setShader(mShader);  
        // p.setColor(Color.BLUE);  
        RectF oval2 = new RectF(60, 100, 200, 240);//         ,      
        canvas.drawArc(oval2, 200, 130, true, p);  
        //   ,      RectF:              ,         ,             ,          
        //   , oval     
        oval2.set(210,100,250,130);  
        canvas.drawOval(oval2, p);  
  
        canvas.drawText("    :", 10, 200, p);  
        //        ,            
        Path path = new Path();  
        path.moveTo(80, 200);//            
        path.lineTo(120, 250);  
        path.lineTo(80, 250);  
        path.close(); //               
        canvas.drawPath(path, p);  
  
        //             ,          
        p.reset();//    
        p.setColor(Color.LTGRAY);  
        p.setStyle(Paint.Style.STROKE);//      
        Path path1=new Path();  
        path1.moveTo(180, 200);  
        path1.lineTo(200, 200);  
        path1.lineTo(210, 210);  
        path1.lineTo(200, 220);  
        path1.lineTo(180, 220);  
        path1.lineTo(170, 210);  
        path1.close();//    
        canvas.drawPath(path1, p);  
        /* 
         * Path     (           
         *     *、    ,      ,      。drawPath(  、  ),          
         * (       ),                 。 
         */  
          
        //       
        p.setStyle(Paint.Style.FILL);//    
        p.setColor(Color.LTGRAY);  
        p.setAntiAlias(true);//            
        canvas.drawText("     :", 10, 260, p);  
        RectF oval3 = new RectF(80, 260, 200, 300);//           
        canvas.drawRoundRect(oval3, 20, 15, p);//      x  ,      y    
          
        //        
        canvas.drawText("      :", 10, 310, p);  
        p.reset();  
        p.setStyle(Paint.Style.STROKE);  
        p.setColor(Color.GREEN);  
        Path path2=new Path();  
        path2.moveTo(100, 320);//  Path     
        path2.quadTo(150, 310, 170, 400); //                    
        canvas.drawPath(path2, p);//         
          
        //    
        p.setStyle(Paint.Style.FILL);  
        canvas.drawText("  :", 10, 390, p);  
        canvas.drawPoint(60, 390, p);//      
        canvas.drawPoints(new float[]{60,400,65,400,70,400}, p);//      
          
        //   ,      
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);  
        canvas.drawBitmap(bitmap, 250,360, p);  
    }  
}