好不容易周末有个双休,周六玩了一天LOL,今天学学习,自定义view这块感觉还是运用不好,从基础开始吧。

1、自定义View的引入:Android系统虽然提供了很多的UI控件,但是这些UI控件有可能满足不了项目的需求,所以Android系统提供了一些方式让开发者能够自行绘制一些视图。


2、在自定义View的时候可以继承Android系统已经提供的一些UI控件或者是布局,也可以直接继承所有的UI控件父类 ---> View


3、当我们创建子类的时候,需要根据不同的应用场景添加对应的构造方法,然后还需要重写一些方法,比如用于绘制视图的方法--->onDraw(),


   测量视图的宽高的方法--->onMeasure(),让控件能够响应屏幕事件的方法--->onTouchEvent()


4、在用于创建视图的方法(onDraw())中尽量不要去创建对象,因为该方法是用于绘制UI的,如果大量在该方法中进行对象的创建,会造成UI的绘制的效率降低


5、在使用自定义的视图的时候,有两种方式:


   a、在布局文件中添加
  
         1、布局的标签要写自定义的控件类的完整类路径


         2、在自定义的控件的类中要添加带有AttributeSet参数的构造方法


   b、通过代码创建添加


        1、添加带有context参数的构造


        2、调用构造方法创建自定义控件的对象,然后把该对象作为Activity的界面



MainActivity代码如下:

public class MainActivity extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将自定义view应用到项目中方法一
 // //创建自定义的视图的对象
 // MyView myView = new MyView(this);
 // //把自定义的视图对象作为Activity的界面
 // setContentView(myView);
//方法二 在布局文件中添加自定义view 引用时要用包名.自定义view名
setContentView(R.layout.activity_main);
}以下是自定义的代码:
public class MyView extends View {
 
 

private Paint p; 

 

private RectF rect = new RectF(100, 20, 150, 100);//创建矩形区域 

 

private RectF rect2 = new RectF(100, 250, 200, 300);//创建椭圆的区域 



     //只带有一个context参数的构造方法,仅仅适用于采用代码创建的方式添加 

public MyView(Context context) { 

super(context); 

//初始化画笔 

initPaint(); 

} 



 // 
 public MyView(Context context, AttributeSet attrs, int defStyleAttr) { 

 // 
 super(context, attrs, defStyleAttr); 

 // 
 // TODO Auto-generated constructor stub 

 // 
 } 



//如果需要在布局文件添加自定义的视图,则需要在自定义的控件中添加该构造方法 

public MyView(Context context, AttributeSet attrs) { 

super(context, attrs); 

//参数二:接收在布局文件指定的自定义视图的属性 

 

//初始化画笔 

initPaint(); 

} 

 

//初始化画笔 

private void initPaint(){ 

p = new Paint(); 

p.setColor(Color.CYAN);//设置画笔颜色 

p.setStrokeWidth(2);//设置画笔的粗细 

p.setTextSize(40);//设置文字大小 

p.setStyle(Style.STROKE);//设置画笔风格  (填充: Style.FILL       描边:Style.STROKE) 

p.setAntiAlias(true);//设置画笔抗锯齿 

} 

 

     //当系统显示该控件的时候,系统会调用该方法实现对于控件视图内容的绘制 

@Override 

protected void onDraw(Canvas canvas) { 

super.onDraw(canvas); 

//参数:用于绘制视图内容的画布 

Log.v("TAG", "onDraw ---> 系统开始绘制自定义视图的内容"); 

 

//编写自定义视图的内容 

 

//参数一:圆心x坐标   参数二:圆心y坐标    参数三:圆的半径 

canvas.drawCircle(100, 100, 40, p);//画圆 

 

//参数依次:透明度  红  绿  蓝       每一个字段的取值范围都是(0 - 255) 

 // 
 canvas.drawARGB(255, 128, 200, 100);//画颜色 

 

//参数一:扇形的区域    参数二:扇形的开始角度    参数三:扇形扫过的角度     参数四:指定绘制扇形的时候是否连接中心点 

//和x轴平行的线是0度线       顺时针旋转度数是正的       逆时针旋转度数是负的 

canvas.drawArc(rect, 0, -270, true, p);//在矩形区域内绘制弧度 

 

//参数一:矩形(RectF表示[边界线可以用小数表示]      Rect表示[边界线只能够用整数表示]) 

canvas.drawRect(rect, p);//绘制矩形 

 

 // 
 canvas.drawRect(left, top, right, bottom, paint) 

 

//参数一:被绘制的图片 

//参数二:被绘制的图片距离屏幕左边界的距离 

//参数三:被绘制的图片距离屏幕顶部的距离 

canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher), 160, 250, p);//绘制图片 

 

//参数一和二:线的起点的x坐标  y坐标 

//参数三和四:线的终点的x坐标  y坐标 

canvas.drawLine(200, 160, 220, 260, p);//画线 

//参数一:多条线的起点和终点坐标[数组的长度要是4的整数倍] 

canvas.drawLines(new float[]{210,20,150,60,150,60,200,40}, p);//绘制多条线 

 

//参数一:椭圆的绘制区域 

canvas.drawOval(rect2, p);//绘制椭圆 

 

//参数一和二:被绘制的点的x坐标和y坐标 

canvas.drawPoint(180, 180, p);//绘制点 

 

//参数一:被绘制的内容 

//参数二和三:一个点的x和y坐标。文字绘制的基准点,以该基准点向y轴做垂线,这个线构成文字的基准线 

canvas.drawText("绘制的文本内容", 20, 40, p);//绘制文本 

 

//绘制文本的基准线 

canvas.drawLine(20, 40, 300, 40, p); 

} 



 }