Android自定義view練習實例之(一) 泡泡彈窗

jopen 8年前發布 | 9K 次閱讀 Android開發 移動開發

轉載請注明出處: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比較簡單可以閉著眼睛寫出來,你還可以參考進階一點點的 自定義圓形百分比,進度條 進行練習,總之自定義view并不難,只要多練,就一定會掌握熟練。



來自: http://blog.csdn.net/wingichoy/article/details/50455412

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!