自定義view之Text文本

           慢慢的開始接觸自定義view了,剛開始接觸有很多基礎是需要整理一下的,比如說Paint的用法,有多少?cavans又有多少方法?如何自定義viewgroup?等等,所以需要一點點開始,今天先記錄一下Paint的一些關於文本的用法。

           自定義view其實和蓋房子一樣的道理,首先你需要確定繪製什麼樣的view,也就是你想蓋什麼樣的房子,是平房還是洋樓,也就是定樣,然後你要確定在屏幕的那個位置繪製你的view,對於蓋房子就是你要在哪裏蓋,是北京還是上海,也就是定位,這個都確定好了,你就要開始繪製你的view,開始蓋你的美麗房子了,也就是定型。那麼在view中的方法中,onMeasure()方法就是開始確定尺寸大小,onLayout()確定位置(子view的位置),onDraw()就是定型了。所以以上三個方法最重要了。

          今天由於剛開始接觸,所以自定義view不是繼承View,而是繼承自TextView,這樣我們就可以直接定型了,而暫時忽略掉定位。

        1.Paint 的一些常規設置以及含義(沒什麼好解釋的,自己敲一遍代碼就都理解了)

        mPaint = new Paint();
        mPaint.setColor(Color.GREEN);//設置畫筆的顏色
        mPaint.setAntiAlias(true);//設置抗鋸齒,否則斜線等會有鋸齒
        mPaint.setStyle(Paint.Style.STROKE);//Paint.Style.FILL 填充內部    Paint.Style.FILL_AND_STROKE 填充內部並描邊(和前一個沒有什麼區別)  Paint.Style.STROKE描邊  
                                       詳解 http://blog.csdn.net/harvic880925/article/details/38875149
        mPaint.setAlpha(100);//這隻透明度  0到255
        mPaint.setARGB(12, 23, 44, 66);//設置顏色,A透明度  R紅色  G綠色  B藍色
        mPaint.setStrokeWidth(100);//設置畫筆的寬度
        mPaint.reset();//畫筆重置
       2.Paint中與文本有關的一些設置方法

        mPaint.setLinearText(true);//設置文本緩存,如果設置爲true就不進行緩存(不知有亂用)
        mPaint.setFakeBoldText(true);//設置字體是否加粗,textview中有對應的屬性
        mPaint.setSubpixelText(true);//設置亞像素,可以讓文字更加清晰明顯,對文本設置的一種優化
        mPaint.setUnderlineText(true);//文字是否設置下劃線
        mPaint.setStrikeThruText(true);//設置文字刪除線
        mPaint.setLetterSpacing(10); //設置行間距,默認爲0
        mPaint.setShadowLayer(10, 10, 10, Color.GREEN);//設置字體陰影效果 參數依次爲陰影傾斜度  水平位移  垂直位移 陰影顏色
        mPaint.setTextAlign(Paint.Align.RIGHT);//設置文字對齊方式  Paint.Align.LEFT左對齊   Paint.Align.RIGHT 右對齊  還有居中顯示
        Typeface t = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);//Typeface.BOLD 粗體  Typeface.BOLD_ITALIC 粗斜體  Typeface.ITALIC 斜體  Typeface.NORMAL 常規   詳見:http://blog.csdn.net/ljb_blog/article/details/10150871
        mPaint.setTypeface(t);//設置字體  Typeface.DEFAULT 常規字體類型  Typeface.DEFAULT_BOLD 黑體字體類型  Typeface.MONOSPACE 等寬字體類型   Typeface.SANS_SERIF  sans serif字體類型  Typeface.SERIF serif字體類型
        mPaint.setTextLocale(Locale.getDefault());//設置地理位置,這裏如果你要使用,直接傳入Locale.getDefault()即可。它用來設置文本的區域比如中文、日文等。
        mPaint.setTextScaleX(1);//將文本沿X軸水平縮放,默認值爲1,當值大於1會沿X軸水平放大文本,當值小於1會沿X軸水平縮放文本
        mPaint.setTextSize(20);//設置字體大小
        mPaint.setTextSkewX(20);//設置字體在水平方向的傾斜官方建議爲0到25,如果爲負數則爲向右傾斜
        float aaaa = mPaint.measureText("aaaa", 0, 1);//獲取字符串的寬度
        mPaint.getTextBounds("0000", 0, 3, new Rect());//獲取字符串的寬高信息,具體信息存放在rect矩形中
        mPaint.breakText("aaaaaaaaaaaa", 0, 10, true, 100, null);//剪切顯示,就是大於maxWidth的時候只截取指定長度的顯示,[code]text 表示我們的字符串;start 表示從第幾個字符串開始測量;end 表示從測量到第幾個字符串爲止;measureForwards 表示向前還是向後測量;
                                    // maxWidth 表示一個給定的最大寬度在這個寬度內能測量出幾個字符;measuredWidth 爲一個可選項,可以爲空,不爲空時返回真實的測量值
        mPaint.ascent();//返回上坡度的值
        mPaint.descent();//返回下坡度的值
3.具體每種效果實際中應用如下:

            3.1)介紹canvas中的方法drawText()

      //設置畫筆的樣式  fill爲填充  stroke爲空心
        mPaint.setStyle(Paint.Style.FILL);
        //設置畫筆的顏色
        mPaint.setColor(Color.GREEN);
        //設置填充的寬度
        mPaint.setStrokeWidth(1);
        //設置是否抗鋸齒
        mPaint.setAntiAlias(true);
        //設置字體的大小   需要將sp單位轉爲px
        mPaint.setTextSize(DensityUtils.sp2px(getContext(),25));
        char[] c=new char[]{'我','回','家'};
        //參數含義:字符串  開始   長度  左下角x   y座標   畫筆
