畫筆Paint

一、Paint的基本實用方法和技巧
1 .負責圖形繪製相關

    //重置
    mPaint.reset();
    mPaint.setColor(Color.RED);
    mPaint.setAlpha(255);
    //設置畫筆的樣式
//  mPaint.setStyle(Paint.Style.FILL);//填充內容
//  mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStyle(Paint.Style.STROKE);//描邊
    //畫筆的寬度
    mPaint.setStrokeWidth(50);
    //線帽
//  mPaint.setStrokeCap(Paint.Cap.BUTT);//沒有
    mPaint.setStrokeCap(Paint.Cap.ROUND);//圓形
//  mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形

//  mPaint.setStrokeJoin(Paint.Join.MITER);//銳角
//  mPaint.setStrokeJoin(Paint.Join.ROUND);//圓弧
//  mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線
    //線段的連接處的樣式
//  mPaint.setStrokeJoin(Paint.Join.MITER);//銳角
//  mPaint.setStrokeJoin(Paint.Join.ROUND);//圓弧
//  mPaint.setStrokeJoin(Paint.Join.BEVEL);//直線

//防鋸齒,會損失一定的性能
mPaint.setAntiAlias(true);

2 .負責文字繪製相關

//獲得字符行間距
//  mPaint.getFontSpacing();
    //獲得字符之間的間距
//  mPaint.getLetterSpacing();
//  mPaint.setLetterSpacing(letterSpacing)//設置
    //設置文本刪除線
//  mPaint.setStrikeThruText(true);
    //是否設置下劃線
//  mPaint.setUnderlineText(true);
    //設置文本大小
//  mPaint.setTextSize(textSize);
//  mPaint.getTextSize();
//  mPaint.setTypeface(Typeface.BOLD);//設置字體類型
//  Typeface.ITALIC
//  Typeface.create(familyName, style)//加載自定義字體
    //文字傾斜 默認0,官方推薦的-0.25f是斜體
//  mPaint.setTextSkewX(-0.25f);
    //文本對齊方式
//  mPaint.setTextAlign(Align.LEFT);
//  mPaint.setTextAlign(Align.CENTER);
//  mPaint.setTextAlign(Align.RIGHT);
//計算制定長度的字符串(字符長度、字符個數、顯示的時候真實的長度)
//  int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
    mPaint.setTextSize(50);
//  float[] measuredWidth = new float[1];
//  int breakText = mPaint.breakText(str, true, 200, measuredWidth);
//  Log.i("RICKY", "breakText="+breakText+", str.length()="+str.length()+", measredWidth:"+measuredWidth[0]);
// Rect bounds獲取文本的矩形區域(寬高)
//  mPaint.getTextBounds(text, index, count, bounds)
//  mPaint.getTextBounds(text, start, end, bounds)
    //獲取文本的寬度,和上面類似,但是是一個比較粗略的結果
    float measureText = mPaint.measureText(str);
    //獲取文本的寬度,和上面類似,但是是比較精準的。
    float[] measuredWidth = new float[10];  
    //measuredWidth得到每一個字符的寬度;textWidths字符數
    int textWidths = mPaint.getTextWidths(str, measuredWidth);
//  mPaint.getTextWidths(text, start, end, widths)
    Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);

3.基線的問題
這裏寫圖片描述

FontMetrics fontMetrics = mPaint.getFontMetrics();
fontMetrics.top;
fontMetrics.ascent;
fontMetrics.descent;
fontMetrics.bottom;

所有的四個值都是以基線baseLine爲基準來計算的。baseline以上的就是負的;以下的是正的。

在做自定義控件的時候canvas.drawText(x,y) 這個y並不是text的左上角,而是以baseline爲基準的。

1)實例:指定左上角的頂點座標 繪製文本
公式: float baselineY = Y - fontMetrics.top;

2)實例:指定中間位置,繪製文本
公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom

4.Paint畫筆的高級技能
渲染 Shader:
BimapShader位圖的圖像渲染器
LinearGradient線性渲染
RadialGradient環形渲染
水波紋效果,充電水波紋擴散效果、調色板
SweepGradient梯度渲染(掃描渲染)
微信等雷達掃描效果。手機衛士垃圾掃描
ComposeShader組合渲染

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);

//      canvas.drawBitmap(bitmap, 0, 0, paint);

        /**
         * TileMode.CLAMP 拉伸最後一個像素去鋪滿剩下的地方
         * TileMode.MIRROR 通過鏡像翻轉鋪滿剩下的地方。
         * TileMode.REPEAT 重複圖片平鋪整個畫面(電腦設置壁紙)
         */
//      bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.MIRROR);
//      bitmapShader = new BitmapShader(bitmap, TileMode.CLAMP, TileMode.CLAMP);
        bitmapShader = new BitmapShader(bitmap, TileMode.REPEAT, TileMode.REPEAT);
        paint.setShader(bitmapShader);
//      paint.setAntiAlias(true);

        //設置像素矩陣,來調整大小,爲了解決寬高不一致的問題。
//      float scale = Math.max(width, height)*1.0f/Math.min(width, height);
//      Matrix matrix = new Matrix();
//      matrix.setScale(scale, scale);//縮放比例
//      bitmapShader.setLocalMatrix(matrix);

//      canvas.drawRect(new Rect(0, 0, 800, 800), paint);
//      canvas.drawCircle(height/2, height/2, height/2, paint);
//      canvas.drawCircle(Math.min(width, height)/2f, scale*Math.max(width, height)/2f, Math.max(width, height)/2f, paint);

//      canvas.drawOval(new RectF(0, 0, width, height), paint);
//      canvas.drawOval(new RectF(0, 0, width, width), paint);

        //通過shapeDrawable也可以實現
//      ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
//      shapeDrawable.getPaint().setShader(bitmapShader);
//      shapeDrawable.setBounds(0, 0, width, width);
//      shapeDrawable.draw(canvas);


        /**線性漸變
         * x0, y0, 起始點
         *  x1, y1, 結束點
         * int[]  colors, 中間依次要出現的幾個顏色
         * float[] positions,數組大小跟colors數組一樣大,中間依次擺放的幾個顏色分別放置在那個位置上(參考比例從左往右)
         *    tile
         */
//      LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.CLAMP);
        LinearGradient linearGradient = new LinearGradient(0, 0, 400, 400, colors, null, TileMode.REPEAT);
//      paint.setShader(linearGradient);
//      canvas.drawRect(0, 0, 400, 400, paint);

//      radialGradient = new RadialGradient(300, 300, 100, colors, null, TileMode.REPEAT);
//      paint.setShader(radialGradient);
//      canvas.drawCircle(300, 300, 300, paint);

//      sweepGradient = new SweepGradient(300, 300, colors, null);
//      paint.setShader(sweepGradient);
//      canvas.drawCircle(300, 300, 300, paint);

        composeShader = new ComposeShader(linearGradient, bitmapShader, PorterDuff.Mode.SRC_OVER);
        paint.setShader(composeShader);
        canvas.drawRect(0, 0, 800, 1000, paint);

    }

可以繪製圖片、顏色塊、文字
canvas.drawCircle()
canvas.drawRect()
canvas.drawOval()

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