慢慢的開始接觸自定義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方法就可以了。最後把效果圖貼出來: