自定義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