您的位置:首页 > 其它

简单的学习自定义view

2015-12-27 10:47 387 查看
好不容易周末有个双休,周六玩了一天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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: