简单的学习自定义view

来源:互联网 发布:淘宝商城女装新款时尚 编辑:程序博客网 时间:2024/05/16 11:06

好不容易周末有个双休,周六玩了一天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);
}


}
0 0
原创粉丝点击