Android自定義View的基礎(chǔ)方法

自定義View這塊對我來說一直都是短板芥驳,真不巧上個項目中就有一些自定義的View夭苗。為了能夠畫出來也是狠狠的惡補一些基礎(chǔ)的知識。現(xiàn)在趁著記性還在把收集的一些基礎(chǔ)知識記錄一下吧 0.0。

坐標(biāo)系

android中的坐標(biāo)系統(tǒng) :屏幕的左上角是坐標(biāo)系統(tǒng)原點(0,0),原點向右延伸是X軸正方向仔引,原點向下延伸是Y軸正方向。

zbx.png

圖片出自:Android 屏幕(View)坐標(biāo)系統(tǒng)

    1褐奥、視圖左側(cè)位置  view.getLeft()
    2咖耘、視圖右側(cè)位置  view.getRight()
    3、視圖頂部位置  view.getTop();
    4撬码、視圖底部位置  view.getBottom();
    5儿倒、視圖寬度 view.getWidth();
    6、視圖高度 view.getHeight()
MotionEvent中 get 和 getRaw 的區(qū)別
qb.jpg
event.getX();       //觸摸點相對于其所在組件坐標(biāo)系的坐標(biāo)
event.getY();

event.getRawX();    //觸摸點相對于屏幕默認(rèn)坐標(biāo)系的坐標(biāo)
event.getRawY();

角度與弧度

角度(angle):兩條射線從圓心向圓周射出呜笑,形成一個夾角和夾角正對的一段弧夫否。當(dāng)這段弧長正好等于圓周長的360分之一時,兩條射線的夾角的大小為1度叫胁。

弧度(radian):兩條射線從圓心向圓周射出慷吊,形成一個夾角和夾角正對的一段弧。當(dāng)這段弧長正好等于圓的半徑時曹抬,兩條射線的夾角大小為1弧度。

jd.jpg
hd.jpg

自定義View中常用的方法

1.onFinishInflate();

    //從XML加載組件后回調(diào)  
    @Override
    protected void onFinishInflate() {
        // TODO Auto-generated method stub
        super.onFinishInflate();
    }

2.onSizeChanged();

    //組件大小改變時回調(diào)
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        // TODO Auto-generated method stub
        super.onSizeChanged(w, h, oldw, oldh);
    }

3.onMeasure();

    // 回調(diào)該方法進(jìn)行測量
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

4.onLayout()

    // 回調(diào)該方法來確定顯示的位置
    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        // TODO Auto-generated method stub
        super.onLayout(changed, left, top, right, bottom);
    }

5.onTouchEvent()

    // 監(jiān)聽到觸摸時間時回調(diào)
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return super.onTouchEvent(event);
    }

6.onDraw()

    // 繪圖
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
    }

畫筆Paint和畫布Canvas

paint相關(guān)方法:

        mPaint.setColor(Color.RED);//設(shè)置畫筆顏色
        mPaint.setAntiAlias(true); //抗鋸齒
        mPaint.setStyle(Paint.Style.STROKE);//繪制模式 fill填充 stroke描邊 FILL_AND_STROKE 填充并且描邊
        mPaint.setStrokeWidth(10);//設(shè)置畫筆的寬度10xp

canvas相關(guān)方法:

        //繪制圓
        canvas.drawCircle(300,400,200,mPaint);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawCircle(700,400,200,mPaint);
        
        //畫矩形
        mPaint.setStrokeWidth(8);
        mPaint.setStyle(Paint.Style.STROKE);
        canvas.drawRect(300,400,200,700,mPaint);
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawRect(450,400,350,700,mPaint);
        RectF rectF = new RectF(600,400,500,700);
        canvas.drawRect(rectF,mPaint);

        //繪制點
         mPaint.setStrokeWidth(40);
        mPaint.setColor(Color.BLACK);
        mPaint.setStrokeCap(Paint.Cap.ROUND);//設(shè)置點的形狀
        canvas.drawPoint(400,800,mPaint);
        mPaint.setStrokeCap(Paint.Cap.BUTT);//設(shè)置點的形狀
        canvas.drawPoint(500,800,mPaint);

        //多個點
        float[] points = {0, 0, 50, 50, 50, 100, 100, 50, 100, 100, 150, 50, 150, 100};
        canvas.drawPoints(points, 2 /* 跳過兩個數(shù),即前兩個 0 */,
                8 /* 一共繪制 8 個數(shù)(4 個點),兩個參數(shù)組成一個點*/, mPaint);