//      canvas.drawText(char[] text, int index, int count, float x, float y, @NonNull Paint paint);
        Rect charBound=new Rect();
        mPaint.getTextBounds(c,0,c.length,charBound);
        height=charBound.height();
        canvas.drawText(c,0,3,0,height,mPaint);

        //參數含義: 文本   左下角座標x  y    畫筆  (文本的繪製比較特殊,圖形繪製是從左上角開始計算繪製的,但是文本的繪製基準點爲左下角)
//      canvas.drawText( String text, float x, float y, @NonNull Paint paint);
        String s="最簡單的一個文本";
        Rect bounds=new Rect();
        mPaint.setColor(Color.BLUE);
        mPaint.getTextBounds(s,0,s.length(),bounds);//得到繪製文本的邊界
        height+=bounds.height()+10;
        canvas.drawText(s,0,height,mPaint);

        //參數含義:文本  從第幾個開始   到哪個結束   左下角座標x  y   畫筆
//      canvas.drawText(String text, int start, int end, float x, float y, Paint paint);
//      canvas.drawText(CharSequence text, int start, int end, float x, float y,Paint paint)
        mPaint.setColor(Color.BLACK);
        Rect subTextBound=new Rect();
        mPaint.getTextBounds(s,1,s.length(),subTextBound);
        height+=subTextBound.height()+10;
        canvas.drawText(s,1,s.length(),0,height,mPaint);
3.2)改變畫筆的填充效果

        s="空心文本";
        mPaint.setStyle(Paint.Style.STROKE);
        height+=subTextBound.height()+10;
        canvas.drawText(s,20,height,mPaint);
3.3)設置字體爲傾斜 參數值爲正數時表示向左傾斜,負數爲向右傾斜,參數值不必太大

        s="傾斜的文字";
        mPaint.setTextSkewX((float) -0.2);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.GRAY);
        height+=subTextBound.height()+10;
        canvas.drawText(s,20,height,mPaint);
3.4)設置透明度 參數值爲0到255 參數值越小越透明 並且此方法必須在設置顏色後面調用否則無效
        s="設置一定的透明度";
        mPaint.setColor(Color.GREEN);
        mPaint.setAlpha(100);
        mPaint.setTextSkewX(0);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.5)文本加粗顯示,默認爲不加粗

        s="加粗文本";
        mPaint.setAlpha(255);
        mPaint.setFakeBoldText(true);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.6)設置文本亞像素,字體更清晰,優化(不過沒什麼可以看到的效果)

        s="設置亞像素,字體更清晰";
        mPaint.setFakeBoldText(false);
        mPaint.setSubpixelText(true);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.7)設置下劃線
        s="設置下劃線";
        mPaint.setSubpixelText(false);
        mPaint.setUnderlineText(true);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.8)設置對齊方式,默認爲左對齊,還有居中對齊和右對齊,注意設置對齊方式後左下角文本開始的座標

        s="改變對齊的方式";
        mPaint.setUnderlineText(false);
        mPaint.setTextAlign(Paint.Align.CENTER);
        height+=subTextBound.height()+10;
        canvas.drawText(s,subTextBound.width()/2,height,mPaint);//注意這裏改變了繪製起點
3.9)記錄文本的位置信息,主要可以獲取國家 語言等信息

        s="記錄位置信息";
        mPaint.setTextAlign(Paint.Align.LEFT);
        mPaint.setTextLocale(Locale.getDefault());
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
        Locale textLocale = this.getTextLocale();
        Log.e("TAG", "onDraw: " + textLocale.getLanguage());
3.10)字體的橫向縮放 參數值0-1表示字體縮小  1表示正常      大於1表示方法

        s="字體橫向縮放";
        mPaint.setTextScaleX((float) 1.5);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.11)設置刪除線

        s="設置刪除線";
        mPaint.setTextScaleX(1);
        mPaint.setStrikeThruText(true);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.12)設置字體間距,參數含義爲多少倍字體寬度的間距

        s="設置字體間距";
        mPaint.setStrikeThruText(false);
        mPaint.setLetterSpacing((float) 0.5);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.13)設置陰影效果  第一個參數爲陰影寬度(半徑),值越大越模糊陰影  第二三個參數爲偏移量  第四個爲顏色值

        s="設置陰影效果";
        mPaint.setLetterSpacing(0);
        mPaint.setShadowLayer(5,15,15,Color.RED);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
3.14)改變字體

        s="改變字體";
        mPaint.setShadowLayer(0,0,0,Color.GREEN);
        mPaint.setTypeface(Typeface.DEFAULT);
        height+=subTextBound.height()+10;
        canvas.drawText(s,0,height,mPaint);
        mPaint.setTypeface(Typeface.DEFAULT_BOLD);//粗體
        s="粗體";
        canvas.drawText(s,subTextBound.width()/3*2,height,mPaint);

好了,其實自己敲一遍很快的,源碼就不貼出來了,很簡單的,繼承textview,然後重寫ondraw方法就可以了。最後把效果圖貼出來:














發佈了62 篇原創文章 · 獲贊 28 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章