Android 畫圖Paint和Canvas

來源:互聯網
上載者:User

標籤:

在Android中需要通過graphics類來顯示2D圖形。

  graphics中包括了Canvas(畫布)、Paint(畫筆)、Color(顏色)、Bitmap(映像)等常用的類。graphics具有繪製點、線、顏色、2D幾何圖形、影像處理等功能。

 

Canvas:

void drawRect(RectF rect, Paint paint) //繪製地區,參數一為RectF一個地區

void drawPath(Path path, Paint paint) //繪製一個路徑,參數一為Path路徑對象

void  drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)  //貼圖,參數一就是我們常規的Bitmap對象,參數二是來源區域(這裡是bitmap),參數三是目的地區域(應該在 canvas的位置和大小),參數四是Paint畫刷對象,因為用到了縮放和展開的可能,當原始Rect不等於目標Rect時效能將會有大幅損失。

void  drawLine(float startX, float startY, float stopX, float stopY, Paint paint)  //畫線,參數一起始點的x軸位置,參數二起始點的y軸位置,參數三終點的x軸水平位置,參數四y軸垂直位置,最後一個參數為Paint畫刷對象。

void  drawPoint(float x, float y, Paint paint) //畫點,參數一水平x軸,參數二垂直y軸,第三個參數為Paint對象。

void drawText(String text, float x, float y, Paint paint)  //渲染文本,Canvas類除了上面的還可以描繪文字,參數一是String類型的文本,參數二x軸,參數三y軸,參數四是Paint對象。

void  drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint) //在路徑上繪製文本,相對於上面第二個參數是Path路徑對象

 

Paint:

void  setARGB(int a, int r, int g, int b)  設定Paint對象顏色,參數一為alpha透明通道

void  setAlpha(int a)  設定alpha不透明度,範圍為0~255

void  setAntiAlias(boolean aa)  //是否消除鋸齒

void  setColor(int color)  //設定顏色,這裡Android內部定義的有Color類包含了一些常見顏色定義

void  setFakeBoldText(boolean fakeBoldText)  //設定偽粗體文本

void  setLinearText(boolean linearText)  //設定線性文本

PathEffect  setPathEffect(PathEffect effect)  //設定路徑效果

Rasterizer  setRasterizer(Rasterizer rasterizer) //設定光柵化

Shader  setShader(Shader shader)  //設定陰影

void  setTextAlign(Paint.Align align)  //設定文本對齊

void  setTextScaleX(float scaleX)  //設定文本縮放倍數,1.0f為原始

void  setTextSize(float textSize)  //設定字型大小

Typeface  setTypeface(Typeface typeface)  //設定字型,Typeface包含了字型的類型,粗細,還有傾斜、顏色等。

void  setUnderlineText(boolean underlineText)  //設定底線

 

自訂View的基本實現方法

  首先,我們需要自訂一個類,比如MyView,繼承於View類。然後,複寫View類的onDraw()函數。最後,在onDraw()函數中使用Paint和Canvas對象繪製我們需要的圖形。

private class MyView2 extends View {        public MyView2(Context context) {            super(context);        }        @Override        protected void onDraw(Canvas canvas)        {            super.onDraw(canvas);            canvas.drawColor(Color.WHITE);            Paint paint = new Paint();            paint.setAntiAlias(true);            paint.setColor(Color.RED);            paint.setStyle(Paint.Style.STROKE);//設定為空白心            paint.setStrokeWidth(3);            canvas.drawCircle(40, 40, 30, paint);            canvas.drawRect(10, 90, 70, 150, paint);            canvas.drawRect(10, 170, 70, 200, paint);            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();//把開始的點和最後的點串連在一起,構成一個封閉圖形            /*             * 最重要的就是movtTo和close,如果是Style.FILL的話,不設定close,也沒有區別,可是如果是STROKE模式,             * 如果不設定close,圖形不封閉。             *              * 當然,你也可以不設定close,再添加一條線,效果一樣。             */            canvas.drawPath(path1, paint);                                                            ///////////////////////////////////////第二列            paint.setColor(Color.BLUE);            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);                                    ////////////////////////////////////////////////////第三列                        /*             * LinearGradient shader = new LinearGradient(0, 0, endX, endY, new             * int[]{startColor, midleColor, endColor},new float[]{0 , 0.5f,             * 1.0f}, TileMode.MIRROR);             * 參數一為漸層起初點座標x位置,參數二為y軸位置,參數三和四分辨對應漸層終點             * 其中參數new int[]{startColor, midleColor,endColor}是參與漸層效果的顏色集合,              * 其中參數new float[]{0 , 0.5f, 1.0f}是定義每個顏色處於的漸層相對位置, 這個參數可以為null,如果為null表示所有的顏色按順序均勻的分布             */            Shader mShader = new LinearGradient(0, 0, 100, 100,            new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW },            null, Shader.TileMode.REPEAT);            // Shader.TileMode三種模式            // REPEAT:沿著漸層方向迴圈重複            // CLAMP:如果在預先定義的範圍外畫的話,就重複邊界的顏色            // MIRROR:與REPEAT一樣都是迴圈重複,但這個會對稱重複            paint.setShader(mShader);// 用Shader中定義定義的顏色來話            canvas.drawCircle(200, 40, 30, paint);            canvas.drawRect(170, 90, 230, 150, paint);            canvas.drawRect(170, 170, 230, 200, 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.drawPath(path4, 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);                        //////////////////////////////////第4列            paint.setTextSize(24);            canvas.drawText("圓形", 240, 50, paint);            canvas.drawText("正方形", 240, 120, paint);            canvas.drawText("長方形", 240, 190, paint);            canvas.drawText("橢圓形", 240, 250, paint);            canvas.drawText("三角形", 240, 320, paint);            canvas.drawText("梯形", 240, 390, paint);        }    }

Android 畫圖Paint和Canvas

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.