IT小哥哥

自定义view

使用用自定View可以使View更加灵活,效果更炫,实现的功能也比较多

一、 如何实现自定义View?

  1. 继承一个现有的View,比如Button
  2. 完全自定义View
  3. 组合现有的View

二、

1.继承Button的View

public class MyButton_drawXX extends Button {

//画笔

private Paint paint;

//路径

private Path path;

//图片

private Bitmap bitmap;

//如果直接使用代码创建对象,实现该方法

public MyButton_drawXX(Context context) {

super(context);

init();

}

//布局中使用,实现该方法

public MyButton_drawXX(Context context, AttributeSet set) {

super(context, set);

init();

}

 

public void init() {

paint = new Paint();

// 设置画笔不填充

paint.setStyle(Style.STROKE);

// 抗锯齿, 会消耗资源

paint.setAntiAlias(true);

//画笔颜色

// paint.setColor(Color.RED);

path = new Path();

//创建Bitmap的两种方法

// bitmap = ((BitmapDrawable) this.getResources().getDrawable(

// R.drawable.ic_launcher)).getBitmap();

bitmap = BitmapFactory.decodeResource(this.getResources(),

R.drawable.ic_launcher);

 

}

 

// 直线   矩形   圆    自由路径   文字   图片   弧线

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

// 画直线

canvas.drawLine(0, 0, 100, 200, paint);

 

// 画矩形

canvas.drawRect(50, 200, 100, 100, paint);

// 左上角的坐标是(150,75),右下角的坐标是(260,120)

Rect rect = new Rect(150, 75, 260, 120);

canvas.drawRect(rect, paint);

paint.setColor(Color.RED);

RectF rectF = new RectF(100, 200, 200, 400);

canvas.drawRect(rectF, paint);

// 画内切圆

// canvas.drawOval(rectF, paint);

 

// 自由路径

path.moveTo(120, 120);

path.lineTo(223, 245);

path.lineTo(120, 245);

path.close();

canvas.drawPath(path, paint);

 

// 文字 以字符串的左下为位置的开始计算的

canvas.drawText("这是一串字符串", 300, 250, paint);

 

// 画图1

canvas.drawBitmap(bitmap, 0, 0, paint);

// 画图2

// Rect src: 是对图片进行裁截,若是空null则显示整个图片

// RectF dst:是图片在Canvas画布中显示的区域,

// 大于src则把src的裁截区放大,

// 小于src则把src的裁截区缩小

Rect src = new Rect(0, 24, 48, 48);

RectF dst = new RectF(0, 0, 100, 100);

canvas.drawBitmap(bitmap, src, dst, paint);

 

// 画弧线

canvas.drawArc(rectF, 0, 90, false, paint);

 

}

}

 

2、完全自定义View,是继承View来实现,其他的使用方法与继承现有的View相似

比如Paint、Path、onDraw方法、canvas、构造方法

以下代码实现画图板功能:

public class MyView extends View {

private float x;

private float y;

private Paint paint=new Paint();

private Path path=new Path();

 

public MyView(Context context) {

super(context);

paint.setStyle(Style.STROKE);

}

 

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.drawPath(path, paint);

}

//在View的内部添加事件监听

@Override

public boolean onTouchEvent(MotionEvent event) {

x = event.getX();

y = event.getY();

if (event.getAction() != MotionEvent.ACTION_DOWN) {

path.lineTo(x, y);

}else{

path.moveTo(x, y);

}

//重画

invalidate();

System.out.println(x+"================="+y);

return true;

}

}

3、自定义View--组合现有的View

public class MyRelativeLayout extends RelativeLayout {

//因为在布局文件中使用该对象,选2个参数的构造

public MyRelativeLayout(Context context, AttributeSet attrs) {

super(context, attrs);

//更具命名空间、属性名获取属性值

String value = attrs.getAttributeValue("http://www.baidu.com"," orientation");

System.out.println("-----------------"+value);

if("horizontal".equals(value)){

View.inflate(context, R.layout.my_relative_layout_horizontal, this);

}else if("verticality".equals(value)){

View.inflate(context, R.layout.my_relative_layout_verticality, this);

}else{

throw new RuntimeException("Error..orientation.. ..verticality...horizontal");

}

}

}

 

 

 

posted on 2016-03-29 18:00  IT小哥哥  阅读(180)  评论(0编辑  收藏  举报

导航