轉載請注明出處:http://blog.csdn.net/wingichoy/article/details/50455412
本系列是為新手準備的自定義view練習項目(大牛請無視),相信在學習過程中,想學自定義view又無從下手,不知道做什么。本系列為新手提供了一系列自定義view的簡單實例。看過理解之后,自己實現,相信會有很大提高。
公司需要做地圖,無奈美工沒有給那種泡泡窗口,于是只能自定義view自己畫一個。
由于實現比較簡單,便想寫下來,給新手做一個自定義view的參考,新人學自定義view的時候也可以先拿這個練手。
首先看效果圖,就是一般的泡泡窗啦。

那么現在就開始了,分析一下,其實就是一個圓角矩形 加上一個三角。畫出來就是了。
首先先創建一個類,繼承自View ?,重寫他的構造方法,這里為了簡便就不加自定義屬性了。
~~~
public PopupView(Context context) {
this(context,null);
}
public PopupView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public PopupView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
~~~
然后是測量他的大小,為了方便,這里只給出EXACTLY的測量值,AT_MOST的時候大家可以自己給一個初始值,這里就不加了
里面有個mRect,其實就是圓角矩形啦。圓角矩形要比整體的view小一點,這里我直接乘上一個百分比來體現,我給的值是mRectPercent = 0.8;(這個處理方式是十分不好的,是一種錯誤的方式,這里我不想更正了,因為只有錯誤才能提高。你可以查看下一篇博客,計算了padding,讓矩形處于最中間)。
~~~
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if(widthMode== MeasureSpec.EXACTLY){
mWidth = widthSize; //獲取到當前view的寬度
mRectWidth = (int) (mWidth * mRectPercent);//計算矩形的大小 這里是直接給的初值為0.8 也就是說矩形是view大小的0.8倍 下同
}
if(heightMode == MeasureSpec.EXACTLY){
mHeight = heightSize;//獲取當前view的高度
mRectHeight = (int) (mHeight * mRectPercent+0.1);
}
setMeasuredDimension(mWidth,mHeight);
}
~~~
測量完成以后接下來就是繪制了,繪制起來也比較簡單,關鍵是計算出關鍵點的坐標。這里來一張圖表示一下

只需要把三角的三個點的坐標計算出來就可以了。至于后面加減的數字,其實就是三角形的高和底邊長 也很簡單,聰明的你一定一看就懂。
那么就把這些坐標畫成圖形。
~~~
@Override
protected void onDraw(Canvas canvas) {
Paint p = new Paint();
p.setColor(Color.parseColor("#2C97DE"));
p.setStyle(Paint.Style.FILL);
canvas.drawRoundRect(new RectF(0,0,mRectWidth,mRectHeight),10,10,p);
Path path = new Path();
path.moveTo(mRectWidth/2-30,mRectHeight);
path.lineTo(mRectWidth/2,mRectHeight+20);
path.lineTo(mRectWidth/2+30,mRectHeight);
path.close();
canvas.drawPath(path,p);
super.onDraw(canvas);
}
~~~
其中圓角矩形是用drawRoundRect方法來繪制的,里面是一個基本的矩形,和圓角的半徑
三角形是用path來繪制,首先用moveTo設定起點坐標,最后將兩條線連接起來,別忘了close成一個封閉的圖形。
這樣就大功告成泡泡窗,不用麻煩美工啦!
如果你覺得這個自定義view比較簡單可以閉著眼睛寫出來,你還可以參考進階一點點的?[自定義圓形百分比,進度條](http://blog.csdn.net/wingichoy/article/details/50334595)?進行練習,總之自定義view并不難,只要多練,就一定會掌握熟練。
- 前言
- android自定義viewgroup初步之一----抽屜菜單
- Android 自定義view --圓形百分比(進度條)
- Android 自定義View -- 簡約的折線圖
- 新手自定義view練習實例之(一) 泡泡彈窗
- 新手自定義view練習實例之(二) 波浪view
- 手把手帶你畫一個 時尚儀表盤 Android 自定義View
- 手把手帶你畫一個動態錯誤提示 Android自定義view
- 手把手帶你做一個超炫酷loading成功動畫view Android自定義view
- 關于Android自定義view 你所需要知道的基本函數
- Android自定義view進階-- 神奇的貝塞爾曲線
- wing帶你玩轉自定義view系列(1) 仿360內存清理效果
- wing帶你玩轉自定義view系列(2) 簡單模仿qq未讀消息去除效果
- wing帶你玩轉自定義view系列(3)模仿微信下拉眼睛
- 手把手教你畫一個 逼格滿滿圓形水波紋loadingview Android
- 有坑?? 為何wing墜入PorterDuffXferMode的萬丈深淵(PorterDuffXferMode深入試驗)
- 手把手帶你畫一個漂亮蜂窩view Android自定義view
- 一個炫字都不夠??!!!手把手帶你打造3D自定義view
- 恭喜發財! -- 手把手教你仿造一個qq下拉搶紅包 Android自定義view