view 自定義一般情況下需要重寫onDraw()方法進(jìn)行繪制,onMeasure()對(duì)子view進(jìn)行測量,
onLayout()方法來確定view的位置
onFinishInflate(): 從xml加載組建后回調(diào)
onSizeChanged(): 組件大小改變時(shí)回調(diào),列如:給繪制view實(shí)現(xiàn)動(dòng)態(tài)效果,最后再在onDraw()方法中
調(diào)用invalidate()方法通知view進(jìn)行重繪,postInvalidateDelayed(300);這里進(jìn)行
view的延遲重繪。
onMeasure(): 回調(diào)該方法對(duì)view進(jìn)行測量
onLayout(): 回調(diào)該方法來確定顯示的位置
onTouchEvent():監(jiān)聽到觸摸事件是回調(diào)
通常情況下,有以下三種方法來實(shí)現(xiàn)自定義控件
一。對(duì)現(xiàn)有的控件進(jìn)行拓展
二。通過組合來實(shí)現(xiàn)新的控件
三。重寫view來實(shí)現(xiàn)新的控件
public class Myview extends View {
Paint paint1;
LinearGradient linearGradient;
private int [] colors={Color.BLUE,Color.GREEN,Color.YELLOW};
public Myview(Context context) {
super(context);
}

public Myview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Myview(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 移動(dòng)畫筆位置
/* canvas.translate(10,0); 畫筆向前平移10像素
*
* */
RectF Rectf;
Paint paint;
int mRectWidth=100; //每一個(gè)矩形的寬度
int offset=5; //每一個(gè)矩形之間的空隙
int left= getLeft();
int right=getRight();
int top=getTop();
int boottom=getBottom();
int width=right-left;
int heig=boottom-top;
int height=getHeight();
int wid=getWidth();
float currentHeight;
Log.d("------right-left----->",""+width);
Log.d("------boottom-top----->",""+heig);
Log.d("------getHeight----->",""+height);
Log.d("------getWidth----->",""+wid);
paint=new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLUE);
Rectf=new RectF((float)20,(float)20,(float)200,(float)200);
// canvas.drawCircle(100,100,50,paint);
// canvas.drawArc(Rectf,270,2,false,paint);
// 繪制正方形
// canvas.drawRect(10,10,100,100,paint);
//繪制三角形
Path path=new Path();
path.moveTo(400,400);
path.lineTo(200,700);
path.lineTo(600,700);
// canvas.drawPath(path,paint);
//繪制文字
String text="hello";
paint.setTextSize(50);
// canvas.drawText(text,400,300,paint);
RectF RectF=new RectF(200,200,400,500);
// canvas.drawRoundRect(Rectf,70,78,paint);
//繪制音樂的動(dòng)態(tài)矩形
//設(shè)置漸變的效果
linearGradient=new LinearGradient(
0,//漸變起始x坐標(biāo)
0,//漸變起始y坐標(biāo)
100,//漸變結(jié)束x坐標(biāo)
getHeight(),//漸變結(jié)束y坐標(biāo)
colors,
null,//漸變色數(shù)組
Shader.TileMode.MIRROR);//渲染器平鋪模式
paint1=new Paint();
paint1.setShader(linearGradient);
paint1.setColor(Color.BLUE);
paint1.setStyle(Paint.Style.FILL);
for (int i = 0; i < 10; i++) {
currentHeight= (float) (Math.random()*1000+50);
canvas.drawRect((float) (i * mRectWidth) + offset, //left 距離頂部的像素
currentHeight, //top 距離左邊的像素
(float) ((i + 1) * mRectWidth),//right 距離矩形右邊的像素
height, //bottom 就是矩形距離底部的像素
paint1 //畫筆
);
}
// invalidate();//通知view進(jìn)行重繪
postInvalidateDelayed(500);//設(shè)置view重繪延遲300ms
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// paint1.setShader(linearGradient);
}
}
結(jié)果如圖:
demo.gif