e1.png
        //繪制線
        mPaint.setStrokeWidth(10);
        mPaint.setStrokeCap(Paint.Cap.BUTT);
        canvas.drawLine(100,100,500,500,mPaint);
        float[] linePoints = {20, 20, 120, 20, 70, 20, 70, 120, 20, 120, 120, 120, 150, 20, 250, 20, 150, 20, 150, 120, 250, 20, 250, 120, 150, 120, 250, 120};
        canvas.drawLines(linePoints, mPaint);

       //繪制圓角矩形
        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawRoundRect(100, 200, 500, 400, 50, 50, mPaint);

        //繪制弧形或扇形
        mPaint.setStyle(Paint.Style.FILL); // 填充模式
        canvas.drawArc(500, 500, 800, 800, -110, 100, true, mPaint); // 繪制扇形
        canvas.drawArc(500, 500, 800, 800, 20, 140, false, mPaint); // 繪制弧形
        mPaint.setStyle(Paint.Style.STROKE); // 畫線模式
        canvas.drawArc(500, 500, 800, 800, 180, 60, false, mPaint); // 繪制不封口的弧形
e2.png
        //繪制曲線
        mPaint.setStyle(Paint.Style.FILL);
        Path path = new Path();
        path.addArc(200, 200, 400, 400, -225, 225);
        path.arcTo(400, 200, 600, 400, -180, 225, false);
        path.lineTo(400, 542);
        canvas.drawPath(path,mPaint);

        //繪制圖片
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.tp);
        canvas.drawBitmap(bitmap,300,700,mPaint);

        //繪制文字
        mPaint.setTextSize(18);
        mPaint.setTypeface(Typeface.DEFAULT);//設(shè)置字體
        canvas.drawText("自律給我自由",300,900,mPaint);
        mPaint.setTextSize(25);
        mPaint.setTypeface(Typeface.DEFAULT_BOLD);
        canvas.drawText("自律給我自由",300,950,mPaint);
        mPaint.setTypeface(Typeface.MONOSPACE);
        mPaint.setTextSize(30);
        canvas.drawText("自律給我自由",300,1000,mPaint);
e3.png

參考文章:
安卓自定義View教程目錄
Android繪圖機制(一)——自定義View的基礎(chǔ)屬性和方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谤民,一起剝皮案震驚了整個濱河市堰酿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌张足,老刑警劉巖触创,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異为牍,居然都是意外死亡哼绑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門碉咆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抖韩,“玉大人,你說我怎么就攤上這事疫铜∶。” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵壳咕,是天一觀的道長席揽。 經(jīng)常有香客問我,道長谓厘,這世上最難降的妖魔是什么幌羞? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮竟稳,結(jié)果婚禮上属桦,老公的妹妹穿的比我還像新娘。我一直安慰自己住练,他們只是感情好地啰,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讲逛,像睡著了一般亏吝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盏混,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天蔚鸥,我揣著相機與錄音,去河邊找鬼许赃。 笑死止喷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的混聊。 我是一名探鬼主播弹谁,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了预愤?” 一聲冷哼從身側(cè)響起沟于,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎植康,沒想到半個月后旷太,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡销睁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年供璧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冻记。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡睡毒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出檩赢,到底是詐尸還是另有隱情吕嘀,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布贞瞒,位于F島的核電站偶房,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏军浆。R本人自食惡果不足惜棕洋,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望乒融。 院中可真熱鬧掰盘,春花似錦、人聲如沸赞季。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽申钩。三九已至次绘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撒遣,已是汗流浹背邮偎。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留义黎,地道東北人禾进。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像廉涕,于是被迫代替她去往敵國和親泻云。 傳聞我的和親對象是個殘疾皇子艇拍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容