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); //判斷view的mode型別 //這種是 warp_parent 型別 就是view的寬高不確定,所以我們要給view 賦值。實在 dimen.xml 裡面寫的 if (widthMode==MeasureSpec.AT_MOST&&heightMode==MeasureSpec.AT_MOST){ widthSize = R.dimen.pwidth; heightSize = R.dimen.pheight; } //最後把寬,高設定到view中 setMeasuredDimension(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。。。要一點點的去過度。不能過度的太快。基礎要打撈呀。不然後期學起來一樣吃力。