1. 程式人生 > >Android自定義view案例一氣泡框

Android自定義view案例一氣泡框

通過之前的兩個基礎文章的學習,我們基本知道自定義view的基本流程和各方法的作用了。那麼接下來我們就要拿起畫筆去繪製我們的view了。首先老規矩把我們的學習大綱拿出來,時刻不能忘,,哈哈、

1.自定義view單純的用畫筆繪製view(死view)
2.自定義view增加手勢
3.自定義view增加動畫
4.自定義view手勢動畫互動     這4步讓我們一步一步的來探索學習

好了這就是我們的大綱。這是我們第一個view,所以就只是一個單純的“死”view。我為什麼稱之為死view,通過這個名字我們就知道了。就是單純的畫一個圖而已,沒有動畫。就是單單純純的一個圖。但是一定不要著急,這是我們學自定義view的一個過程。。凡事都有個過程,還沒學會走,就想跑,那是不可能的,所以我們要一步一步的來。好了那就開始把。先上死view 效果圖例:


通過這個圖我們看到,確實是個死view,就一個圖。首先分析一下:

1.就是一個矩形,有圓角

2.矩形下面有個三角形

是不是很簡單,不要眼高手低。。再簡單也要親自去試試。這是個學習的過程。。。。學習自定義view最好的方法就是多練,多找一些例子練練。。慢慢你就牛逼了。

不管再難的view,還是很簡單的view。套路還是我們前兩篇文章的流程。

第一步:建立一個類繼承View。第二步......................這裡我也不想重複寫了,不熟悉的可以去看我第一篇自定義view。

下面就開始我們的例子:

//圓角半徑
float ridus;
//背景顏色
int  popu_bg;
//畫筆
Paint paint
; public PopuView(Context context) { this(context,null); } public PopuView(Context context, @Nullable AttributeSet attrs) { this(context,attrs,0); } public PopuView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //獲取屬性 TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.PopuView,0,0); ridus = a.getDimension(R.styleable.PopuView_ridus,5); popu_bg = a.getColor(R.styleable.PopuView_popu_bg,0xFF4081); a.recycle(); //初始化畫筆 paint = new Paint(); //設定抗鋸齒 paint.setAntiAlias(true); //設定填充 paint.setStyle(Paint.Style.FILL_AND_STROKE); //設定防抖動 paint.setDither(true); }
這裡就是我們初始化的資料。
//view的寬高
int widthSize;
int heightSize;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//獲得當前view的寬高限制的型別
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int heightMode = MeasureSpec.getMode(heightMeasureSpec);
//獲得view的預設尺寸
widthSize= MeasureSpec.getSize(widthMeasureSpec);
heightSize= MeasureSpec.getSize(heightMeasureSpec);
//判斷viewmode型別
//這種是 warp_parent 型別 就是view的寬高不確定,所以我們要給view 賦值。實在 dimen.xml 裡面寫的
if (widthMode==MeasureSpec.AT_MOST&&heightMode==MeasureSpec.AT_MOST){
        widthSize = R.dimen.pwidth;
heightSize = R.dimen.pheight;
}
    //最後把寬,高設定到viewsetMeasuredDimension(widthSize,heightSize);
}
這裡就是我們測量view的尺寸。看一下佈局:
<com.example.administrator.myview.PopuView
android:id="@+id/po"
android:layout_width="300dp"
android:layout_height="200dp"
android:layout_gravity="center"
app:ridus="5dp"
app:popu_bg="@color/colorAccent"
/>
寬高都是固定的所以MeasureSpace的模型就是 MeasureSpec.EXACTLY,就是確切的值。既然是確切的值那我們的
MeasureSpec.getSize(widthMeasureSpec)

這個方法獲取到的尺寸就是具體的佈局中的view的尺寸。所以我們就預設預設view的寬高,不用修改。如果我們佈局中用wrap_parent 就是MeasureSpec.AT_MOST這樣的模型。就是我們view沒有值。所以我們要給他賦值。

<declare-styleable name="PopuView">
    <attr name="ridus" format="dimension"></attr>
    <attr name="popu_bg" format="color"></attr>
</declare-styleable>
這是我們定義的view的屬性。以便寫死。

接下來就是根據引數繪製view了

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
paint.setColor(popu_bg);
//畫矩形
RectF rectF = new RectF(0,0,widthSize,heightSize-20);
canvas.drawRoundRect(rectF,ridus,ridus,paint);
//畫三角形(這裡是基於path路徑的繪製)
Path path = new Path();
path.moveTo((widthSize/2)-50, heightSize-20);
path.lineTo(widthSize / 2, heightSize);
path.lineTo((widthSize/2)+50, heightSize-20);
path.close();
canvas.drawPath(path, paint);
}

註釋也很清晰,,一般就是一些引數和演算法。這是一個死的view。我們大綱裡面要從死view到動態view。在到與人互動的view。這個過程的學習。所以我們不能只搞死view

下一篇我們就來學一學有動態的view。。。要一點點的去過度。不能過度的太快。基礎要打撈呀。不然後期學起來一樣吃力。